1、Commons dbutils是什么?

commons-dbutils 是 Apache 组织提供的一个开源 JDBC 工具类库,对传统操作数据库的类进行二次封装,可以把结果集转化成List。

2、Commons dbutils主要相关类及接口的简介:

主要讲解两个类(org.apache.commons.dbutils.DbUtils和org.apache.commons.dbutils.QueryRunner)和一个接口(org.apache.commons.dbutils.ResultSethandler)。

 

2.1:DbUtils类

为做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。

A:loadDriver(StringdriveClassName): 这一方法装载并注册JDBC驱动程序,如果成功就返回TRUE,不需要去捕捉ClassNotFoundException异常。通过返回值判断驱动程序是否加载成功。

B:close方法:DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭连接(Connection)、声明(Statement)或者结果集(ResultSet)对象。

C:closeQuietly方法: closeQuietly这一方法不仅能在连接、声明或者结果集为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLException。如果你不想捕捉这些异常的话,这对你是非常有用的。在重载closeQuietly方法时,特别有用的一个方法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),使用这一方法,你最后的块就可以只需要调用这一方法即可。

D: commitAndCloseQuietly(Connection conn)方法和commitAndClose (Connection conn)方法:这两个方法用来提交连接,然后关闭连接,不同的是commitAndCloseQuietly(Connection conn)方法关闭连接时不向上抛出在关闭时发生的一些SQL异常而commitAndClose (Connection conn)方法向上抛出SQL异常。

 

2.2:QueryRunner类

该类简单化了 SQL 查询,它与 ResultSetHandler(接口 后面将会介绍) 组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量

【构造函数(1):QueryRunner() (2):QueryRunner(Datasource ds)】。

A:query(Connectionconn, String sql, Object[] params, ResultSetHandler rsh)方法:这一方法执行一个带参数的选择查询,在这个查询中,对象阵列的值被用来作为查询的置换参数。这一方法内在地处理PreparedStatement 和ResultSet 的创建和关闭。ResultSetHandler对象把从 ResultSet得来的数据转变成一个更容易的或是应用程序特定的格式来使用。

B:query(Stringsql, Object[] params, ResultSetHandler rsh)方法:这几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造器的数据源(DataSource) 或使用的setDataSource 方法中重新获得的。

C:query(Connectionconn, String sql, ResultSetHandler rsh)方法:这执行一个带参数的选择查询。

D:update(Connectionconn, String sql, Object[] params)方法:这一方法被用来执行一个带参数的插入、更新或删除操作。对象阵列为声明保存着置换参数。

E:update(Stringsql, Object[] params)方法: 这几乎与上一种种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造器的数据源(DataSource) 或使用的setDataSource 方法中重新获得的。

F:update(Connectionconn, String sql)方法:这执行一个带参数的插入、更新或删除操作。

2.3:ResultSetHandler接口

正如它的名字所示,这一接口执行处理一个Java.sql.ResultSet,将数据转变并处理为任何一种形式,这样有益于其应用而且使用起来更容易。这一组件提供了
    ArrayHandler :将ResultSet中第一行的数据转化成对象数组
    ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[]
    BeanHandler :将ResultSet中第一行的数据转化成类对象
    BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象
    ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象
    KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map。Map中存放的是数据
    MapHandler :将ResultSet中第一行的数据存成Map映射
    MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map
    ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object等转化类。 ResultSetHandler接口提供了一个单独的方法:Object handle(java.sql.ResultSet .rs)。因此任何ResultSetHandler 的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。因为返回类型是java.lang.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。
例:package com.mrkay.commons;
import java.sql.Connection;

importjava.sql.DriverManager;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;

