DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。简要来说就是配合数据库连接池简化对数据库的操作代码,数据库连接池简化了连接操作,而DBUtils简化了增删改查操作,底层由DbUtils工具实现,我们只需要关注用法和了解实现逻辑即可。
ArrayHandler:查询到的单个数据封装成一个数组
ArrayListHandler:查询到的多个数据封装成多个集合,集合里的元素是数组
(最常用)BeanHandler:查询到的单个数据封装成一个对象
(最常用)BeanListHandler:查询到的多个数据封装成一个List<对象>
MapHandler:查询到的单个数据封装成一个map
MapListHandler:查询到的多个数据封装一个集合,集合里面的元素是map
queryRunner.update(sql):针对增加、删除、修改
queryRunner.query(sql,rsh):针对查询
步骤:
1、导DBUtilsjar包,mysql驱动,c3p0包。从网上下载即可。
2、配置c3p0的配置文件(如果不了解c3p0的同学建议先了解c3p0,因为c3p0和DBUtils需一起使用)
3、基本操作演示
①增删改方法演示:
②查询方法演示:
--针对单条或多条数据的老版用法--(适合了解实现原理,不建议使用,被下面两个方法所替代):
--查询单条数据即返回单个对象--(现在常用)
BeanHadnler类实现了ResultSetHandler接口,帮我们实现了handle方法对数据的封装,简单来说就是根据类的字节码文件生成对象,然后帮我们把数据库查询出的数据封装成对象然后返回给我们。
--查询多条数据即返回一个List<对象>--(现在常用)
实现原理与上面一致,只是调用方法不同返回值类型不同。
1、使用BeanHadnler类和BeanListHandler类有一点需要注意,这两个类帮我们实现了对查询数据的封装,但是封装是根据类中的set方法将数据库返回数据封装的,假设你数据库表中有四个属性:id,name,age,sex,但是你的接收对象只有name和age两个成员变量,它在类中只匹配到了name和age的set方法,就只会将这两个成员变量赋值封装,所以不要求接收对象的成员变量和数据库的属性个数完全一致。
2、因为是根据对象中set方法匹配赋值,所以set方法名是有格式要求的,如果set方法名不对,封装时就会找不到对象中成员变量对应的set方法,则程序默认此对象中没有此成员变量。假设数据库中有一个属性名为sname,对象中需要接收此属性,则set方法格式为:set+sname(sname可以五个字符可以任意大小写),BeanHadnler类和BeanListHandler类的实现并不是匹配类中成员变量名,而是匹配对象中成员变量对应的set方法名进行赋值封装。
举例演示:
----数据库student表列名:
----Student类,为了演示方便我只接收一个sname属性
----测试代码:
①Student类中成员变量名与数据库一致为sname,且set方法名为setSname
输出结果:
②Student类中成员变量名不与数据库一致,为name,但set方法名依旧为setSname
③Student类中成员变量名与数据库一致为sname,但set方法名为setsname
④Student类中成员变量名不与数据库一致,为name,但set方法名为setSNaMe
⑤Student类中成员变量名与数据库一致为sname,但set方法名为setname
输出结果:
结论:根据①②可以排除封装是通过匹配成员变量名的可能,根据③④⑤可以得出结论set+数据库属性名(不论大小写),则可以匹配成功,若set+名字与数据库属性名不一致,则匹配失败。
①BeanHadnler类和BeanListHandler类的实现并不根据类中成员变量名进行匹配赋值封装。
②BeanHadnler类和BeanListHandler类的实现是根据set+数据库返回值列名(大小写不论)方法进行匹配封装。