使用 QueryRunner 实现 JDBC 常用操作封装

之前记录了纯 Java 版本的 JDBC 操作封装(https://www.cnblogs.com/itfky/p/13734227.html),今天记录下使用 DBUtils 中的 QueryRunner 和 c3p0 数据源来封装自用的 JDBC 辅助类,代码见下,支持批量和单个操作。需要注意的是,JDBC 底层在批量操作时, 对于不带参数的 SQL 语句,Statement.addBatch() 方法不会执行,这样存在执行后无返回的bug(详见《纯Java版本的JDBC基础操作,支持查询结果到泛型实体类的转换》中的注释),所以要区分是否要做批量操作。

package com.ldj.jdbc;
 
/*
 * 使用 C3P0 数据源和 Apache 的 DBUtils 的JDBC操作
 * 
 * author: laideju itfky@foxmail.com
 * version: 1.0
 * date: 2018-11-02
 * 
 */
 
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
 
import java.util.ArrayList;
import java.util.List;
 
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.mchange.v2.c3p0.ComboPooledDataSource;
 
public class DataSourceJdbcHelper {
 
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
    
    public static Connection getConnection() {
        Connection c = null;
        try {            
            c= dataSource.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c;
    }
    
    public static void close(ResultSet rs, Statement stat, Connection conn) {
        if(rs!=null) {
            try {
                rs.close();
                rs = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        if(stat != null) {
            try {
                stat.close();
                stat = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        if(conn != null) {
            try {
                conn.close();
                conn = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    /*
     * 通过 BeanListHandler 和 QueryRunner 获取对象
     */
    public static<T> List<T> queryResult(String sql, Object[] args, Class<T> clazz){
        Connection conn = null;
        List<T> list = new ArrayList<T>();
        try {
            conn=getConnection();            
            QueryRunner qr = new QueryRunner();
            BeanListHandler<T> handler = new BeanListHandler<>(clazz);
            list = qr.query(conn, sql, handler, args);            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
    
    /*
     * 获取统计函数的查询结果
     */
    public static Number getSimpleResult(String sql, Object[] params) {
        Number ret = -1;
        try {
            Connection conn=getConnection();
            ScalarHandler<Number> rsh = new ScalarHandler<>();
            if(params == null) {
                params = new Object[0];
            }
            QueryRunner qr = new QueryRunner();
            ret = qr.query(conn, sql, rsh, params);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;
    }
    
    /*
     * 批量执行 insert 、 delete 、 update 
     * 必须带参,否则 QueryRunner 的batch方法中不会执行 addBatch() 导致无法有效执行
     */
    public static int batchExecute(String sql, Object[][] params) {
        int ret = -1;
        Connection conn = null;
        try {
            conn = getConnection();
            conn.setAutoCommit(true);
            QueryRunner qr = new QueryRunner();
            if(params == null) {
                params = new Object[0][0];
            }
            int[] rowNumList = qr.batch(conn, sql, params);
            if(rowNumList != null) {
                for(int i=0; i<rowNumList.length; i++) {
                    ret += rowNumList[i];
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;        
    }
    
    /*
     * 执行单个的 insert 、 delete 、 update
     */
    public static int execute(String sql, Object[] params) {
        int ret = -1;
        try {
            Connection conn = getConnection();
            QueryRunner qr = new QueryRunner();
            ret = qr.update(conn, sql, params);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;
    }
 
}

 

使用 QueryRunner 实现 JDBC 常用操作封装

上一篇:InnoDB崩溃恢复机制总结


下一篇:MySQL日志