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;
        }
     
    }
  • 相关阅读:
    mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案
    WebAPI 用户认证防篡改实现HMAC(二)签名验证 AbsBaseAuthenticationAttribute--转
    Calling a Web API From a .NET Client (C#)
    http状态码有那些?分别代表是什么意思
    html 之表单,div标签等。。。。。。。
    mysql之视图,触发器,事务等。。。
    pymysql模块
    MySQL之IDE工具介绍及数据备份
    mysql老是停止运行该怎么解决
    前端基础之html
  • 原文地址:https://www.cnblogs.com/itfky/p/13734235.html
Copyright © 2011-2022 走看看