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. char 型变量中能不能存贮一个中文汉字?为什么?

    在c语言中,char类型占一个字节,而汉字占两个字节,所以不能存储. 在java语言中,char类型占两个字节,而java默认采用Unicode码是16位,所以一个Unicode码占两个字节,java ...

  2. LOJ 3045: 洛谷 P5326: 「ZJOI2019」开关

    题目传送门:LOJ #3045. 题意简述 略. 题解 从高斯消元出发好像需要一些集合幂级数的知识,就不从这个角度思考了. 令 \(\displaystyle \dot p = \sum_{i = 1 ...

  3. CISCN 2019-ikun

    0x01 进去网址,页面如下: 刚开始有个登陆和注册的按钮,上图是我已经注册后登陆成功后的页面,我们发现在图的左下角给了一个关键的提示,购买LV6,通过寻找我们发现页面数很多,大概500页,一个一个找 ...

  4. 封装find_element

    因为find_element_by_id,find_element_by_name底层都是用find_element实现元素查找 #!/usr/bin/env python # -*- coding: ...

  5. mysql日期和时间类型

    TIME 类型 TIME 类型用于只需要时间信息的值,在存储时需要 3 个字节.格式为 HH:MM:SS.HH 表示小时,MM 表示分钟,SS 表示秒. TIME 类型的取值范围为 -838:59:5 ...

  6. Java 源码刨析 - String

    [String 是如何实现的?它有哪些重要的方法?] String 内部实际存储结构为 char 数组,源码如下: public final class String implements java. ...

  7. css3动画特效代码

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. cb17a_c++_构造string对象的方法

    cb17a_c++_构造string对象的方法string sstring s(s2)string s("value")string s(n,'c')string s(b,e) / ...

  9. intellij配置github

    一.在IDEA中设置Git,在File-->Setting->Version Control-->Git-->Path to Git executable选择你的git安装后的 ...

  10. SpringCloud gateway 3

    参考博客:https://www.cnblogs.com/crazymakercircle/p/11704077.html 1.1 SpringCloud Gateway 简介 SpringCloud ...