技术经验分享:DBUtils详解

简介: 技术经验分享:DBUtils详解

DBUtils是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用DBUtils能极大简化JDBC编码的工作量,同时也不会影响程序的性能。


DBUtils三个核心功能:


QueryRunner类,提供对sql语句操作的API;


ResultSetHandler接口,用于定义select操作后,怎样封装结果集;


DbUtils类,它是一个工具类,定义了关闭资源与处理事务的方法。


一、QueryRunner


使用QueryRunner类简化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。


构造QueryRunner,


QueryRunner中一共有6种方法:


execute(执行SQL语句)


batch(批量处理语句)


insert(执行INSERT语句)


insertBatch(批量处理INSERT语句)


query(SQL中 SELECT 语句)


update(SQL中 INSERT,UPDATE,或 DELETE 语句)


我们主要介绍最后两种(最常用):


1、query方法


query方法的重载形式有很多种,常用的有两种形式:


(1)T query(String sql, ResultSetHandler rsh) 不需要替换参数来执行给定的SELECT语句


(2)T query(String sql, ResultSetHandler rsh, Object... params) 需要一个或多个替换参数来执行给定的SELECT语句,并返回一种对象结果。


2、update方法


(1)int update(Connection conn, String sql) 不需要替换参数来执行INSERT,UPDATE,DELETE语句(参数还需要一个连接)


(2)int update(Connection conn, String sql, Object... params) 需要一个或多个替换参数以及一个数据库连接来执行INSERT,UPDATE,DELETE语句(参数还需要一个连接)


(3)int update(Connection conn, String sql, Object param) 需要一个替换参数,以及一个数据库连接来执行INSERT,UPDATE,DELETE语句(参数还需要一个连接)


(4)int update(String sql) 不需要替换参数来执行给定的INSERT,UPDATE,DELETE语句(参数无需带有连接)


(5)int update(String sql, Object... params) 需要一个或多个替换参数来执行INSERT,UPDATE,DELETE语句(参数无需带有连接)


(6)int update(String sql, Object param) 不需要替换参数来执行INSERT,UPDATE,DELETE语句(参数无需带有连接)


二、ResultSetHandler


对于结果集的处理有以下几个结果集处理器:


1、ScalarHandler


本方法是用于处理单行单列的数据,多用于聚合函数的查询。


但是,有一个点需要注意,就是当聚合函数是涉及到数字类型的时候,一定要注意返回值类型的转换。


有的人会选用Integer,long等类型,这些严格来说都是不合法的。例如,long类型最大只能容纳20的阶乘,21的阶乘就会包异常,所以我们要选用Number(这个是所有数据类型)的父类,并且对外提供的有Number.intValue()和Number.LongValue()等方法。


// 名字的第一个


public void testScalarHandler() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select name from tb_user where id =?";


Object object = queryRunner.query(sql, new ScalarHandler(), 1);


System.out.println(object.toString());


}


// 名字的第一个


public void testScalarHandler1() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user where id =?";


Object object = queryRunner.query(sql, new ScalarHandler("name"), 1);


System.out.println(object.toString());


}


// 第二列的第一个


public void testScalarHandler2() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user where id =?";


Object object = queryRunner.query(sql, new ScalarHandler(2), 1);


System.out.println(object.toString());


}


// 获取数据库中总共有多少条数据 (单行单列)


public void testCount() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select count() from tb_user";


Number num = (Number) queryRunner.query(sql, new ScalarHandler());


System.out.println(num.intValue());


}


2、BeanHandler


将结果集中的第一行数据封装到一个对应的JavaBean实例中。


本方法多用于在处理把单行结果集封装成JavaBean对象(对象时通过反射完成创建的)


public void testBeanHandler() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user where id =?";


User user = queryRunner.query(sql, new BeanHandler(User.class), 1);


System.out.println(user.toString());


}


3、BeanListHandler


将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。


public void testBeanListHandler() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user";


List list = queryRunner.query(sql, new BeanListHandler(User.class));


for (int i = 0; i < list.size(); i++) {


System.out.println(list.get(i).toString());


}


}


4、BeanMapHandler


将结果集中的每一行数据都封装到一个JavaBean里,再把这些JavaBean再存到一个Map里,其key为指定的列。


public void testBeanMapHandler() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user";


Map map = queryRunner.query(sql, new BeanMapHandler(User.class, "name"));


for (Map.Entry entry : map.entrySet()) {


System.out.println(entry.getKey() + " : " + entry.getValue());


}


}


5、MapHandler


将结果集中的第一行数据封装到一个Map里,key是表中的列名,value就是对应的值。


public void testMapHandler() throws SQLException {


QueryRunner //代码效果参考:http://www.jhylw.com.cn/515039889.html

queryRunner = new QueryRunner(C3P0Utils.getDataSource());

String sql = "select from tb_user where id =?";


// map中键是列名 ,值是列所对应的值


Map map = queryRunner.query(sql, new MapHandler(), 1);


for (Map.Entry m : map.entrySet()) {


System.out.println(m.getKey() + " = " + m.getValue());


}


}


6、MapListHandler


将结果集中的每一行数据都封装到一个Map里,然后再存放到List中。


public void testMapListHandler() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user";


List

for (int i = 0; i < list.size(); i++) {


Map map = list.get(i);


System.out.println(i + "====");


for (Map.Entry m : map.entrySet()) {


//代码效果参考:http://www.jhylw.com.cn/595141839.html

System.out.println(m.getKey() + " = " + m.getValue());

}


}


}


7、ColumnListHandler


将结果集中某一列的数据存放到List中。


public void testColumnListHandler1() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select name from tb_user";


List list = queryRunner.query(sql, new ColumnListHandler());


for (int i = 0; i < list.size(); i++) {


System.out.println(list.get(i).toString());


}


}


public void testColumnListHandler2() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user";


// 列的index从1开始


List list = queryRunner.query(sql, new ColumnListHandler(2));


for (int i = 0; i < list.size(); i++) {


System.out.println(list.get(i).toString());


}


}


public void testColumnListHandler3() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user";


List list = queryRunner.query(sql, new ColumnListHandler("name"));


for (int i = 0; i < list.size(); i++) {


System.out.println(list.get(i).toString());


}


}


8、ArrayHandler


把结果集中的第一行数据转成对象数组。


public void testArrayHandler() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user where id =?";


Object【】 objects = queryRunner.query(sql, new ArrayHandler(), 1);


for (int i = 0; i < objects.length; i++) {


System.out.println(objects【i】.toString());


}


}


9、ArrayListHandler


把结果集中的每一行数据都转成一个对象数组,再存放到List中。


public void testArrayListHandler() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select from tb_user";


List list = queryRunner.query(sql, new ArrayListHandler());


for (int i = 0; i < list.size(); i++) {


Object【】 objects = list.get(i);


System.out.println(i + "===");


for (int j = 0; j < objects.length; j++) {


System.out.println(objects【j】.toString());


}


}


}


10、KeyedHandler


将结果集中的每一行数据都封装到一个Map里,再把这些Map再存到一个Map里,其key为指定的列。


public void KeyedHandler() throws SQLException {


QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());


String sql = "select * from tb_user";


// 查询结果:把每一条查到的结果封装到map中,把这条数据对应的列名当作map的key存储,把这条数据对应的列的值当作map的value存储,


// 再把每一条的数据的map存入到另一个大map中,把该条数据的唯一标识id当作key存储,这条数据的map当作大map的value存储。


Map

for (Map.Entry

Integer id = m.getKey();


System.out.println(id + ":"); // 每一条数据的id


Map m1 = m.getValue();


for (Map.Entry m2 : m1.entrySet()) {


// key:列名, value:列的值


System.out.println(m2.getKey() + " = " + m2.getValue());


}


}


}

