apache commons-dbutils的使用心得:
apahce commons-dbutils是apache基金会Commons项目下的一个小组件,旨在简化JDBC的开发.其实在实际的开发中,JDBC代码是简单的,并且写多了是乏味的,还有可能因为忘记关闭资源而造成内存泄漏.我们使用DBUtils有以下好处:
没有资源泄漏的可能性。正确的JDBC编码并不困难,但是耗时且乏味。这通常会导致可能难以追踪的连接泄漏(没有关闭资源)。
更清晰,更简单的持久化代码,在数据库中增删改查的代码量大大减少,剩下的代码仅仅表明了您的操作意图,而不会混淆资源清理工作
在查询操作中,将结果集数据自动封装至JavaBean的属性中,即不需要手动处理结果集
DBUtils有以下几个核心类
QueryRunner:简单理解就是封装了(加载注册驱动,获取连接对象,创建语句,执行,以及释放资源 ,封装了增删改查的方法
ResultSetHandler:结果集处理器,他是一个接口,定义了处理结果集的规范
BeanHandler:是ResultSetHandler的实现类,其中的query方法将结果集中的一行数据,封装到对应的JavaBean属性中
BeanListHandler:是ResultSetHandler的实现类,其中的query方法将结果集中的每一行数据,封装到对应的JavaBean属性中,并且将这一个个的JavaBean存入List集合中,返回
RowProcessor:将结果集中每一行数据转换为JavaBean
BasicRowProcessor:默认的作为RowProcessor的实现,它使用BeanProcessor将结果集中的每一行数据封装到JavaBean属性中
看几个例子:我这里有一个简单的表student,只有很简单的三个列,id,name,age:
首先我们来看看未使用DBUtils,使用普通的JDBC代码完成保存一条学生信息,代码是怎么写的,传入的是一个学生对象,Student类有三个字段,同数据库中的字段一致(id,name,age),因为我数据库中id是主键自增长,所以我这里不用保存id,数据库会自动生成
这里我使用静态语句Statement,没有使用预编译语句PreparedStatement
是不是感觉好麻烦,先要加载注册驱动,然后创建连接对象,然后创建语句对象,然后执行,最会还不能忘了释放资源,我这里讲释放资源的代码抽取到了JdbcUtil里面,不然代码更长
现在我们来看看我们使用DBUtils来操作我们的保存操作是什么样的(删除和修改操作其实是一样的哦)
如果你使用的是连接池连接到数据库的话:
这是我创建连接池的代码,希望对你有帮助,我这里从classpath的根路径去加载db.properties文件
代码如下
只需要给QueryRunner构造器中,传入一个连接池对象,创建一个QueryRunner对象,我这里将连接池的创建抽取到了一个JdbcUtil类中,然后将我们的sql语句创建出来,占位符用?表示
Object数组中存放的是占位符参数的实际值
最后调用QueryRunner的update方法,传入我们要执行的sql,和sql的占位符实际参数值即可
是不是相比上面使用Jdbc的代码简单许多了,也不用处理又臭又长的释放资源的代码了,当然如果你Jdbc写的不熟,刚开始我还是建议你使用Jdbc完成增删改查操作
2.如果你使用Connection对象,这时候你就得自己关闭资源
代码如下:
是不是感觉稍微能复杂那么一点点吧.
3.使用QeuryRunner完成DQL操作
这里有一个需求:查询id为2的学生的信息,也就是 李四
先来看看未使用DBUtils的纯JDBC代码是如何写的
和我上述的保存操作一样,又长又没什么技术含量:
在这里我们使用了DBUtils之后,我们的代码又有多简单呢
代码如下:
创建QueryRunner对象,执行该对象的query(String sql,ResultSetHandler rsh,Object...params),底层就会自动将结果集中的数据封装到T中去
query方法就会自动将我们的结果集中的数据封装到Student对象中,只需要给BeanHandler的构造器中传入JavaBean的字节码对象即可.
4.将结果集中的数据封装成List对象呢,代码其实是差不多的,只需要将ResultSetHandler的实现类,改成BeanListHandler即可,代码如下:
这条sql语句没有占位符参数,所有没有传入,实际参数
为什么这里ResultSetHandler中的泛型是List呢,是他的接口定义中规定的,返回值类型必须和接口泛型保持一致!
好了,有什么不对的地方,或者看不明白的地方,还请评论,我会知无不言言无不尽,,谢谢,,嘻嘻嘻