MYSQL 之 JDBC(十六): DBUtils
DBUtils是Apache组织提供的一个开源的JDBC工具类库,能极大简化jdbc编码的工作量
API介绍
- QueryRunner
- ResultSetHandler
- 工具类DbUtils
用DBUtils进行增删改查操作:update
查的操作要使用QueryRunner
自定义返回值的操作:MyResultSetHandler
返回一个类的操作(单条记录):BeanHandler
返回一个类的操作(多条记录):BeanListHandler
返回一个Map的操作(单条记录):MapHandler
返回多个Map的操作(多条记录):MapListHandler
返回一个值的操作(单行单列):ScalarHandler
代码

package com.litian.jdbc; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*; import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* @author: Li Tian
* @contact: litian_cup@163.com
* @software: IntelliJ IDEA
* @file: DBUtilsTest.java
* @time: 2020/4/7 12:09
* @desc: |测试DBUtils工具类
*/ public class DBUtilsTest {
public static void main(String[] args) {
// testUpdate();
// testQuery();
// testBeanHanlder();
// testBeanListHanlder();
// testMapHanlder();
// testMapListHanlder();
testScalarHanlder();
} /**
* ScalarHandler:把结果集转为一个数值(可以是任意基本数据类型和字符串)
* 默认返回第1列第1行的值,所以多行多列也就返回第一个值
*/
public static void testScalarHanlder() {
// 1. 创建QueryRunner的实现类
QueryRunner qr = new QueryRunner();
Connection conn = null;
try {
conn = JDBCTools.getDSConnection();
String sql = "select username from t_user where id > ? && id < ?";
Object result = qr.query(conn, sql, new ScalarHandler(), 2, 5);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null, null, conn);
}
} /**
* MapListHandler:将结果集转为一个Map的list
* Map对应查询的一条记录:键:sql查询的列名(不是列的别名),值:列的值。
* 而MapListHandler:返回的是多条记录对应的Map的集合。
*/
public static void testMapListHanlder() {
// 1. 创建QueryRunner的实现类
QueryRunner qr = new QueryRunner();
Connection conn = null;
try {
conn = JDBCTools.getDSConnection();
String sql = "select id, username, pwd from t_user where id > ? && id < ?";
List<Map<String, Object>> u = qr.query(conn, sql, new MapListHandler(), 2, 5);
System.out.println(u);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null, null, conn);
}
} /**
* MapHandler:返回sql对应的第一条记录对应的Map对象
* 键:sql查询的列名(不是列的别名),值:列的值。
*/
public static void testMapHanlder() {
// 1. 创建QueryRunner的实现类
QueryRunner qr = new QueryRunner();
Connection conn = null;
try {
conn = JDBCTools.getDSConnection();
String sql = "select id, username, pwd from t_user where id > ? && id < ?";
Map<String, Object> u = qr.query(conn, sql, new MapHandler(), 2, 5);
System.out.println(u);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null, null, conn);
}
} /**
* BeanListHandler:把结果集转为一个List,该List不为null,但可能为空集合(size()方法返回0)
* 若sql语句的确能够查询到记录,List中存放创建BeanListHandler传入的Class对象对应的对象。
*/
public static void testBeanListHanlder() {
// 1. 创建QueryRunner的实现类
QueryRunner qr = new QueryRunner();
Connection conn = null;
try {
conn = JDBCTools.getDSConnection();
String sql = "select id, username, pwd from t_user where id > ? && id < ?";
List<User> u = (List<User>) qr.query(conn, sql, new BeanListHandler(User.class), 2, 5);
System.out.println(u);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null, null, conn);
}
} /**
* BeanHandler:把结果集的第一条记录转为创建BeanHandler对象时传入的Class参数对应的对象。
*/
public static void testBeanHanlder() {
// 1. 创建QueryRunner的实现类
QueryRunner qr = new QueryRunner();
Connection conn = null;
try {
conn = JDBCTools.getDSConnection();
String sql = "select id, username, pwd from t_user where id = ?";
User u = (User) qr.query(conn, sql, new BeanHandler(User.class), 3);
System.out.println(u);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null, null, conn);
}
} /**
* QueryRunner的query方法的返回值屈居于其ResultSetHandler参数的handle方法的返回值
*/
public static void testQuery() { // 1. 创建QueryRunner的实现类
QueryRunner qr = new QueryRunner(); Connection conn = null;
try {
conn = JDBCTools.getDSConnection();
String sql = "select id, username, pwd from t_user";
Object obj = qr.query(conn, sql, new MyResultSetHandler());
System.out.println(obj); } catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null, null, conn);
} } /**
* 测试QueryRunner类的update方法
* 该方法可用于insert、update和delete
*/
public static void testUpdate() {
// 1. 创建QueryRunner的实现类
QueryRunner qr = new QueryRunner();
// 2. 使用update方法
String sql = "delete from t_user where id in (?, ?)"; Connection conn = null; try {
conn = JDBCTools.getDSConnection();
qr.update(conn, sql, 1, 2);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null, null, conn);
}
} // 静态内部类
static class MyResultSetHandler implements ResultSetHandler { @Override
public Object handle(ResultSet resultSet) throws SQLException {
// System.out.println("handle。。。");
// return "111";
List<User> us = new ArrayList<>();
while (resultSet.next()) {
Integer id = resultSet.getInt(1);
String username = resultSet.getString(2);
String pwd = resultSet.getString(3); User u = new User(id, username, pwd, new Date(System.currentTimeMillis()), new Timestamp(System.currentTimeMillis()));
us.add(u);
}
return us;
}
}
}
使用DBUtils编写通用的DAO(讲道理这波我是没看懂的,DBUtils直接用不香吗)

