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的更多相关文章

  1. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

  2. 50个SQL语句(MySQL版) 问题十六

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  3. MySQL学习笔记十六:锁机制

    1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...

  4. MYSQL数据库学习十六 安全性机制

    16.1 MYSQL数据库所提供的权限 16.1.1 系统表 mysql.user 1. 用户字段 Host:主机名: User:用户名: Password:密码. 2. 权限字段 以“_priv”字 ...

  5. MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询

    1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...

  6. OSGi 系列(十六)之 JDBC Service

    OSGi 系列(十六)之 JDBC Service compendium 规范提供了 org.osgi.service.jdbc.DataSourceFactory 服务 1. 快速入门 1.1 环境 ...

  7. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  8. 数据库 MySQL Jdbc JDBC的六个固定步骤

    *0 案例:    a)在JavaScript中使用正则表达式,在JS中正则表达式的定界符是://     var regexp = /^[0-9]+$/;     if(regexp.test(nu ...

  9. mysql进阶(十六)常见问题汇总

    mysql进阶(十六)常见问题汇总 MySQL视图学习: http://www.itokit.com/2011/0908/67848.html 执行删除操作时,出现如下错误提示: 出现以上问题的原因是 ...

  10. Java开发笔记(一百四十六)JDBC的应用原理

    关系数据库使得海量信息的管理成为现实,但各家数据库提供的编程接口不尽相同,就连SQL语法也有所差异,像Oracle.MySQL.SQL Server都拥有自己的开发规则,倘若Java针对每个数据库单独 ...

随机推荐

  1. Dedecms升级php版本{dede:field.body/}不解析,文章内容不显示

    Dedecms升级php7后发布文章后,发现前端显示的文章内容都是空白,只能显示标题.关键词.描述等. 第一种方法: 把{dede:field.body /}删除,使用 下面的sql 标签代码替换: ...

  2. 探究:Adobe Premiere Pro CC 2018 导入SRT字幕显示不全问题

    问题:如果使用PR,大概率会遇到导入SRT格式的字幕文件后,PR里面显示的字幕不完整,字幕丢失的问题. 探究:字幕文件的内容正常,导入PR后字幕出现丢失. 查看字幕文件,并测试,发现如下图,如果出现字 ...

  3. 解决Maven静态资源过滤问题

    在项目的pom.xml中添加下面的内容 <build> <resources> <resource> <directory>src/main/java& ...

  4. 【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean

    写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,可以使用@Import注解快速向容器中导入bean,小伙伴们可以参见<[Spring注解驱动开发] ...

  5. git 提交流程

    Git提交流程: 1. Menu remote > (拉取)fetch 2. 重新扫描(rescan) 3. 缓存改动(stage change) 4. 写注释后提交(commit) 5. Me ...

  6. break,continue,break的用法与区别

    1.return 语句的作用 (1) return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行.       (2) return 返回一个值给调用该方法的语句,返回值的数据类型必须与方 ...

  7. liunx 常用快捷键

    1.命令行快捷键ctrl + a //把光标移动到最前面ctrl + e //把光标移动到最后面ctrl + l //清屏ctrl + c //取消ctrl + u //把光标到行首的删除ctrl + ...

  8. Python变量与基本数据类型

    Python变量与基本数据类型 前言 好了,从本章开始将正式进入Python的学习阶段.本章主要介绍的是Python变量与基本数据类型的认识,这些都是最基本的知识并且必须要牢靠掌握在心中. 注释 学习 ...

  9. Python3-apscheduler模块-定时调度

    from apscheduler.schedulers.background import BackgroundScheduler, BlockingScheduler from apschedule ...

  10. springboot的jar为何能独立运行

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...