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针对每个数据库单独 ...
随机推荐
- Centos7下源编译安装Postgresql 并设置开机自动启动postgresql.serivce 服务相关研究
编写开机自动启动服务脚本: # cat >> /usr/lib/systemd/system/postgresql.service >> EOF [Unit] Descript ...
- EIGRP-14-EIGRP的命名模式
从IOS 15.0(1)M版本开始,工程师可以在路由器上使用命名模式(Named Mode)配置EIGRP进程.按照IPv4和IPv6,通过AS号来配置EIGRP进程的做法称为经典模式(Classic ...
- IOS App破解之路一 拿到appstore上的ipa
1, 在Mac电脑上的app store里搜索Apple Configurator2 并安装 2, iPhone手机连接Mac电脑 3, 登录Apple Configurator2 菜单栏, 账号 ...
- Mac App破解之路九 vscode插件破解
破解对象: luaide 破解目的:学习如何破解vscode插件 破解背景: vsscode用了这么多年,安装了很多插件,其中luaide插件是收费的. 说实话,100块并不贵, 我本来准备买的. ...
- 使用IDEA+Gradle构建Spring5源码并调试(手把手教程全图解)
一.前言 说一说我要写这篇文章的初衷吧,前段时间有小伙伴在微信群求教怎样构建spring源码,他在网上找了n个教程跟着后面花了两天时间都没构建好,正好我最近因工作原因从mac换成windows,开 ...
- Linux下搭建redis(源码编译)
[准备环境] Linux centos7 redis下载包 地址:http://www.redis.cn/download.html 前往下载稳定版本 [步骤] 1.下载成功后 把包上传到服务器 ...
- C# 9.0 新特性之只读属性和记录
阅读本文大概需要 2 分钟. 大家好,这是 C# 9.0 新特性系列的第 4 篇文章. 熟悉函数式编程的童鞋一定对"只读"这个词不陌生.为了保证代码块自身的"纯洁&quo ...
- 05、MyBatis 缓存
1.MyBatis缓存 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. 1).一级缓存 public Employee getEmpById( ...
- Java中的I/O流全汇总,所有的I/O就一张图
放大再看,注意视力!哈哈 一口吃不成胖子,一点一点的看: 大家都是文化人,拿图要指明出处!!! 头上↑那框,对,就是那 使用的是XMind软件画的,要源文件吗? 在这里:https://gith ...
- 3、尚硅谷_SSM高级整合_使用ajax操作实现删除的功能
点击删除的时候,要删除联系人,这里同点击编辑按钮一样给删除按钮添加点击事件的时候不能使用 $(".delete_btn").click(function(){ }); 这种方式,因 ...