zoukankan      html  css  js  c++  java
  • 使用元数据设计的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();
    				}
    			}
    		}
    	} 
    }
    


  • 相关阅读:
    macOS 遇到 svnadmin无法使用的情况
    语音识别进化简史:从造技术到建系统
    你是什么垃圾?人工智能面对干垃圾和湿垃圾“有点蒙”
    垃圾分类的事,让机器人做去吧!
    怎样才能叫一只奶牛自愿挤奶?
    第一次,脑机接口可以实时读取人类语言了
    机器人工作原理的超详细解析,生动、形象!
    1900页数学基础:面向CS的线性代数、拓扑、微积分和最优化
    微软Azure AI负责人:OpenAI只在微软云上训练模型
    Velodyne收购高清地图公司 将研发更安全的ADAS系统
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053463.html
Copyright © 2011-2022 走看看