回顾:
1.jdbc
1.1:加载驱动
1.2:创建连接对象
1.3:准备sql语句
1.4:创建执行对象
1.5:用执行对象调用相应方法执行sql语句
1.6:处理结果
1.7:关闭对象(先开后关)
2.自定义连接池:让大家了解连接池的原理.
3.实现Java的DataSource接口连接池:让大家理解装饰者模式.
4.dbcp连接池,这个连接池apach公司已经封装好了,我们按照底层要求传配置信息就可以使用了.
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
* @auth sx
* @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
* @auth sx
* @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编码版连接池
* @version 1.0
* @auth sx
* @date 2020/3/28
*/
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
* @auth sx
* @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
* @auth sx
* @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());
}
}
8.2.3:用DBUtils工具类查询,返回一个对象
eg:public static void main(String[] args) throws SQLException {
//创建dbutils工具类的执行对象,参数传连接池,传dbcp连接池
QueryRunner qr=new QueryRunner(DbcpPool2.ds);
//准备sql语法
String sql="select sid,sname,sage,sex,address,cid from t_student where sid=?";
//用dbutils工具类的执行对象调用相应的方法
Student stu=qr.query(sql,new BeanHandler<>(Student.class),20);
System.out.println(stu);
}
8.2.4:用DBUtils工具类查询,返回一行的一个列值
eg:public static void main(String[] args) throws SQLException {
//创建dbutils工具类的执行对象,要传连接池的参数,传druid连接池
QueryRunner qr=new QueryRunner(DruidPool.ds);
//准备sql语句
String sql="select count(sid) as total from t_student";
//用dbutils工具类的执行对象调用相应的方法
Map<String, Object> result=qr.query(sql,new MapHandler());
System.out.println("学生总人数为:"+(long)result.get("total"));
}
8.2.5:用DBUtils工具类来执行sql语句相同参数不同批处理
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(?,?,?,?,?);";
/*将要传入的sql语句的参数数组准备好*/
Object[][] obs=new Object[10][];
//二维数组的每个空间对应一条Sql语句的参数
for (int i=0;i<10;i++){
//一维数组中每个空间就对应sql语句中每个列
obs[i]=new Object[5];
obs[i][0]="uu"+i;
obs[i][1]=6+i;
obs[i][2]="男";
obs[i][3]="地址不详";
obs[i][4]=1+i;
}
//dbutils工具类的执行对象调用相应的方法
int[] results=qr.batch(sql,obs);
System.out.println(Arrays.toString(results));
}
总结
1.自定义连接池:让大家了解连接池原理.
2.实现DataSource的连接池:为了让大家了解装饰者模式.规则连接池获得连接对象方法,关闭 连接对象的方法.
3.dbcp连接池(BasicDataSource):配置版,代码加载属性版(了解)
3.1:导包
3.2:配置文件
3.3:创建连接池工具类,在工具类用连接池工厂加载配置文件得到连接池
4.c3p0连接池(ComboPooledDataSource):自动回收连接对象,自动加载src下配置文件(c3p0- config.xml或c3p0.properties)
3.1:导包
3.2:将配置文件放在src下
3.3:直接创建c3p0连接池对象,使用.
5.druid连接池(DruidDataSource)的使用:与dbcp连接池使用方法一样的.
6.dbutils工具类