说明:eclipse创建的Maven web项目,读《架构探险》第二章,在JDBC方面由浅入深,这正是我一直需要的。
一、我的做法。
写一个DBConnection类,提供getConnection()、closeConnection()方法,MySQL配置信息同样写在这个类里,然后在static代码块里Class.forName("com.mysql.jdbc.Driver")加载JDBC驱动。
然后,这个类伴随我好久,可以复制到其他地方,直接修改url就可以了,但是在持久层里,免不了建立新的Connection,Statement,ResultSet,还需要手动关闭Connection,Statement,ResultSet,还需要使用try-catch异常处理,很不方便,特别是在弄一个较大数据量的数据表查询更新操作时,数据库限制了获取连接的数量,导致运行失败。
二、这本书作者的做法总结。
1.第一阶段。
main/java/resources下建立config.properties配置MySQL
main/java/util下建立PropsUtil.java可以读取配置文件,通过Properties对象的getProperty("jdbc.username")获取配置信息
mian/java/service下的CustomerService.java提供Customer的增删改查,在这里建立static代码块通过PropsUtil.java加载配置信息和JDBC驱动,在getCustomerList()里通过DriverManager获取Connection,然后通过新建PreparedStatement、ResultSet获得数据集,再通过whihle(rs.next())遍历新建Customer,最后返回customerList。
2.第二阶段。
main/java/helper下建立DatabaseHelper.java,把原来CustomerService.java里的static代码块剪切到DatabaseHelper.java,并提供getConnection()方法,获取Connection对象,提供closeConnection()方法,关闭Collection。CustomerService.java使用DatabaseHelper提供的getConnection()获取Connection,仍然需要通过PreparedStatement,ResultSet获取数据集,通过while遍历并新增Customer到customerList。
3.第三阶段。
使用Apache Commons DbUtils提供的QueryRunner对象,在DatabaseHelper里新增queryEntityList()方法,只要提供Customer类的类类型和sql语句就能获取对象列表,该类能够组装sql语句并进行查询,包含反射、泛型两个概念。
4.第四阶段。
使用ThreadLocal管理Connection,通过提供对象的副本,“以空间换安全”策略,隐藏了Connection的创建和关闭。
5第五阶段。
使用Apache DBCP数据库连接池,就不在需要closeConnection(),解决最原始的不断新建、关闭Connection的操作。
三、总结
第三阶段使用DbUtils是简化代码的一大进步,最终实现了书中在CustomerService.java里两三行代码实现对象的增删改查。
内心立下个小目标:以后再也不自己创建Statement和ResultSet了,自己应该也可以写一个类似DbUtils的组装sql语句的方法,有空要尝试一下。