小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
我们前面有写JDBC的工具类 那么数据库连接池能抽象出工具类吗???
当然是可以的!!!
步骤
1.定义一个类JDBCUtils
2.提供静态代码块加载配置文件,初始化连接池对象
3.提供方法
1.获取连接方法:通过数据库连接池获取
2.释放资源
3.获取连接池的方法
实例
详细的注释都写在代码中了!
package com.caq.datasource.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* Druid连接池工具类
*/
public class JDBCUtils {
//1.定义成员变量 DataSource
private static DataSource ds;
static {
try {
//1.加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 释放资源
*/
//第一种情况,执行DML语句,需要释放connection数据库连接对象和statementsql语句执行对象
public static void close(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close(); //归还连接,不在是释放了
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//第二种情况,执行DQL语句,释放三个资源,conn,stmt和resultSet结果集对象
//这里写一个方法重载即可
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close(); //归还连接,不在是释放了
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/**
* 获取连接池的方法
*/
public static DataSource getDataSource(){
return ds;
}
}
测试
package com.caq.datasource.druid;
import com.caq.datasource.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 使用新的工具类
*/
public class DruidDemo02 {
public static void main(String[] args) {
/*
完成添加的操作 给account表添加一条记录
*/
Connection conn = null;
PreparedStatement pstmt = null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//2.定义sql
String sql = "insert into account values(null,?,?)";
//3.获取pstmt对象
pstmt = conn.prepareStatement(sql);
//4.给sql赋值
pstmt.setString(1, "王五");//给第一个参数赋值为王五
pstmt.setDouble(2, 3000);//给第二个参数赋值为3000
//5.执行sql
int count = pstmt.executeUpdate();
System.out.println(count);
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(pstmt,conn);
}
}
}
输出结果为
十月 21, 2021 8:40:18 下午 com.alibaba.druid.pool.DruidAbstractDataSource error
严重: maxIdle is deprecated
十月 21, 2021 8:40:19 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
1
查看数据库
人直接傻掉,太强了,太好用了啊!!!!
比原生的使用JDBC方便很多啊!
小总结
通过这种把通用的部分抽象出来这种想法,要不断的锻炼 不管是以后我们写代码还是做事能很节省效率呢!!! 抽象的思维!!!
如果没想明白其实可以想象前面学的封装的概念,将大的项目封装成一个一个小的项目,互不影响,需要的时候直接调用即可!