1.为什么要用连接池:节省创建连接对象和关闭连接对象的时间,提高使用效率.
2.连接池:存放多个连接对象的容器.
3.自定义连接池:目地让我们了解连接池的原理.
eg:public class MyPool {
/**
*准备一个集合作为连接池,存放连接对象
*/
public static LinkedList<Connection> pool1=new LinkedList();
/**
* 用静态块初始化连接池中10个连接对象
*/
static{
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
for (int i=1;i<=10;i++){
//创建连接对象
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root");
//将连接对象添加到连接池中
pool1.add(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*获得连接对象的方法
*@return java.sql.Connection
*/
public static Connection getConnection(){
Connection conn=null;
if (pool1.size()>0){
//每次取出池中第一个连接对象给用户
conn=pool1.removeFirst();
}
return conn;
}
/**
*归还连接对象的方法
*@param conn
*/
public static void close(Connection conn){
//每次归还连接对象归还池子中最后
pool1.addLast(conn);
}
}
4.实现Java接口方式实现连接池:目地让大家理解装饰者模式的使用
eg:/**
*连接对象装饰者类
* @version 1.0
* @date 2020/3/28
*/
public class MyConnection implements Connection {
/**
*声明连接对象和连接池
*/
Connection conn;
/**
*通过构造方法将原来连接对象作为参数传过来
*/
public MyConnection(Connection conn){
this.conn=conn;
}
/**
*重写关闭连接对象的方法,实现假关,将连接对象归还连接池中
*/
@Override
public void close() throws SQLException {
System.out.println("装饰者连接对象的关闭方法");
MyPool2.pool1.addLast(conn);
}
/**
*重写父接口中方法获得执行对象的方法
*/
@Override
public Statement createStatement() throws SQLException {
System.out.println("装饰者连接对象获得执行对象");
return conn.createStatement();
}
/**
*重写父接口中方法获得预编译的执行对象的方法
*/
@Override
public PreparedStatement prepareStatement(String sql) throws SQLException {
System.out.println("装饰者连接对象获得预编译的执行对象");
return conn.prepareStatement(sql);
}
//省略不重要的方法
}
/**
*实现接口的方式实现连接池
* @version 1.0
* @date 2020/3/28
*/
public class MyPool2 implements DataSource {
//声明连接池
public static LinkedList<Connection> pool1=new LinkedList();
//初始化10个连接对象
static{
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
for (int i=1;i<=10;i++){
//创建连接对象
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root");
//将连接对象添加到连接池中
pool1.add(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Connection getConnection() throws SQLException {
Connection conn=pool1.removeFirst();
//创建装饰者连接对象,将原来连接对象作为参数传给装饰者连接对象的类中
MyConnection mc=new MyConnection(conn);
return mc;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
Connection conn=pool1.removeFirst();
//创建装饰者连接对象,将原来连接对象作为参数传给装饰者连接对象的类中
MyConnection mc=new MyConnection(conn);
return mc;
}
//省略不重要的方法
}
5.DBCP数据库连接池使用:导包commons-dbcp-版本号.jar,commons-pool-版本号.jar
5.1:DBCP编码版(了解):
eg:/**
*dbcp编码版连接池
*/
public class DbcpPool {
public static BasicDataSource ds=new BasicDataSource();
static {
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/myschool");
ds.setUsername("root");
ds.setPassword("root");
}
}
5.2:DBCP配置信息版(掌握)
在src下放置配置文件jdbc.properties
eg:##dbcp连接池的配置信息的Key名要与它底层的Key名相同,否则value值无法正常获取加载
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myschool
username=root
password=root
/**
*dbcp配置版的数据库连接池
* @version 1.0
* @date 2020/3/28
*/
public class DbcpPool2 {
//声明连接池工厂
public static BasicDataSourceFactory factory=new BasicDataSourceFactory();
//声明连接对象
public static DataSource ds;
static{
try {
//创建配置文件对象
Properties p1=new Properties();
//加载配置文件对象
p1.load(new InputStreamReader(new FileInputStream("Day36\\src\\jdbc.properties")));
//用连接池工厂对象根据配置文件创建连接池对象
ds=factory.createDataSource(p1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.c3p0连接池:
6.1:c3p0连接池与dbcp连接池区别:
6.1.1.dbcp没有自动回收空闲连接的功能
c3p0有自动回收空闲连接功能
6.1.2.dbcp需要手动设置配置文件
c3p0不需要手动设置
6.2:c3p0数据库连接池的使用
6.2.1:导包:将c3p0-版本.jar放在到当前项目lib目录中
6.2.2:c3p0的配置文件只能直接放在src下,
c3p0的配置文件名只能叫:c3p0-config.xml或c3p0.properties
6.2.3:获取c3p0连接池对象,使用
//获得连接池
public static ComboPooledDataSource ds=new ComboPooledDataSource();
//从连接池中取出一个连接对象
Connection conn=ds.getConnection();
7.druid数据库连接池:导包:druid-版本号.jar (druid使用方法与dbcp连接池使用一样)
7.1:druid的优点:
7.1.1. 亚秒级查询:druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
7.1.2. 实时数据注入:druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
7.1.3: 可扩展的PB级存储:druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其 效性
7.1.4: 多环境部署:druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark, kafka,storm和samza等
7.1.5: 丰富的社区:druid拥有丰富的社区,供大家学习
7.2:druid连接池的配置使用:
7.2.1:导Jar包druid-版本号.jar
7.2.2:在src下创建druid配置文件(注意配置文件的Key名与druid底层
规定的Key名一致)
#druid配置的key与底层的Key一致才能得到value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myschool
username=root
password=root
7.2.3:配置druid连接池
/**
*配置druid连接池
* @version 1.0
* @date 2020/3/28
*/
public class DruidPool {
//声明连接池工厂
public static DruidDataSourceFactory factory=new DruidDataSourceFactory();
//声明连接池
public static DataSource ds;
static{
try {
//创建配置文件对象
Properties p2=new Properties();
//加载配置文件
p2.load(new InputStreamReader(new FileInputStream("Day36\\src\\druid.properties")));
//用连接池工厂加载配置文件创建得到连接池
ds=factory.createDataSource(p2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
8.DBUtils工具类:是apach公司的一个项目,封装jdbc的工具类.
8.1:使用步骤:
第一步:导Jar包:commons-dbutils-1.6.jar
第二步:创建DBUtils工具类执行对象:
QueryRunner qr=new QueryRunner(连接池对象);
第三步:使用执行对象执行sql
执行查询语句: qr.query(sql1,转换器对象,object...params);
转换器:将结果集转换为对象集合BeanListHandler
将结果集转换为对象BeanHandler
将结果集中第一行转换为Map集合:MapHandler
执行增加/修改/删除:int result=qr.update(sql1,object...params);
8.2:使用案例:
8.2.1:用DBUtils工具类作增加,修改,删除的操作
eg:public static void main(String[] args) throws SQLException {
//创建dbutils工具类的执行对象,要传一个连接池作为参数,c3p0连接池
QueryRunner qr=new QueryRunner(new ComboPooledDataSource());
//准备一个sql语句
//String sql="insert into t_student(sname,sage,sex,address,cid) "
// + "values(?,?,?,?,?);";
String sql="update t_student set sex=? where sid=?";
//用dbutils工具类的执行对象调用相应方法执行
//int result=qr.update(sql,"刚哥",20,"女","北京",1);
int result=qr.update(sql,"男",20);
if (result>0){
System.out.println("操作成功");
}else {
System.out.println("操作失败");
}
}
8.2.2:用DBUtils工具类查询,返回一个集合
eg:public static void main(String[] args) throws SQLException {
//创建dbutils工具类的执行对象,要传一个连接池作为参数,c3p0连接池
QueryRunner qr=new QueryRunner(new ComboPooledDataSource());
//准备一个sql语句
String sql="select sid,sname,sage,sex,address from t_student";
//用dbutils工具类的执行对象调用相应方法执行,第一个参数是sql语句,第二个参数是类型转换器
List<Student> stuList=qr.query(sql,new BeanListHandler<Student>(Student.class));
System.out.println("学号\t姓名");
for(Student s:stuList){
System.out.println(s.getSid()+"\t"+s.getSname());
}
}