在使用apache的第三方来处理结果集时,我们需要有一些准备工作:
1.首先下载并导入sun公司的mysql-connector-java-5.1.37-bin.jar包,该包主要作用是注册连入mysql数据库的驱动,然后获得数据库的连接connection
2.然后下载并导入Apache公司的jar包:commons-dbutils-1.6.jar,该jar包中我们主要是利用jar包中的方法来处理数据库返回的结果集
我们使用dbutil的jar包中的三个类:
①用QueryRunner类来处理结果集,QueryRunner方法中的方法都是对象方法
②用DbUtil类来关闭资源,DbUtil类中封装了几个关闭资源的方法,并且内部已经处理了异常
③ResultSetHandler接口:根据不同的返回数据来用接口的不同实现类来处理数据
例如:查询数据库school中的student表格中的数据

QueryRunner qRunner = new QueryRunner();
Class.forName("com.mysql.jdbc.Driver");//注册驱动
//连接数据库
Connection connetion =  DriverManager.getConnection("jdbc:mysql://localhost:3306/school","root","123456");

QueryRunner类对象在连接数据库时,根据不同的sql指令,有不同的方法;
① 当对数据库的操作是insert into ,update,delete的时候:

String sql = "update student set sname = ?,id = ?,gender = ?"
//第一个参数connection就是和数据库建立连接获得的连接类
//第二个sql就是要执行的sql语句
//第三,第四和第五个分别对应着sql语句中的?,这样是为了防止sql注入,改变了sql语句原本的指令
 in row = qRunner.update(connection,sql,"hehe",1,"nan");//返回值表示的是受sql指令影响的数据的行数
//sql语句中的参数也可以封装到一个数组中
 Object[] array = {"hehe",2,"nan"};
 qRunner.update(connection,sql,array);//这种方式也是可以防止sql注入,改变mysql原本的指令
②  当对数据库中的数据做查询操作的时候
String sql = "select * from student";
          qRunner.Query(connection,sql,ResultSetHandler接口实现类的一个对象);
ResultSetHandler接口的实现类有很多,根据我们队结果处理的方法不同可以分为八类:
 ①结果集第一种处理方法:ArrayHandler:将查询出来的数据中的第一行数据放到一个对象数组中并返回
Object[] res= qRunner.Query(connection,sql,new ArrayHandle());//返回值是一个数组
②结果集第二种处理方法:ArrayListHandler:查询数据库中的每一条数据,全部放到list集合中,每一条数据都是一个对象数组
List<Object[]>list = qRunner.Query(connection,sql,new ArrayListHandler());//返回值是一个集合
③结果集第三种处理方法:BeanHandler:将结果集的第一行封装成一个JavaBean对象
 javaBean对象是指自定义对象中要满足:①成员变量全部私有化②提供成员变量的set/get方法③提供空参构造方法
//首先要创建一个自定义对象student,要复合javaBean规范
   Student student = qRunner.Query(connection,sql,new BeanHandle<Student>(Student.class));//这样就把第一行的数据全部装到一个student对象中了
④结果集第四种处理方法:BeanListHandler:将结果集中每一行数据封装成JavaBean对象,然后将所有对象存放在集合中
List<student> list = qRunner.Query(connection,sql,new BeanList<Student>(Student.class));//集合的泛型就是student,返回的集合就是所有的数据
⑤结果集第五种处理方法:ColumnListHandler:返回指定的列的那一整列对应的数据
//⚠️⚠️⚠️这里我们需要注意一下:我们要查询的那一列一定要在sql语法返回的结果集中存在,如果我们查询的字段名在mysql语句中没有,则查询不到
  List list = qRunner.Query(connection,sql,new ColumnListHander<>("字段名"));
  //⚠️⚠️⚠️这里我们需要注意一下:这里面下角标只的是要查的字段在sql语句查的一组字段中的下角标
  List list = qRunner.Query(connection,sql,new ColumnListHandler<>(下角标));
⑥结果集第六种处理方法:ScalarHandler:对于查询结果只有一个的时候,可以使用ScalarHandler,例如求数据库聚合函数count,avg,sum,min.max
qRunner.Query(connection,sql,new ScalarHandler(返回值的数据类型));//只有一个返回值
⑦结果集第七种处理方法:MapHandler:将结果集的第一行数据已键值对的形式存储到map集合中
Map map = qRunner.Query(connection,sql,new MapHandler());//返回值是一个map集合
          //对map进行遍历就可以获得数据了
          for(String key: map.keySet)
          {
           System.out.println(map.get(key));
          }
⑧结果集第八种处理方法:MapListHandler:将结果集的每一行数据已键值对的形式存储到map集合中,再讲所有的map集合装到一个list集合中
List<Map> list = qRunner.Query(connection,sql,new MapListHandler<>());
        //对集合遍历
        for(Map map:list)
        {
            for(String key:map.keySet)
            {
            System.out.println(map.get(key));
            }
        }

数据库连接池
因为我们在连接数据库和删除资源的时候是特别消耗内存的,为了提高系统的运行效率,这时候我们可以创建一个数据库连接池
数据库连接池可以这样理解:连接池中有多条处于闲置状态的connection,当有程序要连接数据库的时候,就与连接池中的一个connection连接,当不连接的时候connection就再放回数据库连接池中
数据库连接池规范:DataSource(接口)
由数据库厂商来提供数据库连接池接口的实现类,常用的数据库连接池有两种:DBCP C3P0;
虽然第三方的接口实现类中封装了数据库的连接方法,但是在创建数据库连接池的时候,我们需要做一些设置:
①设置注册连接的数据库的驱动
②设置连接数据库的链接地址,数据库的用户名和登录密码
还有一些扩展的设置:
①设置数据库连接池的初始连接数
②设置数据库最大能同时连接的条数
③设置数据库中最大的闲置的连接条数,多余的条数关闭掉
④设置数据库中最小的闲置的连接条数,如果不够就创建新的连接
下面来实现以下数据库连接池的创建

BasicDataSource source = new BasicDataSource();
//基础设置:
source.setDriverClassName("cpom.mysql.jdbc.Driver");
source.setUrl("jdbc:mysql://localhost:3306/student");
source.setUserName("root");
source.setPassword("123456");
//扩展设置
//初始连接数有10个
source.setInitialSize(10);
//最大同时连入5条
source.setMaxActive(6);
//最多处于闲置状态的连接数为6
source.setMaxIdle(6);
//最小处于闲置状态的连接数为6
source.setMinIdle(2);
//数据库连接池设置好了,下面我们开始连入数据库,并查询数据
QueryRunner runner = new QueryRunner(source);//直接连入连接池
String sql = "select * from student";
 Student student = runner.Query(sql,new Beanhandler<Student>(Student.class));

当在创建QueryRunner类的对象的时候,连入连接池的时候,下面的操作就是用上面说到的8类对象来处理结果集