代码实现
DAO接口

package com.litian.jdbc; import java.sql.Connection;
import java.sql.SQLException;
import java.util.List; /**
* @author: Li Tian
* @contact: litian_cup@163.com
* @software: IntelliJ IDEA
* @file: DBUtilsDAO.java
* @time: 2020/4/8 10:56
* @desc: |访问数据的DAO接口
* 里面定义好访问数据表的各种方法
* T 是DAO处理的实体类的类型
*/ public interface DBUtilsDAO<T> { /**
* 批量处理的方法
*
* @param conn
* @param sql
* @param args 填充占位符的Object[] 类型的可变参数
*/
void batch(Connection conn, String sql, Object[]... args); /**
* 返回具体的一个值,例如总人数,平均工资,某一个人的email等。
*
* @param conn
* @param sql
* @param args
* @param <E>
* @return
*/
<E> E getForValue(Connection conn, String sql, Object... args); /**
* 返回T的一个集合
*
* @param conn
* @param sql
* @param args
* @return
*/
List<T> getForList(Connection conn, String sql, Object... args); /**
* 返回一个T的对象
*
* @param conn
* @param sql
* @param args
* @return
*/
T get(Connection conn, String sql, Object... args) throws SQLException; /**
* insert update delete
*
* @param conn 数据库连接
* @param sql sql语句
* @param args 填充占位符的可变参数
*/
void update(Connection conn, String sql, Object... args);
}
DAO接口的具体实现(以get方法为例)

package com.litian.jdbc; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler; import java.sql.Connection;
import java.sql.SQLException;
import java.util.List; /**
* @author: Li Tian
* @contact: litian_cup@163.com
* @software: IntelliJ IDEA
* @file: JdbcDaoImpl.java
* @time: 2020/4/8 11:07
* @desc: |使用QueryRunner提供其具体的实现
* <T>为子类需传入的泛型类型
*/ public class JdbcDaoImpl<T> implements DBUtilsDAO { private QueryRunner qr = null;
private Class<T> type; public JdbcDaoImpl(){
qr = new QueryRunner();
type = ReflectionUtils.getSuperClassGenricType(getClass());
} @Override
public void batch(Connection conn, String sql, Object[]... args) { } @Override
public List getForList(Connection conn, String sql, Object... args) {
return null;
} @Override
public Object get(Connection conn, String sql, Object... args) throws SQLException {
return qr.query(conn, sql, new BeanHandler<>(type), args);
} @Override
public void update(Connection conn, String sql, Object... args) { } @Override
public Object getForValue(Connection conn, String sql, Object... args) {
return null;
}
}
一个继承上面实现的子类,虽然啥也没写,但是方便以后扩展
package com.litian.jdbc; /**
* @author: Li Tian
* @contact: litian_cup@163.com
* @software: IntelliJ IDEA
* @file: UserDao.java
* @time: 2020/4/8 11:08
* @desc: |
*/ public class UserDao extends JdbcDaoImpl<User> {
}
使用上面这个子类,看看能否完成DAO的功能

