连接池:
连接池: 存放多个连接 的集合 。
原理:
连接池中有多个Connection连接,使用连接时可以从池中获取,使用完毕又归还到连接池,可以提高效率 .
目的 : 解决建立数据库连接耗费资源和时间很多的问题,提高性能。
java为数据库连接池提供了公共的接口: javax.sql. DataSource ;
C3P0连接池: (开源免费)
C3P0连接池实现了DataSource 接口 , 重写了getConnection方法 .
Connectino getConnection () : 尝试建立与此DataSource 对象所表示的数据源的连接。
C3P0Utils工具类:
使用步骤:
- 成员位置创建DataSource实现类对象ComboPooledDataSource
- 编写配置文件c3p0-config.xml(设置4大连接信息) , 必须放在src下面.
- 获取数据库连接对象Connection并返回.
- 释放资源.
c3p0-config.xml
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/数据库名字</property>
<property name="user">用户名</property>
<property name="password">密码</property>
<!-- 连接池参数 -->
<!-- 初始连接数 -->
<property name="initialPoolSize">5</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">10</property>
<!-- 最大等待时间 -->
<property name="checkoutTimeout">2000</property>
<!-- 最大空闲回收时间 -->
<property name="maxIdleTime">1000</property>
</default-config>
</c3p0-config>
工具类代码实现:
public class C3P0UtilsXML {
// 1. 在成员位置创建一个静态的ComboPooledDataSource对象
private static DataSource() dataSource = new ComboPooledDataSource();
// 2. 创建一个方法在ComboPooledDataSource对象获取Connection并返回 .
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("获取数据库连接对象失败.."+e);
}
}
// 定义一个方法直接返回连接池 , 共QueryRunner使用
public static DataSource getDataSource(){
return dataSource;
}
//3.创建一个方法,用于释放资源
public static void close(ResultSet rs, Statement stat, Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();//不是关闭conn,是把conn归还给连接池
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
DbUtils工具: 简化原生态jdbc6步.
需要导入jar包 : commons-dbutils-1.6.jar
三个核心功能:
a.QueryRunner() : 用于执行CURD的sql语句.
b.ResultSetHandler接口 , 用于接收查询的结果集.
c.DbUtils类 , 用于释放Connection资源.
空参构造方法:
构造方法: 用的是同一个连接.
QueryRunner():需要手动提供Connection .
普通方法:
update(Connection conn ,Stirng sql , Object…params)
query(Connection conn , String sql , ResultSetHandler , params)
自己提供的Connection , 需要释放资源: DbUtils.CloseQuietly( ) ;
带连接池的方法:
构造方法: 不能保证是同一个连接.
QueryRunner(DataSource) : 参数传递了连接池,
会自动从连接池中获取Connection使用完毕会自动把Connection归还给连接池 .
成员方法:
update(String sql , Object…params) : 执行DML语句.
query(String sql , ResultSetHandler , Object…params) 执行查询语句
实现步骤: 3步
a.创建QueryRunner对象 .
b.使用方法update/query执行sql语句,获取结果.
c.处理结果.
ResultSetHandler结果集:
a.BeanHandler(Class type): 传递javabean的class文件对象 , 取出第一行 .
前提 : 必须要提供空参构造方法.
b.BeanListhandler: 把多行结果存储到List中.
c.ScalarHandler: 用于查询结果是一个单一的值(聚合函数).
d.ColumnListHandler:用于查询指定的列 , 不传默认是第一列.
案例:
public class Demo01DButils {
// 使用DbUtils对数据库表中添加数据.
@Test
public void testInsert() throws SQLException {
// 1. 创建QueryRunner对象.
QueryRunner qr = new QueryRunner();
// 2. 使用QueryRunner对象中的方法update/query执行sql语句, 获取结果.
Connection conn = C3P0UtilsXML.getConnection();
String sql = "INSERT INTO product(pid,pname,price,category_id) VALUES(?,?,?,?);";
int i = qr.update(conn, sql, 14, "优乐美", 3, "c005");
System.out.println(i+"行数据添加成功...");
// 3. 释放资源
DbUtils.closeQuietly(conn);
}
// 使用Dbutils对数据库表中的数据进行修改.
@Test
public void testUpdate() throws SQLException {
// 1. 创建QueryRunner对象.
QueryRunner qr = new QueryRunner(C3P0UtilsXML.getDataSource());
// 2. 使用QueryRunner对象中的方法update/query执行sql语句,
String sql = "UPDATE product SET pname=?,price=? WHERE pid = ?;";
int i = qr.update(sql, "阿萨姆", 4.5, 14);
System.out.println(i+"行数据修改成功...");
}
// 使用Dbutils对数据库表中的数据进行删除.
@Test
public void testDelete() throws SQLException {
// 1. 创建QueryRunner对象.
QueryRunner qr = new QueryRunner(C3P0UtilsXML.getDataSource());
// 2. 使用QueryRunner对象中的update / query方法执行sql语句.
String sql = "DELETE FROM product WHERE pid IN(?,?,?,?,?,?);";
int i = qr.update(sql, 9, 10, 11, 12, 13, 14);
System.out.println(i+"行数据删除成功...");
}
@Test
public void testBeanHandle() throws SQLException {
// 1. 创建QueryRunner对象.
QueryRunner qr = new QueryRunner(C3P0UtilsXML.getDataSource());
// 2. 使用QueryRunner对象中的query方法. 执行sql语句.
String sql = "select * from product ;";
Product p = qr.query(sql, new BeanHandler<>(Product.class));
// 3. 处理结果.
System.out.println(p);
}