В этой статье описаны базовые знания и навыки JDBC с примерами. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
1. Что такое JDBC?
С точки зрения непрофессионала, технология JDBC использует программу Java для отправки операторов SQL в базу данных. База данных выполняет операторы SQL после их получения и возвращает результаты программе Java для управления.
2. Каковы условия использования JDBC?
А) Адрес хоста целевой базы данных
Б) Номер порта, занимаемый программным обеспечением базы данных на хосте.
В) Имя пользователя, используемое для входа в базу данных.
D) Пароль для этого имени пользователя
Д) Подключиться к базе данных
3.Принципы технологии JDBC
Мы знаем, что существуют различные типы баз данных, а стандарты и спецификации баз данных, выпускаемые разными производителями, различаются. В настоящее время, если мы используем код JAVA для отправки операторов SQL, нам приходится писать один набор за другим в соответствии с разными базами данных. Набор кодов операций, что требует огромных затрат на разработку для разработчиков программ, поэтому SU Когда компания N разрабатывала технологию JDBC, она предусматривала набор стандартных интерфейсов. Производители баз данных должны предоставить драйвер для реализации этого набора интерфейсов. Затем, пока разработчики программ используют драйвер базы данных во время разработки, они должны использовать согласованный метод. Для разработки нет необходимости писать набор кодов для адаптации к разным базам данных.
4. Базовый API в JDBC
|- Драйвер: интерфейс, реализованный классом драйвера.
|-Connection Connect (URL-адрес строки, информация о свойствах) — используется для подключения к базе данных и получения объекта подключения.
Параметры, которые необходимо задать в Свойствах:
url: строка URL-адреса подключения к базе данных. Протокол+подпротокол базы данных+хост+порт+база данных
пользователь: имя пользователя базы данных
пароль: пароль пользователя
|-Соединение: интерфейс для подключения к базе данных
|- Statement createStatement() --Создать объект Statement для отправки операторов sql.
|-PreparedStatement подготовитьStatement(String sql) — Создает объект ReadedStatement для отправки предварительно скомпилированных операторов sql.
|-CallableStatement подготовитьCall(String sql) --Создать объект CallableStatement для вызова хранимых процедур.
|-Statement: используется для выполнения статических операторов sql.
|-int ExecuteUpdate(String sql) --Выполнить операцию обновления (DDL+DML)
|-ResultSet выполнитьQuery(String sql) --Выполнить операцию запроса (DQL)
|- ReadedStatement: используется для выполнения предварительно скомпилированных операторов sql.
|- int ExecuteUpdate() — выполнить операцию обновления
|- ResultSet выполнитьQuery() -- Выполнить операцию запроса
|- CallableStatement: sql, используемый для выполнения хранимых процедур.
|- ResultSet ExecuteQuery() --Вызов хранимой процедуры
|- ResultSet: набор результатов. Используется для инкапсуляции данных запроса базы данных.
|- boolean next() --переместить курсор записи на следующую строку
|- Object getObject(int columnsIndex) -- Получить значение поля
Поняв, какие API, давайте использовать JDBC для отправки операторов SQL~
5. Используйте объект Statement для управления базой данных.
Операции DDL и DML
Шаг 1
Импортируйте пакет, поскольку я использую базу данных MySQL, поэтому для использования технологии JDBC необходимо использовать драйвер базы данных, предоставленный производителем базы данных MySQL. Поэтому первым шагом является импорт пакета драйвера базы данных в проект.
Используемое имя пакета: mysql-connector-java-5.1.7-bin.jar.
Шаг 2
Создайте обычный класс, добавьте в него метод и скопируйте код в метод следующим образом: //URL
частная строка URL = "jdbc:mysql://localhost:3306/vmaxtam";
//пользователь
частный строковый пользователь = «корень»;
//пароль
частный строковый пароль = «root»;
public void testDDL() выдает исключение {
//1.Регистрируем драйвер
Class.forName("com.mysql.jdbc.Driver");
//2. Получить соединение
Connection conn = DriverManager.getConnection(url, пользователь, пароль);
//3. Создать объект заявления.
Заявление stmt = conn.createStatement();
//4. Подготовьте оператор sql.
String sql = "CREATE TABLE Student(sid INT PRIMARY KEY,sname VARCHAR(20),age INT)";
//5. Отправляем оператор sql через объект оператора и возвращаем результат выполнения.
int count = stmt.executeUpdate(sql);
//6.Распечатка результатов выполнения
System.out.println("Затронутых записей "+count+"");
}
//7. Закрыть ресурсы.
если (оператор! = ноль)
{
заявление.закрыть();
}
если (подключение! = ноль)
{
конн.закрыть();
}
Если вы хотите выполнить операции DQL и DDL, вы можете написать инструкцию SQL, а затем вызвать метод executlUpdate инструкции для выполнения инструкции SQL для базы данных. Этот метод возвращает целочисленное значение, указывающее, сколько строк в базе данных затронуто.
Если мы не изменим вышеуказанную программу и захотим снова выполнить SQL-операторы для базы данных, то нам придется снова написать программу для подключения, и после операции нам придется закрыть объект оператора и объект подключения, что очень громоздко. . Поэтому мы обычно выделяем процесс подключения и процесс освобождения объекта в класс инструмента. Код в классе инструмента выглядит следующим образом:
Скопируйте код следующим образом: public class sqlUtil {
частная статическая строка URL = "jdbc:mysql://localhost:3306/vmaxtam";
частный статический пользователь String = «root»;
частный статический строковый пароль = «root»;
// Получаем соединение
публичное статическое соединение getconnection () {
Соединение конн = ноль;
пытаться {
// 1. Зарегистрировать драйвер
Class.forName("com.mysql.jdbc.Driver");
// 2. Получить соединение
conn = DriverManager.getConnection(url, пользователь, пароль);
// 3. Получить объект оператора
Оператор оператора = conn.createStatement();
} catch (Исключение е) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
возврат соединения;
}
// 7. Закрываем ресурс
public static void close (оператор, соединение соединения) {
{
пытаться {
если (оператор != ноль)
заявление.закрыть();
если (соединение! = ноль) {
соединение.закрыть();
}
} catch (SQLException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
}
}
Следует учитывать следующее:
1) Пользователю достаточно зарегистрировать драйвер только один раз. Нет необходимости регистрировать драйвер каждый раз при подключении к базе данных, поэтому запишем процесс регистрации драйвера в статическом блоке кода.
2) URL, имя пользователя, пароль и имя класса драйвера жестко запрограммированы в программе. Чтобы иметь возможность изменить базу данных или пользователя без изменения кода, мы обычно записываем эту информацию в файл конфигурации.
Файл конфигурации записывается в каталоге src проекта и называется db.properties.
Скопируйте код следующим образом: url=jdbc:mysql://localhost:3306/vmaxtam.
пользователь = корень
пароль=корень
driverClass=com.mysql.jdbc.Drive
Затем прочитайте файл конфигурации в sqlUtil и, наконец, оптимизируйте его в следующий код. Скопируйте код следующим образом: public class sqlUtil {.
частный статический URL-адрес строки = null;
частный статический пользователь String = null;
частный статический строковый пароль = ноль;
частная статическая строка driverClass = null;
статический {
пытаться {
//1. Получите объект байт-кода.
Classclazz = sqlUtil.class;
//2. Вызовите getResourceAsStream, чтобы получить путь.
InputStream inputStream = clazz.getResourceAsStream("/db.properties");
Свойства про = новые свойства();
pro.load(inputStream);
//3. Чтение параметров.
url=pro.getProperty("url");
пароль = pro.getProperty("пароль");
пользователь = pro.getProperty("пользователь");
driverClass=pro.getProperty("driverClass");
Class.forName(driverClass);
} catch (Исключение е) {
е.printStackTrace();
System.out.println("Регистрация не удалась!" + e.getMessage());
выдать новое RuntimeException(e);
}
}
// Получить соединение
общедоступное статическое соединение getconnection () {
Соединение конн = ноль;
пытаться {
// Получаем соединение
conn = DriverManager.getConnection(url, пользователь, пароль);
// Получаем объект оператора
Оператор оператора = conn.createStatement();
} catch (Исключение е) {
е.printStackTrace();
}
возвратный конн.;
}
// Закрываем ресурс
public static void close (оператор, соединение соединения) {
{
пытаться {
если (оператор != ноль)
заявление.закрыть();
если (соединение! = ноль) {
соединение.закрыть();
}
} catch (SQLException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
}
}
DQL-операция
Итак, как использовать JDBC для запроса данных в базе данных?
Скопируйте код кода следующим образом: @Test
public void testdsl() выдает исключение {
//Получаем соединение
cnn2=sqlUtil.getconnection();
Оператор оператора = cnn2.createStatement();
//Подготавливаем оператор SQL
String sql = "выбрать * из темы";
//Вызов метода выполненияQuery для выполнения оператора запроса
ResultSet res = оператор.executeQuery(sql);
//После завершения запроса res будет указывать на заголовок таблицы. Если вы хотите получить данные, вы должны продолжать указывать на следующую строку результата запроса. Если следующей строки данных нет, возвращается 0.
в то время как (res.next())
{
//Получить значение поля «sjid» в результате запроса и убедиться, что тип ясен
int id = res.getInt("sjid");
//Получаем значение поля "sjname" в результате запроса, тип должен быть ясен
Имя строки = res.getString("sjname");
System.out.println("ID:" + id + "NAME:" + name);
}
sqlUtil.close(оператор, cnn2);
}
Выше описано использование объектов Statement для управления базой данных~
6. Используйте ReadedStatement для управления базой данных.
Объект ReadedStatement на самом деле является специальным объектом Statement, который может предварительно компилировать операторы SQL. Когда вы устанавливаете параметры, вы можете затем выполнить оператор SQL~.
Код копирования операций DDL и DML выглядит следующим образом: package com.vmaxtam.sqltest;
импортировать java.sql.Connection;
импортировать java.sql.PreparedStatement;
импортировать org.junit.Test;
общественный класс ReadedStatementTest {
Соединение соединение = ноль;
@Тест
public void ddldmlTest() выдает исключение {
// 1. Получить соединение
соединение = sqlUtil.getconnection();
// 2. Подготовить операторы SQL, предварительно скомпилированные операторы и параметры? Заполнитель номера
String sql = "ВСТАВИТЬ В ПРЕДМЕТНЫЕ ЗНАЧЕНИЯ(?,?)";
// 3. Получить объект
ReadedStatement подготовленныйStatement = Connection.prepareStatement(sql);
/*
* 4. Чтобы установить параметры SQL, вам необходимо знать номер параметра и знать его тип. Первое предложение ниже указывает: первый параметр оператора SQL имеет тип int, а значение параметра установлено равным 3, и так. на.
*/
подготовленныйStatement.setInt(1, 3);
подготовленныйStatement.setString(2, «Английский»);
// 5. Передача в базу данных для выполнения SQL
int num = подготовленныйStatement.executeUpdate();
System.out.println("Есть" + количество + "затронутые записи");
sqlUtil.close(preparedStatement, соединение);
}
}
Вышеупомянутое предназначено для использования объекта ReadedStatement для отправки операторов вставки. Таким же образом можно отправлять операторы DDL и DML.
Преимущества предварительной компиляции ReadedStatement:
Предварительная компиляция ReadedStatement позволяет вам запрашивать разные цели, устанавливая разные параметры. На стороне базы данных будет сохранен только предварительно скомпилированный оператор, но если вы используете Statement для отправки запроса, каждый раз, когда он отправляется, он будет сохранен в файле. база данных, которая может занимать много памяти.
Код копирования кода операции DQL следующий: @Test
public void dqlTest() выдает исключение {
// 1. Получить соединение
соединение = sqlUtil.getconnection();
// 2. Подготовить операторы SQL, предварительно скомпилированные операторы и параметры? Заполнитель номера
String sql = "выберите * из темы, где sjid=? или sjname=?";
// 3. Получить объект
ReadedStatement подготовленныйStatement = Connection.prepareStatement(sql);
/*
* 4. Чтобы установить параметры SQL, вам необходимо знать номер параметра и знать его тип. Первое предложение ниже указывает: первый параметр оператора SQL имеет тип int, а значение параметра установлено равным 3, и так. на.
*/
подготовленныйStatement.setInt(1, 2);
подготовленныйStatement.setString(2, "Китайский");
// 5. Передача в базу данных для выполнения SQL
ResultSet первый = подготовленныйStatement.executeQuery();
//6.Итерируем набор результатов
в то время как (первый.следующий())
{
int id = rst.getInt("sjid");
Имя строки = rst.getString("sjname");
System.out.println("ID:" + id + "NAME:" + name);
}
//7. Закрываем соединение.
sqlUtil.close(preparedStatement, соединение);
}
Вы также можете вызвать метод ExecuteQuery() и выполнить итерацию вывода после получения набора результатов~
Поскольку Statement и ReadedStatement очень похожи, давайте сравним их преимущества и недостатки~
Разница между Statement и ReadedStatement:
1. Другая грамматика
Оператор поддерживает только статическую компиляцию, а операторы SQL жестко запрограммированы.
ReadedStatement поддерживает предварительную компиляцию, использовать? Приходите и садитесь.
2. Различная эффективность
Оператор каждый раз отправляет оператор SQL, не поддерживает кэширование и имеет низкую эффективность выполнения.
ReadedStatement поддерживает предварительную компиляцию и кэшируется в базе данных. Ему нужно только отправить параметры, и эффективность выполнения высокая.
3. Различная безопасность
Оператор легко вводится.
Внедрение: хитрые элементы могут писать специальные операторы SQL для компрометации базы данных.
Например: Чтобы запросить информацию определенного пользователя
Общая ситуация: SELECT * FROM user_list, где имя пользователя=xxx и пароль=xxx; (здесь xxx следует указать собственное имя пользователя и пароль)
Ситуация с внедрением: SELECT * FROM user_list, где username='abc' или 1=1 -- пароль=xxx;
Таким образом, 1=1 равно, и перед паролем добавляется знак «--», а последующее содержимое становится комментарием и не будет выполнено. Другими словами, всю информацию о пользователе можно запросить без паролей.
Подготовленный оператор, поскольку он определяет параметры в инструкции SQL, может предотвратить внедрение.
Вывод: рекомендуется использовать ReadedStatement, так как это быстрее и безопаснее .
7. Используйте CallableStatement для выполнения хранимых процедур.
Использование CallableStatement выполняет только хранимые процедуры. Чтобы создать хранимые процедуры, нам все равно придется создать их в базе данных.
Шаг 1
Теперь база данных создала хранимую процедуру:
Скопируйте код кода следующим образом: DELIMITER $
CREATE PROCEDURE pro_add(IN a INT, IN b VARCHAR(20),OUT c INT)
НАЧИНАТЬ
ВЫБЕРИТЕ * ИЗ ТЕМЫ ГДЕ sjid=a ИЛИ sjname=b;
SET c=a+a+a+a;
КОНЕЦ $
Шаг 2
Используйте код Java для выполнения и получения выходных параметров. Скопируйте код следующим образом: @Test.
public void CalaST() выдает исключение {
//Получаем соединение
соединение = sqlUtil.getconnection();
//Подготавливаем оператор SQL
String sql = "CALL pro_add(?,?,?)";
//Получаем объект callableStatement
CallableStatement cbs = Connection.prepareCall(sql);
//Устанавливаем входные параметры, такие же, как подготовленный оператор
cbs.setInt(1, 3);
cbs.setString(2, «Математика»);
/*Так как же установить выходные параметры?
* Необходимо прописать выходные параметры!
*/
cbs.registerOutParameter(3, java.sql.Types.INTEGER);//Для установки типов параметров необходимо использовать встроенные объекты
//Выполняем оператор SQL
cbs.executeQuery();
//Используем метод getXXX для получения выходных параметров соответствующей позиции
Целое число = cbs.getInt(3);
System.out.println("a*4 равно " + num);
//Закрываем ресурс
sqlUtil.close(cbs, соединение);
}
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.