Common Dbutils详解

jopen 8年前

1.      介绍

commons-dbutilsApache组织提供的一个开源 JDBC工具类库,能让我们更简单的使用JDBC。它是一个非常小的类包,花几分钟的时间就能掌握它的使用。

2.      下载

进入apache官方网站的commons-dbutils网页:http://commons.apache.org/dbutils/

选择左边导航栏的Download进入下载页面:

Binary:是编译好的jar包;source是源代码包。下载一份Binary到本地。解开后如下图所示:

其中commons-dbutils-1.1.jar就是供使用的jar包;docs是这个组件的帮助文档。下面就通过示例介绍它的使用。

3.      API介绍

commons-dbutils是一个非常小的类包, 无需花费太多时间去阅读它的doc,核心只是两个类org.apache.commons.dbutils.DbUtilsorg.apache.commons.dbutils.QueryRunner和一个接口org.apache.commons.dbutils.ResultSetHandler

3.1.    DbUtils

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

这个类里的重要方法有:

n  public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭ConnectionStatementResultSet

n  public static void closeQuietly(…): 这一类方法不仅能在ConnectionStatementResultSetNULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。如果你不想捕捉这些异常的话,这对你是非常有用的。在重载CloseQuietly方法时,特别有用的一个方法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),这是因为在大多数情况下,连接、声明和结果集(ResultSet)是你要用的三样东西,而且在最后的块你必须关闭它们。使用这一方法,你最后的块就可以只需要调用这一方法即可。

n  public static void CommitAndCloseQuietly(Connection conn) 这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些SQL异常。

n  public static boolean loadDriver(java.lang.String driverClassName):这一方法装载并注册JDBC驱动程序,如果成功就返回true。使用这种方法,你不需要去捕捉这个异常ClassNotFoundException

3.2.    QueryRunner

这个类简单化了执行SQL查询,它与ResultSetHandler组合在一起使用就可能完成大部分的数据库操作,它能够大大减少你所的编码量。

QueryRunner类提供了两个构造方法:一个是默认的构造方法;另一个需要一个 javax.sql.DataSource 来作为参数。因此,在你不用为一个方法提供一个数据库连接的情况下,提供给构造器的DataSource)被用来获得一个新的连接并将继续进行下去。

这个类中的重要方法包括以下这些:

n  public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法它会内在地处理PreparedStatement ResultSet 的创建和关闭。最重要的是参数ResultSetHandler把从 ResultSet中获得的数据转成一个更容易的或是应用程序特定的格式供我们使用

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

n  public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不置换参数的查询操作

n  public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除操作。

n  public int update(Connection conn, String sql) throws SQLException:用来执行一个更新操作,不需要置换参数。

3.3.    ResultSetHandler接口

正如它的名字所提示的,这一接口执行处理一个jaca.sql.ResultSet,将数据按要求转换为另一种形式。

ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)因此任何ResultSetHandler 的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。因为返回类型是java.lang.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。。

common-dbutils组件包针对这个接口提供了九个实现类:

n  ArrayHandler:把结果集中的第一行数据转成对象数组。

n  ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。

n  BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

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

n  ColumnListHandler结果集中某一列的数据存放到List中。

n  KeyedHandler:将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key把每个Map再存放到一个Map里。

n  MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

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

n  ScalarHandler结果集一条记录的其中某一列的数据存成Object

如果这九个实现类中没有任何一个提供了你想要的服务,你可以自己写一个实现类。

3.4.    其它类和接口

org.apache.commons.dbutils.QueryLoader类:属性文件加载器,主要用于加载属性文件中的SQL到内存中。

org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet类:这个类是用来对sql语句执行完成之后的的数值进行null的替换。

org.apache.commons.dbutils.wrappers.StringTrimmedResultSet:  去除ResultSet中字段的左右空格

org.apache.commons.dbutils.RowProcessor</span>接口: 它提供了把结果集的行数据转换成其它格式的功能。它的实现类是org.apache.commons.dbutils.BasicRowProcessor</span>类。

例子:

表结构可以参照javabean普通

