02. jdbc 数据库连接管理

it2022-05-05  153

jdbc 系列文章列表, 请查看目录: 《jdbc学习笔记》

数据库连接, 是java 与数据库进行数据传输的桥梁, 是jdbc 的基础. 但是通常在企业开发中, 我们并不会直接解除到数据库连接, 那是因为通常我们会采用数据源来统一管理数据库连接.

1. 引入数据库驱驱动

连接数据库, 首先就是需要加载数据库对应的驱动程序. 笔者采用mysql 数据库, 因此需要加载mysql 的数据库驱动程序.

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency>

2. 创建数据库连接

创建数据库连接的方式有很多, 在企业开发中, 通常会使用数据源管理工具(c3p0, dbcp, druid等). 但是jdbc 创建连接是基础.

2.1 通过Dirver 直接创建

通过创建Driver 实例直接获取数据库连接, 是最不建议使用的一种方式. 因为会与数据库驱动进行强耦合, 强耦合主要体现在代码中有new com.mysql.jdbc.Driver()代码.

public void test_driver() throws SQLException { // 连接参数: 驱动连接url, 用户名, 密码 String jdbcUrl = "jdbc:mysql://localhost:3306/learn-jdbc?characterEncoding=UTF-8"; // 设置数据库基本信息 Properties info = new Properties(); info.setProperty("user", "root"); info.setProperty("password", "root"); // 1. 创建驱动 Driver driver = new com.mysql.jdbc.Driver(); // 2. 获取连接 Connection connection = driver.connect(jdbcUrl, info); Assert.assertNotNull(connection); // 3. 关闭连接 connection.close(); }

2.2 通过DriverManager 创建

通过DriverManager 获取数据库连接是一种常见的方式, 可实现与数据库驱动解耦. 具体体现在, 不引入数据库驱动包, 该代码也不会出现编译错误.若应用加载了多种数据库驱动程序, 那么DriverManager 可根据传入的url 自行判断应该使用哪种数据库驱动程序创建连接.Driver实现类的静态代码块儿中会调用DriverManager的registerDriver()方法向应用注册驱动程序. public void test_driverManager() throws ClassNotFoundException, SQLException { // 连接参数: 驱动类名称, jdbc连接url, 用户名, 密码 String driverClass = "com.mysql.jdbc.Driver"; String jdbcurl= "jdbc:mysql://localhost:3306/learn-jdbc?characterEncoding=UTF-8"; String user = "root"; String password = "root"; // 1. 加载驱动. Driver 实现类中有静态代码块儿注册实例 Class.forName(driverClass); // 2. 获取连接 Connection connection = DriverManager.getConnection(jdbcurl, user, password); Assert.assertNotNull(connection); // 3. 关闭连接 connection.close(); }

2. 数据库连接工具类

由于每一个数据库操作, 都需要创建数据库连接和关闭数据库连接, 过程比较繁琐. 因此, 笔者开发一个工具类, 用于便捷的获取数据库连接, 和关闭数据库连接.笔者将数据库的连接信息抽离为jdbc-xx.properties配置文件, 更深层次的解耦. 由于笔者可能会在mysql和oracle之间穿插测试, 因此命名为jdbc-xx.properties

2.1 工具类源码

笔者根据数据库事务的隔离性和是否自动提交事务两个属性, 来设计自己的工具API. API 列表:

getConnection(): 获取数据库连接, 自动提交事务, 默认隔离级别getConnection(boolean): 返回数据库连接, 手动自定是否开启自动提交事务, 使用默认隔离级别getConnection(int): 返回数据库连接, 关闭自动提交事务功能, 手动指定隔离级别.release(Closeable…): 依次关闭一到多个数据库资源(如:ResultSet, Statment, Connection等), 内吞异常. public class DbConnUtil { // 配置文件名 private static final String JDBC_CONFIG_FILE_NAME = "jdbc-mysql"; // 连接参数: 驱动类名称, jdbc连接url, 用户名, 密码 private static final String DRIVER_CLASS; private static final String JDBCURL; private static final String USERNAME; private static final String PASSWORD; static { // 加载配置文件 ResourceBundle resourceBundle = ResourceBundle.getBundle(JDBC_CONFIG_FILE_NAME); // 初始化信息 DRIVER_CLASS = resourceBundle.getString("jdbc.driver"); JDBCURL = resourceBundle.getString("jdbc.url"); USERNAME = resourceBundle.getString("jdbc.username"); PASSWORD = resourceBundle.getString("jdbc.password"); try { // 加载驱动 Class.forName(DRIVER_CLASS); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * @Description: 获取数据库连接 * @return: 数据库连接, 使用默认隔离脊背, 且自动提交事务 * @since 1.0 * @author: zongf * @time: 2019-06-26 10:18:23 */ public static Connection getConnection() { return getConnection(true, null); } /** 获取数据库连接, 指定是否自动提交事务. * @param autoCommitTx 是否自动提交事务 * @return 数据库连接, 指定了是否自动提交事务 * @since 1.0 * @author zongf * @created 2019-07-05 */ public static Connection getConnection(boolean autoCommitTx) { return getConnection(autoCommitTx, null); } /**获取数据库连接, 指定事务隔离级别. * @param isolation 事务隔离级别, 可选值[0,1,2,4,8], 建议通过Connection.TRANSACTION_xxx常量赋值 * @return 指定隔离级别, 且关闭事务自动提交功能的数据库连接. * @since 1.0 * @author zongf * @created 2019-07-05 */ public static Connection getConnection(Integer isolation) { return getConnection(false, null); } /** * @Description: 获取数据库连接 * @param autoCommitTx 是否自动提交事务 * @param isolation 设置事务隔离级别 * @return: Connection * @since 1.0 * @author: zongf * @time: 2019-06-26 10:17:56 */ private static Connection getConnection(boolean autoCommitTx, Integer isolation) { try { // 1. 获取数据库连接 Connection connection = DriverManager.getConnection(JDBCURL, USERNAME, PASSWORD); // 2. 设置是否开启自动提交事务 connection.setAutoCommit(autoCommitTx); // 3. 设置事务隔离级别 if(isolation != null && (isolation == Connection.TRANSACTION_NONE || isolation == Connection.TRANSACTION_READ_UNCOMMITTED || isolation == Connection.TRANSACTION_READ_COMMITTED || isolation == Connection.TRANSACTION_REPEATABLE_READ || isolation == Connection.TRANSACTION_SERIALIZABLE)){ connection.setTransactionIsolation(isolation); } return connection; } catch (SQLException e) { e.printStackTrace(); } return null; } /** * @Description: 关闭资源 * @param closeables 可关闭的资源, 如Connection, Statment, ResultSet 等 * @author: zongf * @time: 2019-06-25 14:54:14 */ public static void release(AutoCloseable... closeables) { for (AutoCloseable closeable : closeables) { if (closeable != null) { try { closeable.close(); } catch (Exception e) { e.printStackTrace(); } } } } }

2.2 配置文件

配置文件: /src/main/resources/jdbc-mysql.properties

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/learn-mybatis3?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false jdbc.username=root jdbc.password=root

2.3 工具类测试

public void test() throws SQLException{ // 获取数据库连接 Connection connection = DbConnUtil.getConnection(); Assert.assertNotNull(connection); Assert.assertEquals(false, connection.isClosed()); // 关闭数据库连接 connection.close(); Assert.assertEquals(true, connection.isClosed()); }

最新回复(0)