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

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


package com.ldj.jdbc;

/*
 * 使用 C3P0 数据源和 Apache 的 DBUtils 的JDBC操作
 * 
 * author: laideju [email protected]
 * 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 List queryResult(String sql, Object[] args, Class clazz){
		Connection conn = null;
		List list = new ArrayList();
		try {
			conn=getConnection();			
			QueryRunner qr = new QueryRunner();
			BeanListHandler 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 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

 

你可能感兴趣的:(Java)