1.数据库连接类:DBConnection.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {
    
    private static DBConnection instance = new DBConnection();
    
    public static DBConnection getInstance(){
        return instance;
    }
    
    public Connection getConn(){
        Connection conn=null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xxx","xxx", "xxx");
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

2. 普通JavaBean:
</span></span></span></span>InfoBean.java</span></span></span></span>

public class InfoBean {
    
    private String id;
    private String name;
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

3. 数据库操作:Oper.java

import java.sql.Connection;
import java.sql.SQLException;
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.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;

public class Oper {
    
    private static Oper instance = new Oper();
    
    public static Oper getInstance(){
        return instance;
    }

    /**
     * 获取全部内容(使用MapListHandler)
     * 
     * @return
     */
    public List<?> getAll() throws SQLException{
        String sql="select id,name from test";
        
        return query(sql, null, null);
    }
    
    /**
     * 获取全部内容(使用BeanListHandler)
     * 
     * @return
     */
    public List<?> getAllByBean() throws SQLException{
        String sql="select id,name from test";
        
        return query(sql, null, InfoBean.class);
    }
    
    /
      根据条件获取内容
     
 
      @param id
     
@return
     */
    public List<?> getInfoById(String id) throws SQLException{
        String sql="select id,name from test where id = ?";
        
        Object[] object = new Object[1];
        object[0]=id;
        
        return query(sql, object, InfoBean.class);
    }
    
    /

      添加内容
     
 
      @throws SQLException
     
/
    public void insert() throws SQLException{
        String sql="insert into test(id,name) values(?,?)";
        
        Object[] object = new Object[2];
        object[0]="5";
        object[1]="ee";
        
        operDB(sql,object);
    }
    
    /
      根据ID修改内容
     
 
      @throws SQLException
     
/
    public void update(String id) throws SQLException{
        String sql="update test set name = ? where id = ? ";
        
        Object[] object = new Object[2];
        object[0]="ee1";
        object[1]=id;
        
        operDB(sql,object);
    }
    
    /

      根据ID删除内容
     
 
      @throws SQLException
     
/
    public void delete(String id) throws SQLException{
        String sql="delete from test where id = ? ";
        
        Object[] object = new Object[1];
        object[0]=id;
        
        operDB(sql,object);
    }
    
    /
      数据库操作方法
     
 
      @param sql sql语句
     
@param object 参数
      @throws SQLException
     
/
    private void operDB(String sql, Object[] object) throws SQLException{
        Connection conn=DBConnection.getInstance().getConn();
        try {
            QueryRunner qr=new QueryRunner();
            qr.update(conn, sql,object);
        }
        catch (SQLException e) {
            throw e;
        }finally{
            DbUtils.close(conn);
        }
    }
    
    /

      查询操作
     
 
      @param sql sql语句
     
@param param 参数
      @return
     
@throws SQLException
     */
    public List<?> query(String sql, Object[] param, Class<?> clazz) throws SQLException{
        List<?> list = null;
        Connection conn=DBConnection.getInstance().getConn();
        QueryRunner qr=new QueryRunner();
        
        try {
            if(clazz!=null){
                list=(List<?>)qr.query(conn, sql, new BeanListHandler(clazz), param);
            }else{
                list=(List<?>)qr.query(conn,sql, new MapListHandler(), param);
            }
        }
        catch (SQLException e) {
            throw e;
        }finally{
            DbUtils.close(conn);
        }
        return list;
    }

    public static void main(String[] args) {
        
        try {
            List<?> l=Oper.getInstance().getAll();
            for(Object temp:l){
                Map<?,?> map=(Map<?,?>)temp;
                System.out.println(map.get("name"));
            }
//                
//            List<?> l=Oper.getInstance().getAllByBean();
//            for(Object temp:l){
//                InfoBean ib=(InfoBean)temp;
//                System.out.println(ib.getName());
//            }
//            
//            List<?> l = Oper.getInstance().getInfoById("1");
//            for(Object temp:l){
//                InfoBean ib=(InfoBean)temp;
//                System.out.println(ib.getName());
//            }
            
//            Oper.getInstance().insert();
            
//            Oper.getInstance().update("4");
            
//            Oper.getInstance().delete("5");
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }
}</span></span></span></span></span>