1.连接池概述
用池来管理Connection,这样可以重复使用Connection,有了池,所以我们就不用自己来创建Connection,
而是通过池来获取Connection对象,当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,
而是把Connection归还给池,池就可以再利用这个Connection对象了
2.C3P0
public class Demo1 { @Test public void test() throws Exception { //获得连接池 ComboPooledDataSource dataSource = new ComboPooledDataSource(); //设置连接池与数据库的基本项 dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql:///demo"); dataSource.setUser("root"); dataSource.setPassword("root"); //初始化连接数目 dataSource.setInitialPoolSize(10); //最小连接个数 dataSource.setMinPoolSize(2); //最大连接个数 dataSource.setMaxPoolSize(20); //获得连接 Connection connection = dataSource.getConnection(); System.out.println(connection); } }
3.常见的配置项
属性 描述
user 用户名
password 密码
driverClass 驱动(mysql驱动:com.mysql.jdbc.Driver)
jdbcUrl jdbc:mysql:///数据库
acquireIncrement:连接池无空闲连接可用时,一次性创建的新连接数 默认3
initialPoolSize :连接池初始化时创建的连接数 默认3
maxPoolSize :连接池中拥有的最大的连接数
minPoolSize :连接池保持的最小的连接数
4.c3p0配置文件使用
配置文件名字:c3p0-config.xml
配置文件位置:src
配置文件内容:命名配置
<c3p0-config> <!-- 命名的配置 --> <named-config name="itheima"> <!-- 连接数据库的4项基本参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///demo</property> <property name="user">root</property> <property name="password">root</property> <!-- 如果池中数据连接不够时一次增长多少个 --> <property name="acquireIncrement">5</property> <!-- 初始化连接数 --> <property name="initialPoolSize">20</property> <!-- 最小连接受 --> <property name="minPoolSize">10</property> <!-- 最大连接数 --> <property name="maxPoolSize">40</property> <!-- -JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量 --> <property name="maxStatements">0</property> <!-- 连接池内单个连接所拥有的最大缓存statements数 --> <property name="maxStatementsPerConnection">5</property> </named-config> </c3p0-config>
5.c3p0工具类
public class Demo2 { //连接池 private static ComboPooledDataSource dataSource = new ComboPooledDataSource("datebase"); //获得数据源 public static DataSource getDataSource() { return dataSource; } //获得连接 public static Connection getConnection () throws SQLException { return dataSource.getConnection(); } }
6.dbcp连接池
常见属性配置项
属性 描述
username 用户名
password 密码
driverClassName 驱动(mysql驱动:com.mysql.jdbc.Driver)
url jdbc:mysql:///数据库
maxActive :连接池中拥有的最大的连接数
minldle :最小空闲连接
maxldle :最大空闲连接
initialSize :初始化连接
public class Demo3 { @Test public void test() throws SQLException { //获得连接池 BasicDataSource dataSource = new BasicDataSource(); //设置基本项 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///demo"); dataSource.setUsername("root"); dataSource.setPassword("root"); // * 初始化连接池中连个的个数 dataSource.setInitialSize(5); // * 最大活动数 dataSource.setMaxActive(10); //2获得连接 Connection conn = dataSource.getConnection(); } }
7.dbcp连接池配置文件使用
配置文件名称:*.properties
配置文件位置:建议src
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/webdb_4
username=root
password=root
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
8.dbcp工具类
public class Demo4 { //创建连接池 private static DataSource dataSource; //加载配置文件,创建连接池 static{ try { InputStream is = Demo4.class.getClassLoader().getResourceAsStream("dbcp.properties"); Properties pro = new Properties(); pro.load(is); dataSource = BasicDataSourceFactory.createDataSource(pro); } catch (Exception e) { e.printStackTrace(); } } //获得连接池 public static DataSource getDataSource() { return dataSource; } //获得数据库 public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }
9.DBUtils工具类
它是java编程中的数据库操作实用工具
封装了JDBC的操作,简化了JDBC
三个核心功能:
QueryRunner中提供对sql语句操作的API
ResultHandler接口,用于定义select操作后,怎样封装结果集
DbUtils类,定义了关闭资源与实务处理的方法
QueryRunner核心类介绍
QueryRunner(DataSource)创建核心类,并提供数据源,内部自己维护connection
update(String sql,Object...params)执行DML语句
query(String sql,ResultSetHandler,Object..params)执行DQL语句,并将查询结果封装到对象中
10.QueryRunner结果处理类
ArrayHandler 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中。
BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
ColumnListHandler 将结果集中指定的列的字段值,封装到一个List集合中
KeyedHandler 将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。
MapHandler 将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值
MapListHandler 将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
ScalarHandler 它是用于单数据。例如select count(*) from 表操作。
11.JavaBean
1. 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
2. 提供私有字段:private 类型 字段名;
3. 提供getter/setter方法:
4. 提供无参构造
特别补充:
ScalarHandler
/* * 查询数据表结果集处理其中一种方式: * ScalarHandler处理方式 * 处理单值查询结果,执行的select语句后,结果集只有1个 */ @Test public void demo01() throws SQLException{ // ScalarHandler : 用于处理聚合函数执行结果(一行一列) // * 查询总记录数 QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select count(*) from product"; Long obj = queryRunner.query(sql, new ScalarHandler<Long>()); //System.out.println(obj.getClass()); System.out.println(obj); }
MapHandler
/* * 查询数据表结果集处理其中一种方式: * MapHandler处理方式 * 将数据表结果集的第一行数据,封装成Map集合 * 键: 数据表中的列 * 值: 这个列中的数据 * * 处理方式的Map集合,是LinkedHashMap的子类 */ @Test public void demo02() throws SQLException{ // MapHandler : 将查询到的一条记录,封装到Map中,map.key=字段名,map.value=值 // * 主要用途:多表操作、将数据转换json 等 QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select * from product where id = ?"; Object[] params = {6}; Map<String,Object> map = queryRunner.query(sql, new MapHandler(), params); System.out.println(map); // 将Map数据封装到指定JavaBean }
MapListHandler
/* * 查询数据表结果集其中一种处理方式: * MapListHandler处理方式 * 将数据表的结果集的每一行封装成Map集合 * 数据表多行数据,出现多个Map集合,存储List集合 */ @Test public void demo03() throws SQLException{ // MapListHandler : 查询所有数据,将每一条记录封装到Map中,然后将Map添加到List中,最后返回List // * 主要用途:多表操作 等 QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select * from product"; List<Map<String,Object>> list = queryRunner.query(sql, new MapListHandler()); for(Map<String,Object> map : list){ System.out.println(map); } }
KeyHandler
@Test public void demo04() throws SQLException{ // KeyedHandler : new KeyedHandler("字段名称"),查询所有,将查询结果封装到Map中 // * map.key=为指定“字段名称”对应的值 // * map.value=为当前整条记录所有的值,数据为Map<字段名,值> // 类型 Map<String , Map<String,Object> > QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select * from product"; Map<String,Map<String,Object>> map = queryRunner.query(sql, new KeyedHandler<String>("name")); for(Map.Entry<String, Map<String,Object>> entry : map.entrySet()){ System.out.println(entry.getKey()); System.out.println(entry.getValue()); } }
ColumnListHandler
/* * 查询数据表结果集处理其中一种方式: * ColumnListHandler处理方式 * 将查询数据表结果集中的某一列数据,存储到List集合 * 哪个列不清楚,数据类型也不清楚, List<Object> * ColumnListHandler构造方法 * 空参数: 获取就是数据表的第一列 * int参数: 传递列的顺序编号 * String参数: 传递列名 * * 创建对象,可以加入泛型,但是加入的数据类型,要和查询的列类型一致 */ @Test public void demo05() throws SQLException{ // ColumnListHandler : 查询指定一列数据 QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select * from product"; List<String> list = queryRunner.query(sql, new ColumnListHandler<String>("name")); System.out.println(list); }