zoukankan      html  css  js  c++  java
  • 使用 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;
        }
     
    }
  • 相关阅读:
    Codeforces Round #603 (Div. 2)
    【bzoj1997】[Hnoi2010]Planar(平面图+2-sat)
    【poj3207】Ikki's Story IV
    【HDU1814】Peaceful Commission(2-sat+暴力染色)
    Educational Codeforces Round 77 (Rated for Div. 2)
    【hdu3311】Dig The Wells(斯坦纳树+dp)
    [USACO3.3] A Game
    [TJOI2013] 单词
    [USACO3.3] Home on the Range
    [NOI2011] 阿狸的打字机
  • 原文地址:https://www.cnblogs.com/itfky/p/13734235.html
Copyright © 2011-2022 走看看