使用 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; } }
分类:
JavaWeb
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了