JDBC--DBUtils的使用
1、commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
2、相关API:
--org.apache.commons.dbutils.QueryRunner
--org.apache.commons.dbutils.ResultSetHandle
--工具类:org.apache.commons.dbutils.DbUtils
3、使用QueryRunner进行更新操作:
--update方法:可执行delete,insert,update的sql语句
public void testQueryRunner_update(){
Connection conn = null;
//创建QueryRunner的实现类
QueryRunner queryRunner = new QueryRunner();
String sql = "DELETE FROM customers WHERE id > ?";
try{
//获取数据库连接
conn = JDBCUtils.getConnection();
//调用QueryRunner的update方法实现更新操作
int rows = queryRunner.update(conn, sql, 97);
System.out.println(rows + "rows deleted.");
}catch(Exception e){
e.printStackTrace();
}finally{
//释放数据库资源
JDBCUtils.release(conn, null, null);
}
}
4、使用QueryRunner进行查询操作:
--使用QuneryRunner的query()方法进行查询时,需要传入对应的ResultSetHandler的实现类对象以完成对结果集的处理,其返回类型取决于ResultSetHandler中handle方法的返回类型,可以使用以下几种ResultSetHandler:
--1)自定义结果集处理:
/**
*自定义ResultSetHandler,并重写handle方法,对结果集进行处理
*/
class MyResultSetHandler implements ResultSetHandler{
@Override
public Object handle(ResultSet rs) throws SQLException {
List<Customer> list = new ArrayList<>();
while(rs.next()){
BigDecimal id = rs.getBigDecimal(1);
String name = rs.getString(2);
Date birth = rs.getDate(3); Customer customer = new Customer(id, name, birth);
list.add(customer);
}
return list;
} } @Test
public void testResultSetHandler(){
Connection conn = null;
QueryRunner queryRunner = new QueryRunner();
try{
conn = JDBCUtils.getConnection();
String sql = "SELECT id \"id\", name \"name\", birth \"birth\" FROM customers where id < 5";
Object customers = queryRunner.query(conn, sql,
new MyResultSetHandler()); System.out.println(customers);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(conn, null, null);
}
}
--源码分析queryRunner.query()方法
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh,Object... params) throws SQLException {
PreparedStatement stmt = null;
ResultSet rs = null;
T result = null;
try {
stmt = this.prepareStatement(conn, sql);
this.fillStatement(stmt, params);
rs = this.wrap(stmt.executeQuery());
result = rsh.handle(rs);
} catch (SQLException e) {
this.rethrow(e, sql, params);
} finally {
try {
close(rs);
} finally {
close(stmt);
}
}
return result;
}
上面的方法中,在获取到结果集之后(第8行),将调用传入的ResultSetHandler对象的handle方法对结果集处理(第9行),这里将调用自定义的实现类中的handle方法。
--2)BeanHandler:将查询的结果集的第一条记录转化为传入的对应的class类的对象并返回:
Customer customer = queryRunner.query(conn, sql,new BeanHandler(Customer.class));
System.out.println(customer);
--3)BeanListHandler:将查询的结果集转化为传入的对应的class类的对象列表并返回:
List<Customer> customers = queryRunner.query(conn, sql,new BeanListHandler(Customer.class));
System.out.println(customers);
--4)MapHandler:将查询的结果集的第一条记录转化为Map并返回,其中key值对应列名,value对应列的值:
Map<String, Object> customer = queryRunner.query(conn, sql,new MapHandler());
System.out.println(customer);
--5)MapLsitHandler:将查询的结果集转化为MapList并返回,其中key值对应列名,value对应列的值:
List<Map<String, Object>> customers = queryRunner.query(conn, sql,new MapListHandler());
System.out.println(customers);
--6)ScalarHandler:将结果集的第一行第一列转化的数据成数值(可以是基础类型、String类和Date类):
String sql = "SELECT name FROM customers WHERE id = 5";
String name = (String)queryRunner.query(conn, sql,new ScalarHandler());
System.out.println(name);
JDBC--DBUtils的使用的更多相关文章
- 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)
-----------------------JDBC---------- 0. db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...
- 使用JDBC(Dbutils工具包)来从数据库拿取map类型数据来动态生成insert语句
前言: 大家在使用JDBC来连接数据库时,我们通过Dbutils工具来拿取数据库中的数据,可以使用new BeanListHandler<>(所映射的实体类.class),这样得到的数据, ...
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...
- jdbc操作mysql
本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)
近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...
- Android 之JDBC
JDBC(Java DataBase Connectivity)是使用 Java 存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准 SQL语句分开看待,实现数据库无关的 Java操作 ...
- 厚积薄发系列之JDBC详解
创建一个以JDBC链接数据库的程序,包含七个步骤 1.加载JDBC驱动 加载要连接的数据库的驱动到JVM 如何加载?forName(数据库驱动) MySQL:Class.forName("c ...
- JdbcUtils.java
package com.jdbc.dbutils; import java.lang.reflect.Field; import java.sql.Connection; import java.sq ...
- 32、mybatis
第一章回顾jdbc开发 1)优点:简单易学,上手快,非常灵活构建SQL,效率高 2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建 ...
- mybaits入门
1.回顾jdbc开发 orm概述 orm是一种解决持久层对象关系映射的规则,而不是一种具体技术.jdbc/dbutils/springdao,hibernate/springorm,mybaits同属 ...
随机推荐
- P1893山峰瞭望
传送门 看完这个题,大家都懂意思吧,然后代码呢,emmmmm #include <bits/stdc++.h> using namespace std; const int maxn = ...
- 获取天气预报java代码
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; imp ...
- java 类型转换一些相关问题
猜测:第二句 第四句会出错 结果是第二句和第四句会出错.说明了父类可以向子类类型转换,而不同的子类直接不能类型转换.
- leetcode 0216
目录 ✅ 893. 特殊等价字符串组 描述 解答 cpp py ✅ 811. 子域名访问计数 描述 解答 cpp py ✅ 509. 斐波那契数 描述 解答 cpp py ✅ 521. 最长特殊序列 ...
- 高级T-SQL进阶系列 (一)【上篇】:使用 CROSS JOIN 介绍高级T-SQL
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文连接:传送门 这是一个新进阶系列的第一篇文章,我们将浏览Transact-SQL(T-SQL)的更多高级特性.这个进阶系列将会包 ...
- 基于通用二进制方式安装MySQL-5.7.24(比源码安装MySQL快许多)及破密码
确保系统中有依赖的libaio软件 yum -y install libaio 使用wget命令下载mysql-5.7.24软件包 wget http://mirrors.sohu.com/mysql ...
- 「国家集训队」middle
「国家集训队」middle 传送门 按照中位数题的套路,二分答案 \(mid\),序列中 \(\ge mid\) 记为 \(1\),\(< mid\) 的记为 \(-1\) 然后只要存在一个区间 ...
- CSS - 表格细线边框
通过 border-collapse: collapse cellpadding="0", cellspacing= "0" 实现 <!DOCTYPE h ...
- 怎么修改Anaconda 中 jupyter notebook 文件的保存位置
安装完 anaconda ,在jupyter notebook 中创建的文件的默认保存位置为C:\User\电脑名 修改保存位置 1.打开 anaconda prompt 2.输入 jupyter n ...
- NGINX学习积累(学习牛人)
大牛:http://www.cnblogs.com/zengkefu/p/5563608.html 当请求来临的时候,NGINX会选择进入虚拟主机,匹配location后,进入请求处理阶段. 在请求处 ...