JDBC和连接池04-210.数据库连接池10.5Apache-DBUtils10.5.1resultSet问题
先分析一个问题在之前的程序中,执行sql语句后返回的结果集存在如下问题:
- 关闭connection后,resultSet结果集无法使用
如果要使用结果集,就不能关闭连接 , 不能关闭连接 , 就会反过来影响别的程序去连接数据库,就会对多并发程序造成很大的影响
- resultSet不利于数据的管理
如果其它的方法或者程序想要使用结果集,也需要一直保持连接 , 影响其他程序对数据库的连接
- 使用返回信息也不方便
文章插图
解决方法:
定义一个类,该类的属性和表的字段是对应关系/映射关系,即用类的属性和表的字段(列)关联起来我们把这种类叫做JavaBean,或者POJO,Domain 。
一个Actor对象就对应一条actor表的记录,将Actor对象放入到ArrayList集合中(将结果集的记录封装到ArrayList中)
文章插图
10.5.2土方法完成封装Actor类(JavaBean):
package li.jdbc.datasource;import java.util.Date;/** * Actor对象和actor表的记录对应 */public class Actor {//JavaBean/POJO/Domainprivate Integer id;private String name;private String sex;private Date borndate;private String phone;public Actor() {//一定要给一个无参构造器[反射需要]}public Actor(Integer id, String name, String sex, Date borndate, String phone) {this.id = id;this.name = name;this.sex = sex;this.borndate = borndate;this.phone = phone;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBorndate() {return borndate;}public void setBorndate(Date borndate) {this.borndate = borndate;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "\nActor{" +"id=" + id +", name='" + name + '\'' +", sex='" + sex + '\'' +", borndate=" + borndate +", phone='" + phone + '\'' +'}';}}
测试程序:package li.jdbc.datasource;import org.junit.Test;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.Date;public class JDBCUtilsByDruid_Use {//使用土方法尝试解决ResultSet问题==封装=>ArrayList@Testpublic void testSelectToArrayList() {//也可以设置返回值System.out.println("使用druid方式完成");//1.得到连接Connection connection = null;//2.组织一个sql语句String sql = "Select * from actor where id >=?";//3.创建PreparedStatement对象PreparedStatement preparedStatement = null;ResultSet set = null;ArrayList<Actor> list = new ArrayList<>();//创建ArrayList对象,存放actor对象try {connection = JDBCUtilsByDruid.getConnection();preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, 1);//给?号赋值//执行sql,得到结果集set = preparedStatement.executeQuery();//遍历该结果集while (set.next()) {int id = set.getInt("id");String name = set.getString("name");String sex = set.getString("sex");Date borndate = set.getDate("borndate");String phone = set.getString("phone");//把得到的当前 resultSet的一条记录,封装到一个Actor对象中,并放入arraylist集合list.add(new Actor(id,name,sex,borndate,phone));}System.out.println("list集合数据="+list);//orfor (Actor actor:list) {System.out.println("id="+actor.getId()+"\t"+"name="+actor.getName());}} catch (SQLException e) {e.printStackTrace();} finally {//关闭资源(不是真的关闭连接 , 而是将Connection对象放回连接池中)JDBCUtilsByDruid.close(set, preparedStatement, connection);}//因为ArrayList 和 connection 没有任何关联,所以该集合可以复用//return list;}}
文章插图
10.5.3Apache-DBUtils
- 基本介绍
commons-dbutils是Apache组织提供的一个开源 JDBC工具类库,它是对 JDBC的封装,使用dbutils能极大简化 JDBC编码的工作量 。
- DbUtils类
- QueryRunner类:该类封装了SQL的执行,是线程安全的 。可以实现增、删、改、查、批处理
- 使用QueryRunner类实现查询
- ResultSetHandler接口:该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式
推荐阅读
- 一篇文章让你搞懂Java中的静态代理和动态代理
- iPhone13ProMax和12ProMax拍照对比_哪款拍照更好
- 三星1080和麒麟990哪个好_三星1080和麒麟990对比
- 带走一盏-“带走一盏渔火,让它温暖我的双眼……”选自《涛声依旧》,其歌词和意境借 ...
- iqoo9pro和小米12pro哪个好-iqoo9pro和小米12pro参数对比
- vivox70pro+和OPPOfindX3对比_哪款更值得入手
- applewatchseries7蜂窝版和普通版对比_哪款更值得买
- 小米12x和真我gt大师探险版哪个好-小米12x和真我gt大师探险版参数对比
- vivoX70pro和OPPOfindx3哪个好_参数对比
- day48-JDBC和连接池04