public class DbUtiles {
    private static Connection conn;
    public static ConnectiongetConnection(){
        Stringurl="jdbc:MySQL://localhost:3306/info_db";
        StringdriverClassName="org.gjt.mm.mysql.Driver";
        String username="root";
        String password="root";
        Connection conn = null;
       DbUtils.loadDriver(driverClassName);
        try {
            conn =DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

public static void main(String[]args) {
        conn = getConnection();
        QueryRunner qr = newQueryRunner();
        List al = null;
        try {
            al = (List)qr.query(conn,"select * from guestbook", new MapListHandler());
        } catch (SQLException e) {
            e.printStackTrace();
        }
        Iterator ite = al.iterator();
        while(ite.hasNext()){
            Map map = (Map)ite.next();
           System.out.println(map.get("name"));
        }
    }
}

除上述介绍的外还可以了解一下以下内容
    org.apache.commons.dbutils.QueryLoader:QueryLoader类是一个从一个文件加载查询到一个Map的简单的类。然后,当需要的时候,你从 Map 中选择一些查询。在没有专门去接触代码的情况下,一个文件中的Having查询也可以改变得尽可能的简单。
    org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet:这个类对使用一个系统方法来解决NULL值问题是很有用的。用一个 SqINullCheckedResultSet 的实例来限制一个常规的结果集(ResultSet),然后详细地说明在遇NULL值的情况下应该做些什么。
    org.apache.commons.dbutils.wrappers.StringTrimmedResultSet:用类StringTrimmedResultSet 来约束一个结果集,这样一来,你就可以修整所有getString()和getObject()方法返回的字符串。
    注:dbutils组件对数据源的处理使用:QueryRunner qr = new QueryRunner(DataSource ds).

下面是组件中DbUtils类和BeanListHandler类的详细用法的例子:

GuestBook.java源文件

package com.gdufs.xxy;

public class GuestBook {
private Integer id;
private String name;

public IntegergetId() {
return id;
}

public StringgetName() {
return name;
}

public voidsetId(Integer id) {
this.id = id;
}

public voidsetName(String name) {
this.name = name;
}
}

BeanListExample.java类文件

packagecom.gdufs.xxy;

importorg.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;

public class BeanListExample {

public staticvoid main(String[] args) {
Connection conn = null;
String url = "jdbc:mysql://localhost:3306/test";
String driver = "com.mysql.jdbc.Driver";
String user = "root";
String password = "520134";

DbUtils.load(driver);

try {
conn = DriverManager.getConnection(url,user,password);
QueryRunner qr = new QueryRunner();
List results = (List)qr.query(conn,"select id,name fromguestbook",new BeanListHandler(GuestBook.class));
for(int i=0;i<results.size(); i++) {
GuestBook gb = (GuestBook)results.get(i);
System.out.println("id:"+gb.getId()+";name:"+gb.getName());
}
}
catch(SQLException e) {
e.printStackTrace();
} finally {
DbUtils.closeQuietly(conn);
}
}
}

下面是组件中DbUtils类和BeanListHandler类的详细用法的例子:

importorg.apache.commons.dbutils.DbUtils;   
 importorg.apache.commons.dbutils.QueryRunner;  
 importorg.apache.commons.dbutils.handlers.MapListHandler;   
   
 import java.sql.Connection;   
 import java.sql.DriverManager;   
 import java.sql.SQLException;   
   
 import java.util.Map;   
 import java.util.List;   
   
 public class DbUtilsUseMapMySQL {   
   public static void main(String[] args){   
     Connection conn = null;   
     String jdbcURL = "jdbc:mysql://localhost/octopus";   
     String jdbcDriver ="com.mysql.jdbc.Driver";   
     String user = "root";   
     String password ="root";   
   
     try {   
      DbUtils.loadDriver(jdbcDriver);   
       conn =DriverManager.getConnection(jdbcURL, user, password);   
   
       QueryRunner qRunner = newQueryRunner();   
   
       List mapList = (List)qRunner.query(conn, "select id, name from animals_table",   
           new MapListHandler());   
   
       for (int i = 0; i <mapList.size(); i++) {   
         Map map = (Map)mapList.get(i);   
        System.out.println("id=" + map.get("id"));   
        System.out.println("name=" + map.get("name"));   
        System.out.println("—————–");  
       }  
   
       System.out.println("DbUtils_UseMap_MySQL:end.");   
   
     } catch (SQLException e) {   
       // handle the exception   
       e.printStackTrace();   
     } finally {   
       DbUtils.closeQuietly(conn);   
     }  
   }  
 }  
   
 class Employee {   
   private int id;   
   private String name;   
   public Employee() {   
   }  
   public void setName(String name){   
     this.name = name;   
   }  
   public String getName() {   
     return this.name;   
   }  
   
   public void setId(int id) {   
     this.id = id;   
   }  
   
   public int getId() {   
     return this.id;   
   }  
   
   public void print() {   
     System.out.println("id=" +id + " name=" + name);   
   }  
 }

1.DAO基类(数据库操作基类)
 
这里使用了层超类模式,复用代码,统一处理异常,日志等等..
 
BaseDAO:
 
package com.d1zhan;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
 
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public classBaseDAO {
    /**
     * 获取数据库连接
     * @return
     */
    public Connection getConnection() {
        Connection conn = null;
        String jdbcURL ="jdbc:mysql://localhost/dbname";
        String jdbcDriver ="com.mysql.jdbc.Driver";
        String user = "root";
        String password = "root";
        try {
           DbUtils.loadDriver(jdbcDriver);
            conn =DriverManager.getConnection(jdbcURL, user, password);
        } catch (SQLException e) {
            // handle the exception
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return conn;
    }
 
    /**
    * 查找多个对象
     * @param sqlString
     * @param clazz
     * @return
     */
    public List query(String sqlString,Class clazz) {
        List beans = null;
        Connection conn = null;
        try {
            conn = getConnection();
            QueryRunner qRunner = new QueryRunner();
            beans =
                (List) qRunner.query(
                    conn,
                    sqlString,
                    newBeanListHandler(clazz));
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return beans;
    }
 
    /**
     * 查找对象
     * @param sqlString
     * @param clazz
     * @return
     */
    public Object get(String sqlString,Class clazz) {
        List beans = null;
        Object obj = null;
        Connection conn = null;
        try {
            conn = getConnection();
            QueryRunner qRunner = new QueryRunner();
            beans =
                (List) qRunner.query(
                    conn,
                    sqlString,
                    newBeanListHandler(clazz));
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        if(beans!=null &&!beans.isEmpty()){ //注意这里
             obj=beans.get(0);

}

return obj;
    }
 
    /**
     * 执行更新的sql语句,插入,修改,删除
     * @param sqlString
     * @return
     */
    public boolean update(StringsqlString) {
        Connection conn = null;
        boolean flag = false;
        try {
            conn = getConnection();
            QueryRunner qRunner = new QueryRunner();
            int i =qRunner.update(conn,sqlString);
            if (i > 0) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return flag;
    }
}
 
 commons-DBUtils实践

1,Employee 雇员数据库操作DAO类
 
 
大家可以看到,下面的DAO类,继承BaseDAO,方法体都是组装sql语句,不必关心异常的处理,资源的管理(Connection,Statement等),这样代码简洁,质量高.
 
EmployeeDAO:
 
package com.d1zhan;
 
import java.util.List;
 
public class EmployeeDAO extends BaseDAO {
 
    /**
     * searchModel的属性,name,address等为查询参数
     * @param searchModel
     * @return
     */
    public List query(EmployeesearchModel) {
        String sql = "select * from employee where 1=1";
 
        //如果雇员名字不为null,则将雇员名字加入where查询条件
        if (searchModel.getName() !=null) {
            sql += "and employee.name like ‘" + searchModel.getName() + "’ ";
        }
        return this.query(sql,Employee.class);
    }
 
    /**
     * 修改雇员信息
     * @param emp
     * @return
     */
    public boolean edit(Employee emp) {
        String sql = "update employee set ";  //注意: set加在外面
 
        //如果name不为null,修改它的值到数据库
        if (emp.getName() != null) {
            sql +="employee.name=’" + emp.getName() + "’ ,";
        }
 
        //如果address不为null,修改它的值到数据库
        if (emp.getAddress() != null) {
            sql +="employee.address=’" + emp.getAddress() + "’, ";
        }

sql=sql.substring(0,sql.length()-1); //去掉最后一个","
        sql += "where employee.id=" + emp.getId();
        return this.update(sql);
    }
 
    /**
     * 根据雇员ID删除雇员
     * @param id
     * @return
     */
    public boolean delete(int id) {
        String sql = "delete from employee where id =" + id;
        return this.update(sql);
    }
 
    /**
     * 根据雇员ID查找雇员
     * @param id
     * @return
     */
    public Employee get(int id) {
        String sql = "select * from employee where id=" + id;
        return (Employee) this.get(sql,Employee.class);
    }
}
 
3.雇员信息类
 
Employee:
package com.pcm.netrender.model;

public class Employee {
    private int id;
    private String name;
    private String address;
    /**
     * @return
     */
    public String getAddress() {
        return address;
    }
 
    /**
     * @return
     */
    public int getId() {
        return id;
    }
 
    /**
     * @return
     */
    public String getName() {
        return name;
    }
 
    /**
     * @param string
     */
    public void setAddress(String string){
        address = string;
    }
 
    /**
     * @param i
     */
    public void setId(int i) {
        id = i;
   }
 
    /**
     * @param string
     */
    public void setName(String string) {
        name = string;
    }
 
}

4,现在就可以在业务层(service)调用我们的dao类方法,实现业务逻辑了
在service我们要处理业务逻辑,数据库操作事务等等.
然后Struts Action调用 service类的方法,完成软件了.

使用代码大概是这样的

Employeeemp=new Employee();

emp.setName("小李");

emp.setAddress("南宁市阳光新城");

EmployeeDAO dao=new EmployeeDAO();

dao.save(emp);

 

采用Commons-DbUtils组件(应用数据源)

1.类DBDataSource,用于得到DataSource 对象

publicclass DBDataSource {

private DataSourceds= null ;
 
 public DBDataSource()
 {

Context initContext=new InitialContext();

Contextcontext=(Context)initContext.lookup("java:/comp/env");

ds=(Context)context.lookup("jdbc/sqlds");
   }

// 取得数据源

public DataSource getDataSource()
 {
  return this.ds ;
 }

}

2.查询全部的代码

publicList queryAll() throws Exception {
  // TODO Auto-generated method stub
  List all = new ArrayList() ;
  String sql = "SELECT id,title,author,content FROM note" ;

DBDataSource dbc = new DBDataSource() ;

DataSource ds=dbc.getDataSource();

QueryRunner qr=new QueryRunner(ds);

all=(List)qr.query(sql,newBeanListHandler(Note.class));

return all ; }

commons dbutils 的介绍与使用相关推荐

  1. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)

    转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...

  2. Apache Commons 工具类介绍及简单使用(转)

    转自:http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下 ...

  3. Apache Commons 工具类介绍及简单使用

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...

  4. beanutils工具类_Apache Commons 工具类介绍及简单使用

    来源:http://h5ip.cn/9xu3 Apache Commons 工具类大家都有用过,但是可能缺乏系统学习,只用到了一小部分功能,无法发挥极限的价值,肥朝用大白话说就是,一颗好白菜都让猪给拱 ...

  5. mysql连接池_数据库技术:数据库连接池,Commons DbUtils,批处理,元数据

    Database Connection Pool Introduction to Database Connection Pool 实际开发中"获得连接"或"释放资源&q ...

  6. Apache Commons DbUtils 入门

    一.概述 DbUtils小巧的Java数据库操作工具,它在JDBC的基础上做了科学的封装,旨在简化JDBC代码混乱与重复. 对于JDBC代码,存在很多问题,算是对Java的批判: 1.操作过程复杂,代 ...

  7. java commons logging_Java日志介绍(5)-commons-logging

    Apache Commons Logging(JCL) 提供了一个简单的日志抽象,允许开发人员使用特定的日志实现.JCL可以使用其他的日志实现,包括Log4J.Avalon LogKit(Avalon ...

  8. Apache Commons:Commons-codec介绍

    http://www.zihou.me/html/2011/03/23/2983.html 在实际的应用中,我们经常需要对字符串进行编解码,Apache Commons家族中的Commons Code ...

  9. Apache Commons:Betwixt介绍

    http://www.zihou.me/html/2011/03/22/2952.html Betwixt是Apache Commons家族中又一重要的成员,它可以很容易地将一个XML的内容转化为一个 ...

最新文章

  1. html页面不显示横向滚动条,css横向滚动条不显示?
  2. python3 函数签名简介 验证函数参数
  3. 基于Android5.1的双屏异显分析
  4. 2020年蓝桥杯比赛时间_我院举办2021年创新创业大赛启动仪式及第12届蓝桥杯动员大会...
  5. leetcode35 插入的位置
  6. Python排序算法(一)冒泡排序、选择排序、插入排序
  7. mvc各层简单清晰的描述
  8. 爱立信两大股东不满股价表现 欲撤换CEO卫翰思
  9. JavaScript 函数的length
  10. 最通俗PLC教程—源自Koyo光洋PLC自学总结(1)
  11. 软件架构设计入门学习
  12. 5G网络架构 — 接入网/传输网/核心网
  13. 小学计算机课后作业,小学信息技术课后作业设计研究
  14. 有道云笔记的敏捷开发实践——好文收藏吧!【转】
  15. linux - grep命令
  16. 记时,耗时,Stopwatch
  17. 数据库—distinct是什么意思?select distinct怎么用?
  18. json_encode在线工具
  19. Linux系统下搭建常用服务器
  20. java并发编程实战wwj----------------------第一阶段--------------35-36-37-38-39

热门文章

  1. -bash: setup: command not found
  2. Linux Shell常用技巧(三)
  3. android Glide简单使用
  4. android 快速新建字符资源
  5. 【Android】init.rc
  6. 获取GitHub上远程分支内容
  7. Java文件操作:文件夹中搜索文件
  8. Redis五种数据结构
  9. JVM学习笔记之-JVM性能监控-JVM监控及诊断工具-命令行方式
  10. 【Java】登录操作中随机生成验证码的工具类