相关文章
|
5月前
|
druid 数据库
杨校老师课堂之基于阿里巴巴的数据库连接池Druid的工具类开发
杨校老师课堂之基于阿里巴巴的数据库连接池Druid的工具类开发
37 0
|
5月前
|
Apache 数据库
杨校老师课堂之基于Apache的数据库连接池DBCP的工具类开发
杨校老师课堂之基于Apache的数据库连接池DBCP的工具类开发
27 0
|
5月前
|
SQL Java 数据库连接
技术经验分享:Hibernate之HQL
技术经验分享:Hibernate之HQL
29 0
|
6月前
|
NoSQL Dubbo Java
StringBoot编程式事务与声明式事务java工程师面试突击第一季
StringBoot编程式事务与声明式事务java工程师面试突击第一季
|
6月前
|
JavaScript 前端开发 Java
Alibaba内部出品“Java初学者宝典”,让你就业没压力
我常常在想,近些年来互联网行业裁员情况越来越严重,为什么还是会有特别多的人挤破脑袋想要入这一行,尤其是大部分已经工作的人也会想着要转行来学习编程,再根据今年的高考志愿填报情况来看,很明显,计算机学科已经成为热门行业,那对于刚刚入学的新生以及想要转行的人来说,怎么开始学习一门编程语言,确实是一大难题。
|
消息中间件 缓存 NoSQL
java面试项目三:在线教育
XX在线教育是垂直的小学、初中、高中知识学习网站,课程紧跟前沿理念,帮助学生在当今课程体系体量压力较大的环境下,保证学生学习成绩提高,课程设置科学,满足不同基础用户的学习需求,快速匹配学习路线,使教育资源共享化,降低了学习门槛,课程主要分为免费课,VIP课,付费课三种,平台主要通过课程抽成,VIP会费及广告收费收取利益,平台主要分为网站前台,运营商后台,讲师后台等三方面组成
243 0
|
设计模式 算法 架构师
硬核!阿里出品2023版Java架构师面试指南,涵盖Java所有核心技能
最近很多粉丝朋友私信我说:熬过了去年的寒冬却没熬过现在的内卷;打开Boss直拒一排已读不回,回的基本都是外包,薪资还给的不高,对技术水平要求也远超从前;感觉Java一个初中级岗位有上千人同时竞争,内卷程度简直怀疑人生。
|
网络协议 算法 安全
阿里巴巴首推“Java进阶必备宝典”,理论到实战,一键搞定
作为一名Java方向的程序员,打好夯实的基础是非常重要的,现在大厂面试对于程序员基础知识的掌握考察也越来越严格,虽然说现在技术更新比较快,但基础扎实才能够更深入的去理解每一个知识技术点。
阿里巴巴首推“Java进阶必备宝典”,理论到实战,一键搞定
|
消息中间件 架构师 NoSQL
Java面试很难?啃完阿里老哥这套Java架构速成笔记,我都能拿30K
最近有不少小伙伴在后台留言,说 Java 的面试越来越难了,尤其是技术面,考察得越来越细,越来越底层。
Java面试很难?啃完阿里老哥这套Java架构速成笔记,我都能拿30K
|
SQL Java 数据库连接
老杜JDBC基础入门视频教程,轻松掌握jdbc基础+核心技术(来自动力节点)
JDBC是Sun提供的一套数据库编程接口API函数,由Java语言编写的类、界面组成。 JDBC API 的设计初衷就是为了让简单的事情更简单,这意味着JDBC使得执行所有数据库任务都更容易. 用JDBC写的程序能够自动地将SQL语句传送给相应的数据库管理系统。不但如此,使用Java编写的应用程序可以在任何支持Java的平台上运行,不必在不同的平台上编写不同的应用。 Java和JDBC的结合可以让开发人员在开发数据库应用程序时真正实现“WriteOnce,RunEverywhere!”
236 0