1.1 什么是数据库连接池
在使用jdbc编程时,每次访问数据库都需要创建连接对象,访问完毕后也需要断开连接(销毁对象)。
比如说:网站的每日用户访问量是10万次,这时候就需要对数据库访问10万次,需要10万次创建和断开连接对象,频繁的创建和断开连接,这使访问数据库的效率非常低。
数据库连接池技术:管理连接对象。
1.应用程序就不需要创建和断开连接对象,而是交给数据库连接池管理
2.数据库连接池断开,不是销毁对象,而是把连接对象归还给连接池。
数据库连接池基本参数:
1.初始化大小:数据库连接池里面初始的连接对象个数
2.最大连接数:数据库连接池里面最大的连接对象个数
3.最大等待时间:用户通过连接池取连接对象时,需要等待的时间
4.最大空闲连接:数据库连接池里面,在用户访问趋于稳定时,最大的空闲连接个数
5.最小空闲连接:在用户访问趋于顶峰时,数据库连接池里面剩余的最小连接对象个数。
优点:通过数据库连接池管理连接对象,减少了数据库连接对象的创建和销毁,提高咱们数据库的访问效率。
1.2 DataSource接口:
数据库连接池技术:由sun 公司制定数据库连接池规范(数据库连接池接口),让不同的数据库厂商来实现这-套规范,提供自己的数据库连接池具体的实现。
目前市面流行的数据库连接池技术: DBCP 和C3p0
1.3 DBCP数据源
DBCP数据库连接池(DataBase Connection Pool), 是由apache组织提供的数据库连接池技术,开源免费。
在项目中开发中,使用DBCP的基本步骤:
前提导入DBCP的jar包: commons - dbcp. jar , commons -pool.jar a
DBCP获取连接对象:设置连接参数。
四个连接参数:dr iverName,url, use rname, password.
DBCP获取连接对象具体的方式:
第一种:直接使用BasicDataSource类创建数据源对象,从而获取连接对象。
在使用BasicDataSource类创建一个数据源对象时, 需要手动给数据源对象设置属性值,然后获取数据库连接对象。下面通过一个案例来演示BasicDataSource 类的使用,具体步骤如下。
(1)在Eclipse 中创建一 个名称为chapter10 的Web项目,在项目chapter10 中导入mysql-connector-java-5.0.8-bin.jar、commons-dbcp-1.4.jar以及commons- pool- 1.6.jar 3个JAR包,并发布到类路径下,然后在项目的src目录下创建包cn.itcast.chapter10.example,并在该包下创建一个example01类,该类采用手动方式获取数据库的连接信息和数据源的初始化信息,如下图所示:
(2)运行main()方法后,运行结果如下:
第二种:通过读取配置文件创建数据源对象,从而获取连接对象
(读取配置的好处:在不修改代码的情况,可以修改数据库的连接参数。)
除了使用BasicDataSource直接创建数据源对象外,还可以使用BasicDataSourceFactory工厂类读取配置文件,创建数据源对象,然后获取数据库连接对象。下面通过一个案例来演示,具体步骤如下。
(1)在chapter10项目的src目录下创建dbcpconfig.properties 文件,该文件用于设置数据库的连接信息和数据源的初始化信息。
(2)src目录下创建包cn.itcast.chapter10.example,并在该包下创建一个example02类,该类中采用了从配置文件中获取数据库的连接信息和数据源的初始化信息,具体如下:
1.4 C3PO数据源
C3PO是目前最流行的开源数据库连接池之一,它实现了DataSource 数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和Spring都支持该数据源。在使用C3PO数据源开发时,需要了解C3PO中DataSource接口的实现类ComboPooledDataSource,它是C3P0的核心类,提供了数据源对象的相关方法 。
1.通过ComboPooledDataSource()构造方法创建数据源对象
使用ComboPooledDataSource()构造方法创建数据源对象,需要手动给数据源对象设置属性值,然后获取数据库连接对象,具体步骤如下。
( 1 )在项目chapter10中导入JAR包c3p0- -0.9.1.2.jar, 然后在cn.itcast.chapter 10.example包下创建一个example03类,该类采用C3P0数据源手动代码的方式获取Connection对象。
(2)运行main()方法后,程序的运行结果如图:
2.通过读取配置文件创建数据源对象
使用ComboPooledDataSource ( String configName )构造方法读取c3p0-config.xml 配置文件,从而创建数据源对象,然后获取数据库连接对象。下面通过一个案例来演示读取配置文件创建数据源对象的使用,具体步骤如下。
( 1 )在src根目录下创建一个c3p0-config xml文件,用于设置数据库的连接信息和数据源的初始化信息。
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl"> jdbc:mysql://localhost:3306/jdbc </property> <property name="user">root</property> <property name="password">root</property> <property name="checkoutTimeout">30000</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> </default-config> <named-config name="itcast"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl"> jdbc:mysql://localhost:3306/jdbc </property> <property name="user">root</property> <property name="password">root</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">15</property> </named-config> </c3p0-config>
(2)在cn.itcast.chapter10.example包下创建一个Example04类,该类中使用C3P0数据源从配置文件中获取Connection对象。
(2)运行main()方法后,程序的运行结果如图:
2.1 DBUtils工具介绍
为了更加简单地使用JDBC, Apache组织提供了个DBUtis 工具,它是提作数据库的一 一个组件,实现了对JDBC的简单封装,可以在不影响性能的情况下极大地简化JDBC的编码工作量。DBUtis工具可以在“tp:.mmo.h apache orpromons-oduisindex htm”"下载到,截止到目前它的最新版本为Apache Commons DbUtils 1.6。
2.2 QueryRunner 类
QuerRunner类简化了执行SQL语句的代码,它与ResultHerdler组合在一起就能完成大部分的数据库操作,大大地减少了编码量。
QueryRunner类提供了带有一个参数的构造方法,该方法以javax.sal.DataSource作为参数传递到QueryRunner的构造方法中来获取Connection 对象。
2.3 ResultSetHandler 接口
ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式。根据结果集中数据类型的不同,ResultSetHandler 提供了几种常见的实现类,具体如下。
1.BeanHandler:将结果集中的第1行数据封装到一个对应的JavaBean实例中。
2.BeanL istHandler:将结果集中的每一行数 据都封装到一个对应的JavaBean实例中,并存放到List里。
3.ScalarHandler:将结果集中某一条记录的其中某一列的数据存储成Object对象。另外,在ResultSetHandler接口中,提供了-个单独的方法handle (java.sql.ResultSet rs),如果上述实现类没有提供想要的功能,可以通过自定义-一个实现ResultSetHandler 接口的类,然后通过重写handle()方法,实现结果集的处理。
2.4 ResultSetHandler 实现类
2.3小节中介绍了ResultSetHandler 接口中常见实现类的作用。接下来,通过案例的形式,针对常见实现类的使用进行详细的讲解。
BeanHandler和BeanlistHandler实现类是将结果集中的数据封装到对应的JavaBean实例中,这也是实际开发中最常用的结果集处理方法。接下来,通过代码实现来学习如何使用BeanHandler和BeanListHandler以及两者的区别。具体步骤如下。
(1)在名为jdbc的数据库中创建数据表user,创建语句如下:
CREATE TABLE user( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, password VARCHAR(20) NOT NULL);
向user表插入3条数据,具体语句如下:
INSERT INTO user VALUES(1,'zhangyanju','123456'), (2,'yiyi','123456'), (3,'lili','123456')
为了查看数据是否添加成功,使用SELECT语句查询user表.
将下载的DBUtis工具的JAR包commons- dbutils- 1.6.jar添加到项目的lib目录中,并将第9章中文件9-5 JDBCUtils.java复制到cn.itcast.chapter10.example包下
(3)在chapter10项目的cn.itcast chapter10. example包中创建-一个名为BaseDao的类,该类中编写了一个通用的查询方法,具体实现方式如下:
在cn.itcast.chapter 10.example包下创建实体类User, 使用该类来封装User对象,具体实现方式如下:
package chapter10.chapter10.example; public class User { private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
(5)在cnitcast.chapter10.example 包下创建类ResultSetTest1, 该类用于演示BeanHandler类对结果集的处理,具体代码如下:
在nicast chapler 1.exampme包下创建类RsesTetet该类用于演示Bensustander类对结果集的处理,具体代码如下:
注:有错误可以抛出异常
over!!!