JDBC и пул подключений к базе данных — два класса инструментов — JDBCUtilsByDruid и BasicDAO
Это обзорная статья.
Каталог статей
1. Обзор методов обучения
1.1. Введение jdbc
Что касается изучения взаимодействия с MySQL, то в начале было введено изучение интерфейса JDBC . Импортированный пакет jar: mysql-connector-java-5.1.37-bin.jar
.
Идея написания jdbc заключается в следующем:
- Зарегистрировать водителя
Driver driver=new Driver();
- Установите соединение [ Здесь есть пять методов, рекомендуется пятый метод, а именно: ]
String url="jdbc:mysql://localhost:3306/hsp_db02";
Properties properties = new Properties();
//说明 user 和 password 是规定好,后面的值根据实际情况写
properties.setProperty("user", "root");// 用户
properties.setProperty("password", "123456"); //密码
Connection connect=driver.connect(url,properties);
- Отправляйте инструкции sql и выполняйте запросы на добавление, удаление и изменение [ оператор будет введен SQL, рекомендуется использовать предварительную обработку ReadedStatement ]
String sql = "delete from actor where id = 1";
//statement 用于执行静态 SQL 语句并返回其生成的结果的对象
Statement statement = connect.createStatement();//这种方法容易被SQL注入
int rows = statement.executeUpdate(sql); // 如果是 dml 语句,返回的就是影响行数
System.out.println(rows > 0 ? "成功" : "失败");
- Отключить.
statement.close();
connect.close();
Пятый способ получить соединение — записать информацию о конфигурации базы данных в файл свойств, а затем прочитать файл конфигурации через поток FileInpuStream:
Properties properties = new Properties();
properties.load(new FileInputStream("src\\jdbc.properties"));//读取配置文件
String url= properties.getProperty("url");
String username= properties.getProperty("username");
String password= properties.getProperty("password");
Connection conn = DriverManager.getConnection(url, username, password);//通过DriverManager获取连接
1.2.ResultSet[набор результатов]
Во введении 1.1jdbc показаны функции вставки, удаления и изменения , поскольку эти три функции называются операциями dml.Операция dml возвращает количество обработанных строк.Если нам нужно запросить несколько строк записей или записей таблицы , затем необходимо использовать ResultSet [набор результатов] .
Здесь мы представляем: ResultSet[набор результатов]
@Test
public void zuoye01() throws ClassNotFoundException, IOException, SQLException {
Class.forName("com.mysql.jdbc.Driver");//可写可不写,自动注册驱动类
//读取配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("src\\jdbc.properties"));
//获取连接
String url= properties.getProperty("url");
String username= properties.getProperty("username");
String password = properties.getProperty("password");
Connection coon = DriverManager.getConnection(url, username, password);//这里面已经完成了注册Driver驱动类了,所以第一句可写可不写
//sql
String sql="select * from news";
PreparedStatement preparedStatement = coon.prepareStatement(sql);//这里不用statement了,使用PreparedStatement预处理**
ResultSet resultSet = preparedStatement.executeQuery();//返回**ResultSet[结果集]**
//【!】下面这个返回集操作太麻烦了,后面通过Apache公司的DBUtils工具进行封装,可以看目录
while (resultSet.next()){
int id = resultSet.getInt("id");
String content = resultSet.getString("content");
System.out.println(id+"\t"+content);
}
//关闭连接
preparedStatement.close();
coon.close();
}
1.3 Сводка API
2. Пул соединений с базой данных
Традиционная технология jdbc имеет следующие проблемы при подключении к базе данных:
Пул соединений с базой данных, который мы выбираем, — это пул соединений с базой данных Druid , и вводится jar: druid-1.2.8.jar
.
Целью использования этого пула соединений с базой данных Druid является получение соединения с базой данных. Следующий класс инструментов JDBCUtils на основе Druid решает эту проблему.
private static DataSource ds;
//在静态代码块完成 ds 初始化
static {
Properties properties = new Properties();
try {
properties.load(new FileInputStream("src\\druid.properties"));
ds = DruidDataSourceFactory.createDataSource(properties);//通过工厂获取数据库连接池对象
} catch (Exception e) {
e.printStackTrace();
}
}
//编写 getConnection 方法
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
connection = JDBCUtilsByDruid.getConnection();//获取数据库连接的方法变简单了,效率高了。
3. Инструмент Apache DBUtils — BasicDAO [Важно! 】
Этот инструмент предназначен для решения проблемы инкапсуляции ResultSet [набор результатов] и инкапсуляции jdbc . Этот инструмент представляет собой комбинацию DBUtils + пула подключений к базе данных (Druid) .
Класс инструмента apache-DBUtils + друид:
БазисДАО.java:
package com.linghu.dao;
import com.linghu.utils.JDBCUtilsByDruid;
import jdk.nashorn.internal.scripts.JD;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/**
* @author 令狐荣豪
* @version 1.0
*/
public class BasicDAO<T> {
private QueryRunner qr=new QueryRunner();
/**
* 修改-表-记录的操作。
* @param sql
* @param parameters
* @return
*/
public int update(String sql,Object... parameters){
Connection connection=null;
try {
connection= JDBCUtilsByDruid.getConnection();
int update = qr.update(connection, sql, parameters);
return update;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(null,null,connection);
}
}
/**
*查询多行多列的操作,返回多行
* @param sql
* @param clazz 传入一个类的Class对象,比如Actor.class[反射机制]
* @param parameters
* @return 根据Actor.class返回对应的ArrayList集合
*/
public List<T> queryMulti(String sql,Class<T> clazz,Object... parameters){
Connection connection=null;
try {
connection=JDBCUtilsByDruid.getConnection();
return qr.query(connection,sql,new BeanListHandler<T>(clazz),parameters);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(null,null,connection);
}
}
/**
* 查询单行多列的操作,返回单行多列
* @param sql
* @param clazz
* @param parameters
* @return
*/
public T querySingle(String sql,Class<T> clazz,Object...parameters){
Connection connection=null;
try {
connection= JDBCUtilsByDruid.getConnection();
return qr.query(connection,sql,new BeanHandler<T>(clazz),parameters);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(null,null,connection);
}
}
/**
* 查询单行单列,返回单行单列,返回单值的方法
* @param sql
* @param parameters
* @return 返回单值
*/
public Object queryScalar(String sql,Object... parameters){
Connection connection=null;
try {
connection= JDBCUtilsByDruid.getConnection();
Object query = qr.query(connection, sql, new ScalarHandler(), parameters);
return query;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(null,null,connection);
}
}
}
4. Класс инструментов JDBCUtils на основе Druid — **JDBCUtilsByDruid [Важно! 】
Этот класс инструментов инкапсулирует установление и освобождение соединений в jdbc . Этот класс инструментов позволяет нам более легко получить объект подключения Connect .
друид.свойства:
driverClassName=com.mysql.jdbc.Driver
#URL??????URL???travel????????????????????????????
url=jdbc:mysql://localhost:3306/mhl?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
characterEncoding=utf-8
#??mysql??????????
username=root
password=123456
#??????????
initialSize=5
#???????
maxActive=10
#???????????
maxWait=3000
#???????????sql
validationQuery=SELECT 1
#??????
testWhileIdle=true
JDBCUtilsByDruid.java:
package com.linghu.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @Package: com.linghu.utils
* @ClassName: JDBCUtilsByDruid
* @Author: linghu
* @CreateTime: 2023/3/30 16:27
* @Description: 基于Druid(德鲁伊)的 JDBCUtils 工具类
*/
public class JDBCUtilsByDruid {
private static DataSource dataSource;
static {
Properties properties = new Properties();
try {
properties.load(new FileInputStream("src\\jdbc.properties"));
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//方法1:获取德鲁伊连接池的“连接”的getConnection 方法
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//方法2:断开与德鲁伊连接池的"连接"
public static void close(ResultSet resultSet, Statement statement,Connection connection){
try {
if(resultSet != null){
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}