使用元数据设计的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();
				}
			}
		}
	}
}
												
											使用元数据设计的update、query封装的更多相关文章
- AOJ DSL_2_D Range Update Query (RUQ)
		
Range Update Query 数列 A = {a0,a1 ,...,an−1} に対し.次の2つの操作を行うプログラムを作成せよ. update(s,t,x): as,as+1,...,at ...
 - Web自动化框架之五一套完整demo的点点滴滴(excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试报告+对接缺陷管理系统+自动编译部署环境+自动验证false、error案例)
		
标题很大,想说的很多,不知道从那开始~~直接步入正题吧 个人也是由于公司的人员的现状和项目的特殊情况,今年年中后开始折腾web自动化这块:整这个原因很简单,就是想能让自己偷点懒.也让减轻一点同事的苦力 ...
 - [Apache Doris]  Apache Doris 元数据设计及DDL操作源码阅读
		
元数据设计 如上图,Doris 的元数据主要存储4类数据: 用户数据信息.包括数据库.表的 Schema.分片信息等. 各类作业信息.如导入作业,Clone 作业.SchemaChange 作业等. ...
 - RESTful API URI 设计: 查询(Query)和标识(Identify)
		
相关文章:RESTful API URI 设计的一些总结. 问题场景:删除一个资源(Resources),URI 该如何设计? 应用示例:删除名称为 iPhone 6 的产品. 是不是感觉很简单呢?根 ...
 - 在Spring Data JPA 中使用Update Query更新实体类
		
对于 Spring Data JPA 使用的时间不长,只有两年时间.但是踩过坑的却不少. 使用下列代码 @Modifying @Query("update User u set u.firs ...
 - Salesforce和SAP Netweaver里数据库表的元数据设计
		
从Salesforce官网可以了解到Salesforce的force.com平台里数据库表的设计:https://developer.salesforce.com/page/Multi_Tenant_ ...
 - 一文看懂IC芯片生产流程:从设计到制造与封装
		
http://blog.csdn.net/yazhouren/article/details/50810114 芯片制造的过程就如同用乐高盖房子一样,先有晶圆作为地基,再层层往上叠的芯片制造流程后,就 ...
 - python3+requests库框架设计03-请求重新封装
		
在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个Common文件夹,在文件夹下新建Base_test.py文件,项目结构如下. 具体怎么封装还是要看被测 ...
 - Python+Selenium框架设计之框架内封装基类和实现POM
		
原文地址https://blog.csdn.net/u011541946/article/details/70269965 作者:Anthony_tester 来源:CSDN 博客地址https ...
 
随机推荐
- 如何监控 Log4j2 异步日志遇到写入瓶颈
			
如何监控 Log4j2 异步日志遇到写入瓶颈 在之前的一篇文章中(一次鞭辟入里的 Log4j2 异步日志输出阻塞问题的定位),我们详细分析了一个经典的 Log4j2 异步日志阻塞问题的定位,主要原因还 ...
 - Unittest方法 -- 以test开头实例
			
此篇是以下面的test作为实战的 : Unittest方法 -- 项目实现自动发送邮件 1.test_01 import unittestfrom selenium import webdriverc ...
 - ASM入网小助手卸载
			
目录 ASM小助手卸载 写在前的 卸载 解除U盘禁用 写在后的 ASM小助手卸载 写在前的 有些公司内网的上网认证是用的ASM小助手,不过有时候用自己电脑接入公司内网可能会主动下载到ASM入网小助手的 ...
 - python 装饰函数2
			
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue May 5 21:40:49 2020 ...
 - 第六篇--MFC美化界面
			
1.MFC如何设置背景颜色 首先,为对话框添加WM_CTLCOLOR消息,方法为:右击Dialog窗口 --> Class Wizard --> Messages --> WM_CT ...
 - SetupDi系列函数
			
SetupDiClassGuidsFromName WINSETUPAPI BOOL SetupDiClassGuidsFromNameA( PCSTR ClassName, LPGUID Class ...
 - Skywalking-04:扩展Metric监控信息
			
扩展 Metric 监控信息 官方文档 Source and Scope extension for new metrics 案例:JVM Thread 增加 Metrics 修改 Thread 的定 ...
 - python3中的缺省参数和global
			
关于py中缺省参数: 在声明函数的时候对某些参数(一个或多个)进行赋值,在你调用的时候无需在实参列表中体现该参数,但是在执行的时候会默认加上这个已经在形参中定义好的参数. 但是,缺省参数必须放在最后, ...
 - GraphPad Prism 9.0安装破解教程
			
graphpad prism 9.0是一款强大的科学软件,拥有大量分析图表,prism是回归分析的著名软件之一,非常适用于科研生物医学等领域.本文提供其破解版,激活码,序列号,破解教程等,可以完美激活 ...
 - springmvc学习指南 之---第24篇 国际化问题
			
writedby 张艳涛,今天一天就搞了一个这个问题,主要是下路,遇到springmvc-config.web的配置和拦截器的使用问题, 看了几天的spring发现都没讲拦截器,之前看了两天sprin ...