package com.litian.jdbc; import java.sql.Connection; /**
* @author: Li Tian
* @contact: litian_cup@163.com
* @software: IntelliJ IDEA
* @file: UserDaoTest.java
* @time: 2020/4/8 11:10
* @desc: |
*/ public class UserDaoTest { UserDao ud = new UserDao(); public static void main(String[] args){
new UserDaoTest().testGet();
} public void testGet(){
Connection conn = null;
try {
conn = JDBCTools.getDSConnection();
String sql = "select id, username, pwd from t_user where id = ?";
User u = (User) ud.get(conn, sql, 3);
System.out.println(u);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null, null, conn);
}
}
}
————————————————
版权声明:本文为CSDN博主「李英俊小朋友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21579045/article/details/105386353
MYSQL 之 JDBC(十六): DBUtils的更多相关文章
- mysql进阶(二十六)MySQL 索引类型(初学者必看)
mysql进阶(二十六)MySQL 索引类型(初学者必看) 索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型. 在数 ...
- 50个SQL语句(MySQL版) 问题十六
--------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...
- MySQL学习笔记十六:锁机制
1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...
- MYSQL数据库学习十六 安全性机制
16.1 MYSQL数据库所提供的权限 16.1.1 系统表 mysql.user 1. 用户字段 Host:主机名: User:用户名: Password:密码. 2. 权限字段 以“_priv”字 ...
- MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询
1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...
- OSGi 系列(十六)之 JDBC Service
OSGi 系列(十六)之 JDBC Service compendium 规范提供了 org.osgi.service.jdbc.DataSourceFactory 服务 1. 快速入门 1.1 环境 ...
- 我的MYSQL学习心得(十六) 优化
我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 数据库 MySQL Jdbc JDBC的六个固定步骤
*0 案例: a)在JavaScript中使用正则表达式,在JS中正则表达式的定界符是:// var regexp = /^[0-9]+$/; if(regexp.test(nu ...
- mysql进阶(十六)常见问题汇总
mysql进阶(十六)常见问题汇总 MySQL视图学习: http://www.itokit.com/2011/0908/67848.html 执行删除操作时,出现如下错误提示: 出现以上问题的原因是 ...
- Java开发笔记(一百四十六)JDBC的应用原理
关系数据库使得海量信息的管理成为现实,但各家数据库提供的编程接口不尽相同,就连SQL语法也有所差异,像Oracle.MySQL.SQL Server都拥有自己的开发规则,倘若Java针对每个数据库单独 ...
随机推荐
- 测试-spring源码摘取
首次加载idea是真的慢... 也许是我电脑性能太差... 我分析他内部有一套索引的机制,需要每次打开现建立... 没有固态的话,首次打开还不如eclipse 第一次使用博客园,以前都在csdn混~ ...
- Android学习笔记Intent二
上篇随笔大概写了了Intent学习的大纲,这篇通过代码理解下Intent的ComponentName属性的使用 ComponentName,中文意思是组件名称,通过Intent的setsetCompo ...
- rust 支持的CPU架构
Available CPUs for this target: native - Select the CPU of the current host (currently haswell). amd ...
- 【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?
写在前面 在前面的文章中,我们知道可以通过多种方式向Spring容器中注册bean.可以使用@Configuration结合@Bean向Spring容器中注册bean:可以按照条件向Spring容器中 ...
- 13.DRF-版本
Django rest framework源码分析(4)----版本 版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db imp ...
- 如何用 React 构建前端架构
早期的前端是由后端开发的,最开始的时候仅仅做展示,点一下链接跳转到另外一个页面去,渲染表单,再用Ajax的方式请求网络和后端交互,数据返回来还需要把数据渲染到DOM上.写这样的代码的确是很简单.在We ...
- IDEA 使用jebel热部署插件启动失败
在使用Jebel热部署插件开发springmvc时,启动会出现内存溢出错误.可在配置Tomcat时增加JVM参数解决. -Xms768m -Xmx768m -XX:PermSize=64M -XX:M ...
- express高效入门教程(2)
2.请求和响应 2.1.请求相关 2.1.1.返回一个html页面 // 注意path模块需要先引入 app.get('/', function (req, res){ res.sendFile(pa ...
- js语法基础入门(4)
4.运算符 4.1.什么是运算符? 运算符就是用来表示具体运算规则的符号,例如数学计算中的加减乘除就是具体的运算规则,我们分别用"+ - * /"等符号来表示 4.2.运算符的分类 ...
- 查看Oracle当前用户下的(表视图,同义词...)
查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件) 0.表空间 SQL>select username,default_tablespace from ...