个人理解: 最开始我们使用druid连接池来连接数据库,我们通过DruidDataSourceFactory来获取一个数据源对象,在创建的时候, 传入一个druid.properties配置文件(这个配置文件包括了注册驱动driver,url user等等,这些都是连接数据的必要信息) 读取连接数据库相关信息,然后返回一个dataSource,这个dataSource就是存放连接的地方了,也就是连接池 我们利用这个数据源对象dataSource dataSource.getConnection()返回一个Connection, 我们在通过这个connection(这个connection已经跟mysql数据库连接起来了)返回一个preparedStatement 那么这个preparedStatement就是我们真正执行sql语句的地方了,编写一个sql语句,比如说,查询语句 利用preparedStatement.executeQuery(),会返回一个resultSet,这个resultSet就可以把它看作一张表了 利用这个resultSet.next方法,最开始是指向该表的第一行的前一行,调用完resultSet.next就会指向下一行 然后关闭resultSet,connection,preparedStatement资源,然后我们就会发现一个问题,如果我们关闭了resultSet 那么我们就不能查看表的内容了,因为连接数据库的connection已经断开了,然后我们就想到一个土办法,我们可以在读取完表中 的数据后,我们编写一个类,这个类的属性与表的列一一对应,把这些数据封装到我们编写的类中,表的一行就代表一个对象 然后我们就把这一个个对象封装到Arraylist集合中。那么我们可以使用DBUtils这个封装类的方法将数据如上述描述保存到Arraylist 我们引入 阿帕奇.dbutils.jar包,这个包有一个QueryRunner,目前我对这个类不是很了解,但它有一个方法query, 这个方法就可以传入我们通过德鲁伊连接池返回的连接Connection,还有组织的sql语句, 还有一个用于反射的BeanListHandler<>(Actor.class),这个用于底层的反射,反射类的结构,将数据以这个类结构封装起来 还要传入一个可变形参,那么底层会通过我们传入的connection和sql语句返回一个preparedStatement,注意我们是不用关闭resulSet,preparedStatement,query方法底层会帮我们关闭, 但是connection要我们自己关闭