连接池
连接池主要是用来管理 Connection 对象,减少创建的时候消耗性能,然后还可以重复使用它。当你在使用的时候,如果说访问量激增时,有可能需要等待一定的时间,因为 cpu 会将空闲下来的 Connection 拿来使用,当你使用完了之后,还需要归还到连接池中,让下一个访问者来继续使用
Java 主要在数据连接池方向上,通过提供一套公共的接口:java.sql.DataSource。接着,不同的厂商就 会根据这套规范,然后制定对应的产品,比如 MyBatis、Hibernate 等框架都有不同的连接池实现方 案。
这样,其实是方便了 Java 开发者,我们开发者其实只需要提供一套代码,就可以在不同的厂商产品之间进行切换,不需要针对每个不同的连接池产品去修改我们的代码。 常用的连接池:DBCP、C3P0
C3P0
开源产品,Spring、Hibernate 等框架都有使用它。
首先我们要导入jar包和配置文件配置文件 c3p0-config.xml 。
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- c3p0配置文件 配置数据源 -->
<!-- default-config 默认 -->
<default-config>
<!-- 驱动 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- url -->
<property name="jdbcUrl">jdbc:mysql:///mybase02</property>
<!-- 用户名 -->
<property name="user">root</property>
<!-- 密码 -->
<property name="password">root</property>
</default-config>
<!-- named-config 通过名字指定 -->
<named-config name="test">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///mybase03</property>
<property name="user">root</property>
<property name="password">root</property>
</named-config>
</c3p0-config>
C3P0我们使用起来就很方便,可以直接得到connection对象。同样的,我们依旧利用C3P0封装我们的工具类。
package util;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
//c3p0工具类
public class C3P0Utils {
//找的是默认配置文件中的数据源信息
private static ComboPooledDataSource cpds=new ComboPooledDataSource();
//找的是配置文件中 通过名字指定的信息
ComboPooledDataSource cpds2=new ComboPooledDataSource("test");
//返回建立连接对象
public static Connection getConnection() throws SQLException {
return cpds.getConnection();
}
//返回dataSource 数据源 DButils
public static DataSource getDS() {
return cpds;
}
// public static void main(String[] args) {
//
//
// try {
// //得到建立连接对象
// Connection c1 = cpds.getConnection();
//
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
}
DBUtils
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,创建连接、结果集封装、释放资源,同时也不会影响程序的性能。
API介绍:
- org.apache.commons.dbutils.QueryRunner --- 核心
- org.apache.commons.dbutils.ResultSetHandler --- 结果集封装器
- org.apache.commons.dbutils.DbUtils --- 工具类
package dbutils;
import static org.junit.Assert.*;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.junit.Test;
import bean.Classes;
import util.C3P0Utils;
public class Demo1 {
//DButils封装了 结果 优化查询这部分
//结果返回单行数据
@Test
public void fun1() throws Exception {
//第一步 初始化QueryRunner对象 并传入数据源
QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
//执行查询并返回结果
//sql sql 语句
String sql="select * from classes where id=?";
// ResultSetHandler rsh;//结果集处理器 dbutils帮助封装了结果
//实体类 属性名跟表中字段要一直 有set和get方法 封装
Classes c1=qr.query(sql, new BeanHandler<Classes>(Classes.class),3);
System.out.println(c1);
}
//结果返回多行数据
@Test
public void fun2() throws Exception {
//第一步 初始化QueryRunner对象 并传入数据源(连接池工具类中封装方法返回数据源)
QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
//执行查询并返回结果
//sql sql 语句
String sql="select * from classes";
List<Classes> ll1=qr.query(sql,new BeanListHandler<Classes>(Classes.class) );
System.out.println(ll1);
}
//模糊查询案例
@Test
public void fun3() throws Exception {
//第一步 初始化QueryRunner对象 并传入数据源(连接池工具类中封装方法返回数据源)
QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
//执行查询并返回结果
//sql sql 语句
String sql="select * from classes where name like ?";
List<Classes> ll1=qr.query(sql,new BeanListHandler<Classes>(Classes.class),"%二%" );
System.out.println(ll1);
}
//其他增删改案例 插入案例 增删改 调用
@Test
public void fun4() throws Exception {
QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
//执行查询并返回结果
//sql sql 语句
String sql="insert into classes values(?,?)";
int r1=qr.update(sql,1,"一班");
if(r1>0) {
System.out.println("添加成功!");
}
}
//删除案例
@Test
public void fun5() throws Exception {
QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
String sql="delete from classes where id=?";
int rows=qr.update(sql,1);
if(rows>0) {
System.out.println("删除成功");
System.out.println(rows);
}
}
//修改案例
@Test
public void fun6() throws Exception {
QueryRunner queryRunner=new QueryRunner(C3P0Utils.getDS());
String sql="update classes set name=? where id=?";
int rows=queryRunner.update(sql,"2班",2);
if(rows>0) {
System.out.println("修改成功");
}
}
//查询结果集 beanhandler 单行bean 接收 beanListhandler:多行List<bean>
// maphandler 单行 返回类型map mapListhandler 多行
@Test
public void fun7() throws Exception {
//第一步 初始化QueryRunner对象 并传入数据源
QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
//执行查询并返回结果
//sql sql 语句
String sql="select * from classes where id=?";
// ResultSetHandler rsh;//结果集处理器 dbutils帮助封装了结果
//实体类 属性名跟表中字段要一直 有set和get方法 封装
Map<String, Object> query = qr.query(sql, new MapHandler(),3);
System.out.println(query);
}
}