使用元数据设计的update、query封装

package util;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.beanutils.BeanUtils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class SQLUtil {
	// 一个数据库只需要一个连接池对象
	private static DataSource ds = new ComboPooledDataSource();
	
	/**
	 * 使用参数元数据,设计的一个通用的update方法;
	 * 所有的DDL、DML都可以执行
	 */
	public static void update(String sql, Object[] values) {
		Connection conn = null;
		try {
			// 从c3p0连接中获取连接
			conn = ds.getConnection();
			
			PreparedStatement stmt = conn.prepareStatement(sql);
			
			ParameterMetaData metaData = stmt.getParameterMetaData();
			// 得到此预编译的sql中有几个参数
			int count = metaData.getParameterCount();
			
			// 将从外部传入的数据数组放入到stmt中
			for(int i=0; i<count; i++) {
				stmt.setObject(i+1, values[i]);
			}
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		} finally {
			if(null != conn) {
				try {
					// 实质是放回到连接池中
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				} 
			}
		}
	}
	/**
	 * 使用结果集元数据,设计的一个通用的query方法;
	 * 针对所有的DQL都可以执行
	 */
	public static <T> List<T> query(String sql, Object[] values, Class<T> c) {
		Connection conn = null;
		try {
			conn = ds.getConnection();
			PreparedStatement stmt = conn.prepareStatement(sql);
			// 获取参数元数据
			ParameterMetaData pmd = stmt.getParameterMetaData();
			// 得到参数数量
			int count = pmd.getParameterCount();
			// 如果是null,则不赋值
			if(values != null) {
				for(int i=0; i<count; i++) {
					stmt.setObject(i+1, values[i]);
				}
			}
			ResultSet rs = stmt.executeQuery();
			// 获取结果集元数据
			ResultSetMetaData rsmd = rs.getMetaData();
			// 得到列数量
			int col = rsmd.getColumnCount();
			List list = new ArrayList();
			while(rs.next()) {
				// 每一行数据就是一个对象
				// 通过传进来的类对象,new对象
				Object obj = c.newInstance();
				// 遍历每一列,将每一列封装
				for(int i=1; i<=col; i++) {
					// 得到表的列值
					Object value = rs.getObject(i);
					// 通过结果集元数据可以得到字段名称
					String colName = rsmd.getColumnName(i);
					/*
					 * 表中的每列的值就封装到对象的每个属性中
					 * 约定一个前提:
					 * 		表中的每个字段名称和javabean对象
					 *		中的属性名称保持一致!!!
					 * 把值拷贝到javabean对象中
					 */
					BeanUtils.copyProperty(obj, colName, value);
				}
				list.add(obj);
			}
			return list;
		} catch (InvocationTargetException | SQLException | InstantiationException | IllegalAccessException e) {
			e.printStackTrace();
			throw new RuntimeException();
		} finally {
			if(null != conn) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	} 
}


posted @ 2018-05-12 11:54  五彩世界  阅读(108)  评论(0编辑  收藏  举报