JDBC连接池与DBUtils工具类
程序员文章站
2022-05-24 12:31:00
...
连接池
实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池
概念
用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
规范
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
常见的连接池:DBCP、C3P0。
C3P0
导入的jar包
根目录配置文件c3p0-config.xml
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/teach</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
<user-overrides user="test-user">
<property name="maxPoolSize">10</property>
<property name="minPoolSize">1</property>
<property name="maxStatements">0</property>
</user-overrides>
</default-config>
<!-- 命名的配置 -->
<named-config name="test">
<!-- 连接数据库的4项基本参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/db</property>
<property name="user">root</property>
<property name="password">1234</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<!-- 初始化连接数 -->
<property name="initialPoolSize">20</property>
<!-- 最小连接受 -->
<property name="minPoolSize">10</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">40</property>
<!-- -JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量 -->
<property name="maxStatements">0</property>
<!-- 连接池内单个连接所拥有的最大缓存statements数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
获取连接
public void c3p0DataSource() throws SQLException {
//1.获取c3p0连接池核心类对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//2.设置c3p0的配置文件,放在源代码的根目录(src)
//实例化的时候不指定参数使用默认配置,如果指定参数,使用名称为参数的配置
//默认使用源代码目录下的配置文件
//3.获取连接
Connection conn = dataSource.getConnection();
//下面使用连接进行数据库操作
}
DBCP
导入的jar包
配置文件dbcp-config.properties
#基本配置内容
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/teach
username=root
password=123456
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode=true;characterEncoding=UTF-8
defaultAutoCommit=true
defaultReadOnly=NONE
defaultTransactionIsolation=READ_UNCOMMITTED
获取连接
public void dbcpDataSource() throws Exception {
//1.获取dbcp的配置文件 properties
Properties prop = new Properties();
//利用类的 appClassLoader应用类加载器默认路劲是源代码的根目录
//使用类加载器的getResourceAsStream读取文件的输入流
prop.load(DataSourceDemo.class.getClassLoader().getResourceAsStream("dbcp-config.properties"));
//2.获取连接池数据源的核心类对象
DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
//3.获取链接
Connection conn = dataSource.getConnection();
}
Druid
导入jar包
配置文件与dbcp类似
获取连接
public void druidDataSource() throws Exception {
//1.获取dbcp的配置文件 properties
Properties prop = new Properties();
//利用类的 appClassLoader应用类加载器默认路劲是源代码的根目录
//使用类加载器的getResourceAsStream读取文件的输入流
prop.load(DataSourceDemo.class.getClassLoader().getResourceAsStream("dbcp-config.properties"));
//2.获取连接池数据源的核心类对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
//3.获取链接
Connection conn = dataSource.getConnection();
}
若使用监控等功能还需对项目配置文件进行配置
将连接池封装成工具类
public class DBCPUtil {
private static DataSource dataSource =null;
private static Properties prop = new Properties();
static {
//1.获取dbcp的配置文件 properties
//利用类的 appClassLoader应用类加载器默认路劲是源代码的根目录
//使用类加载器的getResourceAsStream读取文件的输入流
try {
prop.load(DataSourceDemo.class.getClassLoader().getResourceAsStream("dbcp-config.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
//获取或者设置数据源
public static DataSource getDataSource(String name){
//C3P0
// if(name!=null && !name.equals("")){
// dataSource = new ComboPooledDataSource(name);
// }else{
// dataSource = new ComboPooledDataSource();
// }
//DBCP
try{
dataSource = BasicDataSourceFactory.createDataSource(prop);
}catch (Exception e){
e.printStackTrace();
}
return dataSource;
}
//获得连接方法
public static Connection getConn() {
Connection conn = null;
try {
if(dataSource==null){
getDataSource(null);
}
conn = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭资源的方法
public static void close(Connection conn, Statement st, ResultSet set){
try {
if(set!=null){
set.close();
}
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}
}
DBUtils
DBUtils是java编程中的数据库操作实用工具,小巧简单实用,封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
Dbutils三个核心功能介绍:
- QueryRunner中提供对sql语句操作的API.
- ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
- DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
QueryRunner使用
public void static void main(String[] args) throws SQLException {
//映射(OR) Mybatis ,Hibernate ,jdbcTemplate等等
//1.得到核心类
QueryRunner qr = new QueryRunner(ConnectionUtil.getDataSource(null));
//2.编写sql语句
//使用防注入sql语句写法
String sql ="INSERT INTO course VALUES(?,?,?);";
//3.设置参数
Object[] params = {"6-104","大数据",5};
//4.执行语句
//a.DML update() b.DQL query()
int i = qr.update(sql, params);
System.out.println(i);
}
使用ResultSetHandler接口将结果集封装
public void static void main(String[] args) throws SQLException {
QueryRunner qr = new QueryRunner(ConnectionUtil.getDataSource(null));
String sql1 = "SELECT * FROM student WHERE name=? AND password=? ";
String sql2 = "SELECT * FROM student WHERE password=? ";
String sql3 = "SELECT count(0) FROM student WHERE sex1='男' ";
Object[] param1= {"刘晨","123456"};
//ResultSetHandler 结果集模板 ==>(时间模板 yyyy-MM-dd HH:mm:ss)
//1.BeanHandler 要求结果一定要是一条,直接帮你映射bean
//注意:表中的字段要和java中的字段完全一样(缺陷),
//匹配的是javabean中get和set方法
Student c =qr.query(sql1, new BeanHandler<>(Student.class), param1);
System.out.println(c);
//2.BeanListHandler 支持查询结果是多条数据
List<Student> list = qr.query(sql2, new BeanListHandler<>(Student.class), "123456");
//System.out.println(list);
//qr.query(sql, ,param);
//3.ScalarHandler 类型无法确定 先转成String 再转成你需要的类型
//如果你要指定返回类型,要在泛型中指定
Object o = qr.query(sql3, new ScalarHandler<>());
String s = o.toString();
int num = Integer.parseInt(s);
System.out.println(num);
//4.MapHandler : 将查询到的一条记录,封装到Map中,map.key=字段名,map.value=值
//主要用途:多表操作、将数据转换json 等
Map<String,Object> map = queryRunner.query(sql2, new MapHandler(), "123456");
System.out.println(map);
//还有MapListHandler、ArrayHandler、ArrayListHandler、KeyedHandler、ColumnListHandler用法类似
}