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封装的更多相关文章

  1. 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  ...

  2. Web自动化框架之五一套完整demo的点点滴滴(excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试报告+对接缺陷管理系统+自动编译部署环境+自动验证false、error案例)

    标题很大,想说的很多,不知道从那开始~~直接步入正题吧 个人也是由于公司的人员的现状和项目的特殊情况,今年年中后开始折腾web自动化这块:整这个原因很简单,就是想能让自己偷点懒.也让减轻一点同事的苦力 ...

  3. [Apache Doris] Apache Doris 元数据设计及DDL操作源码阅读

    元数据设计 如上图,Doris 的元数据主要存储4类数据: 用户数据信息.包括数据库.表的 Schema.分片信息等. 各类作业信息.如导入作业,Clone 作业.SchemaChange 作业等. ...

  4. RESTful API URI 设计: 查询(Query)和标识(Identify)

    相关文章:RESTful API URI 设计的一些总结. 问题场景:删除一个资源(Resources),URI 该如何设计? 应用示例:删除名称为 iPhone 6 的产品. 是不是感觉很简单呢?根 ...

  5. 在Spring Data JPA 中使用Update Query更新实体类

    对于 Spring Data JPA 使用的时间不长,只有两年时间.但是踩过坑的却不少. 使用下列代码 @Modifying @Query("update User u set u.firs ...

  6. Salesforce和SAP Netweaver里数据库表的元数据设计

    从Salesforce官网可以了解到Salesforce的force.com平台里数据库表的设计:https://developer.salesforce.com/page/Multi_Tenant_ ...

  7. 一文看懂IC芯片生产流程:从设计到制造与封装

    http://blog.csdn.net/yazhouren/article/details/50810114 芯片制造的过程就如同用乐高盖房子一样,先有晶圆作为地基,再层层往上叠的芯片制造流程后,就 ...

  8. python3+requests库框架设计03-请求重新封装

    在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个Common文件夹,在文件夹下新建Base_test.py文件,项目结构如下. 具体怎么封装还是要看被测 ...

  9. Python+Selenium框架设计之框架内封装基类和实现POM

    原文地址https://blog.csdn.net/u011541946/article/details/70269965 作者:Anthony_tester 来源:CSDN    博客地址https ...

随机推荐

  1. 【Tips】有道云笔记中Markdown插入图片

    在有道云笔记中用MarkDown插入图片 新建一个文档专门用来放图片 把所有要用的图片专门放在一个笔记里,用普通模式先同步笔记,然后用分享笔记 会有一个链接,用浏览器打开这个分享的笔记就能找到所有的图 ...

  2. 八大排序算法~简单选择排序【记录下标k变量的作用】

    八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...

  3. 【spring源码系列】之【Bean的循环依赖】

    希望之光永远向着目标清晰的人敞开. 1. 循环依赖概述 循环依赖通俗讲就是循环引用,指两个或两个以上对象的bean相互引用对方,A依赖于B,B依赖于A,最终形成一个闭环. Spring循环依赖的场景有 ...

  4. 【剑指offer】27. 二叉树的镜像

    剑指 Offer 27. 二叉树的镜像 知识点:二叉树:递归:栈 题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 示例 输入:root = [4,2,7,1,3,6,9] 输出:[4, ...

  5. NOI Online 提高组 题解

    来补坑了-- 个人认为三道题难度差不多-- 还有要说一嘴,为啥我在其他网站代码都好好的,复制到 cnblogs 上 Tab 就成 8 空格了?不过也懒得改了. T1 序列 首先,遇到这种加一减一还带附 ...

  6. Splay与FHQ-Treap

    两个一起学的,就放一块了. 主要是用来存板子. Splay //This is a Splay Tree. #include <cstdio> #include <cstring&g ...

  7. [考试总结]noip模拟15

    这次不咕了. 首先发现这套题目十分毒瘤, \(T1\) 就没有太大的思路. 结果最后也是暴力收场... 菜. \(T1\;60pts\) 暴力居然还是挺高的,\(T2\) 莽了一个随机化上去结果还是暴 ...

  8. airtest前期准备(pocoSDK+unity打apk包+安装pocoui库)

    只介绍unity的环境准备,cocos的可以参考官方文档    https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/integrat ...

  9. 探索HashMap源码 一行一行解析 jdk1.7版本

    今天我们来说一说,HashMap的源码到底是个什么? 面试大厂这方面一定会经常问到,很重要的.以jdk1.7 为标准    先带着大家过一遍 是由数组.链表组成 , 数组的优点是:每个元素有对应下标, ...

  10. WinForm设置任务栏托盘程序

    程序设计界面如下图所示: 1.在程序初始化加载的时候设置程序图标,具体code如下: private void Form1_Load(object sender, EventArgs e) { //t ...