持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情
06、连接池 DBUtils工具类
01.连接池_概念:池:它是一个"容器",里面可以装载很多的连接对象(Connection)。当有用户需要使用时,就分配一个。当它使用完毕时,再归还到
1).什么是连接容器中,这样可以反复使用,大大提高程序的运行效率。这个容器就是:连接池。
2).第三方的连接池:
1).DBCP连接池:Apache公司出品。免费、开源的。Tomcat内部使用的连接池。
2).C3P0连接池【重点掌握】:国际上比较出名的一个连接池工具。Spring、Hibernate内部使用的连接池。
3).注意:任何公司提供的连接池必须实现:javax.sql.DataSource(接口)
02.连接池_DBCP连接池的使用:
1).复制所需jar包到项目目录下,并添加到构建路径:
commons-dbcp-1.4.jar
commons-pool-1.6.jar
2).复制所需的配置文件(dbcpconfig.properites)到src目录下(安全)。
【需要掌握】
1).文件名和位置(建议src下)可以变.
2).要掌握里面的四个必须配置:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day19_db
username=root
password=123
注意:"键"名不要更改,因为这是DBCP内部自动寻找的。
"值"要根据自己的情况会更改。
3).使用细节:
//1.读取配置文件
Properties pro = new .....;
pro.load(Demo.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));//自动从src目录下找这个配置文件
//2.创建连接池对象
DataSource ds = BasicDataSourceFactory.createDataSource(pro);//只有这里用到了DBCP库中的类,其它地方没有了
//3.通过连接池,获取Connection对象
Connection conn = ds.getConnection();
......
//4.释放资源
......
conn.close();//不是关闭,是回收
03.连接池_C3P0连接池的使用:
1).复制所需jar包到项目目录下,并添加到构建路径:
c3p0-0.9.2-pre5.jar
mchange-commons-java-0.2.3.jar
2).复制所需的配置文件(c3p0-config.xml)到src目录下:
【需要掌握】
1).文件名和位置不可以更改,因为是由C3P0连接池内部自动查找的。
文件名必须叫:c3p0-config.xml
位置必须在:src目录下
2).能够识别出里面的"默认配置"和"命名配置"即可。
3).能够修改里面的四个必须的配置项:
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/hei70_day21db_1</property>
<property name="user">root</property>
<property name="password">123</property>
3).使用细节:
//1.直接创建连接池对象
DataSource ds = new ComboPooledDataSource();//读取默认配置
DataSource ds = new ComboPooledDataSource("itcast");//读取命名配置---只有这里用到一次C3P0的类:ComboPooledDataSource,其它地方没有。
//2.获取连接对象
Connection conn = ds.getConnection();
......
//6.关闭资源
......
conn.close();//不是关闭,是回收
04.DBUtils工具类_JavaBean在企业级开发的作用:
1).JavaBean作用:用于封装一条数据。例如:Student类就是一个JavaBean,用来封装一个学员的所有信息的。
2).使用JavaBean封装结果集的示例:
//1从数据库读取信息
DataSource ds = new ComboPooledDataSource();
Connection conn = ds.getConnection();
String sql = "select * from product";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
List<Product> proList = new ArrayList<>();
while(rs.next()){--这个封装的过程比较繁琐,如果字段多,封装会很麻烦,所以可以使用DBUtils工具包
//一条数据封装到一个JavaBean中
Product pro = new Product();
pro.setPid(rs.getInt("pid"));
pro.setPname(rs.getString("pname"));
pro.setPrice(rs.getInt("price"));
pro.setCid(rs.getInt("cid"));
//将JavaBean存储到集合中
proList.add(pro);
}
rs.close();
stmt.close();
conn.close();
05.DBUtils工具类_概念:
1).什么是DBUtils工具包:它是一个第三方的开发包,由Apache公司开发,内部封装了大量对JDBC操作的一些方法。
可以简化我们数据库的开发。
2).DBUtils的核心类:
1).QueryRunner(类)【最重要的】:作用:发送SQL语句,并封装结果集;
2).ResultSetHandler(接口) : 作用:它有一些子类,可以告诉QueryRunner对象怎样封装结果集。
06.DBUtils工具类_使用DBUtils实现添加_修改_删除:
1).复制所需jar包到项目目录下,并添加到构建路径:
commons-dbutils-1.4.jar
注意:
1).要使用DBUtils,由于它需要连接池,所以也同时需要C3P0的jar包。
2).以及MySQL的驱动包。
2).实现细节:
定义一个工具类,确保整个项目只有一个连接池对象:
public class JDBCUtils {
//成员属性,直接new出来,读取默认配置
private static DataSource ds = new ComboPooledDataSource();
//公有静态方法,获取连接池对象
public static DataSource getDataSource(){
return ds;
}
}
-------------------------------------------------------------------------------------------------
//添加
public void add() throws SQLException {
//1.构造一个QueryRunner对象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());//使用连接池构造
//2.执行添加
String sql = "insert into product values(null,?,?,?)";
int row = qr.update(sql, "奔驰汽车",480000,1);
System.out.println("添加影响的行数:" + row);
}
//修改
public void update() throws SQLException{
//1.构造一个QueryRunner对象
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());//使用连接池构造
//2.执行修改
String sql = "update product set pname = ? , price = ? where pid = ?";
int row = qr.update(sql,"奔驰E级",440000,10);
System.out.println("修改影响的行数:" + row);
}
//删除
@Test
public void delete() throws SQLException{
//1.构造一个QueryRunner
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());//通过工具类获取连接池对象
//2.执行删除
String sql = "delete from product where pid = ?";
int row = qr.update(sql,10);
System.out.println("删除影响的行数:" + row);
}
07.DBUtils工具包_使用DBUtils实现查询:
1).Object[] ArrayHandler:将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
2).List<Object[]> ArrayListHandler:将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
3).某个JavaBean类型 BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中。
4).List<某个JavaBean类型> BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
5).List ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中
6).Map<String,Object> MapHandler:将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值
7).List<Map<String,Object>> MapListHandler:将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
8).Object ScalarHandler:它是用于单个数据。例如select count(*) from 表操作。
08.DBUtils工具类_QueryRunner的两个常用方法:
1).public int update(String sql,Object ... params):用于执行添加(insert)、修改(update)、删除(delete)语句的。
返回值:int--》影响的行数
2).public 某种类型 query(String sql,ResultSetHandler rsh,Object ... params):用于执行查询(select)
返回值:根据ResultSetHandler的不同而不同。