1.commons-dbutils

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

commons-dbutilsAPI包括:

  • org.apache.commons.dbutils.QueryRunner
  • org.apache.commons.dbutils.ResultSetHandler

  工具类

  • org.apache.commons.dbutils.DbUtils

2.QueryRunner类

该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法:

  • 默认的构造方法;
  • 需要一个 javax.sql.DataSource 来作参数的构造方法。

QueryRunner类的主要方法:

执行一个不需要置换参数的查询操作。

执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数

用来执行一个更新(插入、更新或删除)操作。

用来执行一个不需要置换参数的更新操作。

2.1 使用DBUtils进行更新操作,更新操作可用于insert,update,delete.

public void testQueryRunnerUpdate() {
QueryRunner queryRunner=new QueryRunner();
Connection connection=null;
String sql="DELETE FROM USERS WHERE ID IN (?,?)";
try{
connection=JDBCTools.getConnection();
queryRunner.update(connection,sql,1,2);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(null, null, connection);
}
}

数据库连接和释放工具类 JDBCTools.java

//获取数据库的连接
@Test
public static Connection getConnection() throws Exception{
String driverClass=null;
String jdbcUrl=null;
String user=null;
String password=null; InputStream in=JDBCTools.class.getResourceAsStream("/jdbc.properties");
Properties properties=new Properties();
properties.load(in); driverClass=properties.getProperty("driver");
jdbcUrl=properties.getProperty("jdbcUrl");
user=properties.getProperty("user");
password=properties.getProperty("password"); Class.forName(driverClass);
Connection connection=DriverManager.getConnection(jdbcUrl,user,password);
return connection; }
@Test
public void testGetConnection() throws Exception{
getConnection(); }
//数据库释放
public static void release(ResultSet resultset,Statement statement,Connection connection){
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(resultset!=null){
try {
resultset.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

3.使用DBUtils进行查询操作

@Test
public void testQuery(){
Connection connection=null;
try{
connection=JDBCTools.getConnection();
String sql="SELECT id,name,email,birth FROM CUSTOMER";
Object obj=queryRunner.query(connection, sql, new MyResultSetHandler());
System.out.println(obj);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(null, null, connection);
}
} //QueryRunner的返回值取决于ResultSetHandler的返回值
QueryRunner queryRunner=new QueryRunner();
class MyResultSetHandler implements ResultSetHandler{
@Override
public Object handle(ResultSet resultset) throws SQLException {
List<Customer> customers=new ArrayList<Customer>();
while(resultset.next()){
Integer id=resultset.getInt(1);
String name=resultset.getString(2);
String email=resultset.getString(3);
Date date=resultset.getDate(4);
Customer customer=new Customer(id,name,email,date);
customers.add(customer);
}
return customers;
}
}

4.ResultSetHandler接口的实现类

4.1 BeanHandler

把结果集的第一条记录转为创建BeanHandler对象时传入的Class参数对应的对象。

示例代码:

public void testBeanHandler() {
Connection connection=null;
try{
connection=JDBCTools.getConnection();
String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER WHERE ID>=?";
Customer customer=(Customer) queryRunner.query(connection,sql,new BeanHandler(Customer.class),2);
System.out.println(customer);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(null, null, connection);
}
}

运行结果返回:

Customer [id=2, name=Winda, email=3455345466@163.com, birth=1995-02-14]

4.2 BeanListHandler

将结果集中的每一条数据都封装到一个对应的JavaBean实例中,存放到List里。

public void testBeanListHandler(){
Connection connection=null;
try{
connection=JDBCTools.getConnection();
String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER";
List<Customer> customers=(List<Customer>) queryRunner.query(connection,sql,new BeanListHandler(Customer.class));
System.out.println(customers);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(null, null, connection);
}
}

返回结果为:

[Customer [id=1, name=Tom, email=231233134@163.com, birth=1983-09-11], Customer [id=2, name=Winda, email=3455345466@163.com, birth=1995-02-14], Customer [id=3, name=A, email=5534565656@163.com, birth=1995-06-23], Customer [id=4, name=B, email=9444532232@163.com, birth=1992-03-11], Customer [id=5, name=C, email=4234412132@163.com, birth=1996-09-14], Customer [id=6, name=D, email=5634645645@163.com, birth=1990-09-19]]

4.3 MapHandler

返回SQL对应的第一条记录对应的Map对象。键对应列名,值对应列的值。

示例代码:

public void testMapHandler(){
Connection connection=null;
try{
connection=JDBCTools.getConnection();
String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER";
Map<String,Object> result= queryRunner.query(connection,sql,new MapHandler());
System.out.println(result);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(null, null, connection);
}
}

返回结果:

{ID=1, BIRTH=1983-09-11, EMAIL=231233134@163.com, NAME=Tom}

4.4 MapListHandler

将结果集中的每一行数据都封装到一个Map里,然后再存放到List。

public void testMapListHandler(){
Connection connection=null;
try{
connection=JDBCTools.getConnection();
String sql="SELECT ID,NAME,EMAIL,BIRTH FROM CUSTOMER";
List<Map<String,Object>> result= queryRunner.query(connection,sql,new MapListHandler());
System.out.println(result);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(null, null, connection);
}
}

4.5 ScalarHandler

把结果集转为一个数值返回,这个数值可以是任意类型和String,Date等。

public void testScalarHandler(){
Connection connection=null;
try{
connection=JDBCTools.getConnection();
String sql="SELECT NAME FROM CUSTOMER WHERE ID=?";
Object result= queryRunner.query(connection,sql,new ScalarHandler(),2);
System.out.println(result);
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCTools.release(null, null, connection);
}
}

JDBC使用DBUtils的更多相关文章

  1. day16(jdbc进阶,jdbc之dbUtils)

    1.jdbc进阶 jdbc事务管理 jdbc中的事务管理其实就是交给了连接对象去管理.先写一个简单的事务管理 public class Demo01 { private static Connecti ...

  2. jdbc框架-dbutils的简单使用

    jdbc框架-dbutils的简单使用 dbutils:是apache组织的一个工具类,jdbc的框架,更方便我们使用 使用步骤: 1.导入jar包(commons-dbutils-1.4.jar) ...

  3. JDBC和DBUtils区别(查询时jdbc只能返回ResultSet需要po转vo,dbutils返回的BeanListHandler与BeanHandler对应集合与对象)

    17:34 2013/6/7 JDBC //添加客户 public void addNewCustomer(Customer c) throws DAOException { Connection c ...

  4. 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别

    1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...

  5. JDBC、DBUtils

    JDBC(Java Data Base Connectivity) java数据连接 可以为多种数据库,提供统一访问,它由一组用java语言编写的类和接口组成,也是java访问数据库的规范.   my ...

  6. JDBC的DBUtils源码

    DBUtils源码: package com.it.util; import java.sql.Connection; import java.sql.DriverManager; import ja ...

  7. 29_Java_数据库_第29天(JDBC、DBUtils)_讲义

    今日内容介绍 1.JDBC 2.DBUtils 01JDBC概念和数据库驱动程序 * A: JDBC概念和数据库驱动程序 * a: JDBC概述 * JDBC(Java Data Base Conne ...

  8. JDBC及DBUtils

    1.JDBC2.DBUtils ###01JDBC概念和数据库驱动程序 * A: JDBC概念和数据库驱动程序 * a: JDBC概述 * JDBC(Java Data Base Connectivi ...

  9. (二十二)自定义简化版JDBC(Dbutils框架的设计思想)

    目录 元数据概念 DataBaseMetaData ParameterMetaData ResultSetMetaData 编写简化版的JDBC O-R Mapping 概念 自定义简化版JDBC 元 ...

随机推荐

  1. Android TV Overscan

    本文来自网易云社区 作者:孙有军 开发的TV应用发现在部分电视上可以显示完整,而其他部分电视显示不全,周围都会遮挡了. 原因 这是因为部分老的电视有一个overscan的概览,什么叫overscan呐 ...

  2. Binary Indexed Tree-307. Range Sum Query - Mutable

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  3. JavaScript基础数组_布尔值_逻辑运算等(2)

    day51 参考:https://www.cnblogs.com/liwenzhou/p/8004649.html 布尔值(Boolean) 区别于Python,true和false都是小写. var ...

  4. 实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符 如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少)。并且比其他只出现一次的字符(如"d")首次出现的位置最靠前。

    实现一个算法,寻找字符串中出现次数最少的.并且首次出现位置最前的字符如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少).并且比其 ...

  5. 编写 ES6 的 7 个实用技巧

    无脑翻译走一波~ Hack #1 - 变量交换 使用数组解构交换变量的值 let a = 'world', b = 'hello' [a, b] = [b, a] console.log(a) // ...

  6. http 缓存策略浅析

    从一道经典的面试题说起 "用户输入 URL 到浏览器显示页面,这个过程发生了什么?",作为前端开发,这个题目相信大家并不陌生.楼主的答案分为两部: 一.网络通信 应用层 DNS 域 ...

  7. C#里面获取web和非web项目路径

    非Web程序获取路径几种方法如下: 1.AppDomain.CurrentDomain.BaseDirectory  2.Environment.CurrentDirectory 3.HttpRunt ...

  8. C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter的区别

    ExecuteNonQuery()执行命令对象的SQL语句,返回一个int 类型的变量,返回数据库操作之后影响的行数.适合用来验证对数据库进行增删改的情况. 2.ExecuteScalar()也可以执 ...

  9. WebDriverAPI(1)

    访问某网页地址 被测网址http:http://www.baidu.com Java语言版本的API实例代码 方法一: @Test public void visitURL(){ String bas ...

  10. javascript数据结构与算法--二叉树(插入节点、生成二叉树)

    javascript数据结构与算法-- 插入节点.生成二叉树 二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * ...