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. spring-4-申明事务

    categories: spring5 事务回顾 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一 ...

  2. PAT乙级:1077 互评成绩计算 (20分)

    PAT乙级:1077 互评成绩计算 (20分) 在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评 ...

  3. Java字节码增强技术

    简单介绍下几种java字节码增强技术. ASM ASM是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生class文件,也可以在类被加载入Java虚拟机之前动态 ...

  4. redis故障时的一些概念

    1.缓存穿透 概念访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉. 解决方案采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤 ...

  5. 误改win10下的windowsapps文件夹权限,导致自带应用闪退问题

    在项目中,为了获得相关应用的具体位置(office的具体exe位置),修改了文件夹WindowsApps权限,导致所有自带应用打开闪退. 通过搜索相关资料,获得解决方法: 重置该文件的权限设置 ica ...

  6. VS2013导入新项目时,连接数据库问题。

    用VS2013导入项目进行学习时,导入数据库会报数据库登陆不上的错误... 解决方法: 1.将其自带的数据库连接先删除,使用自己的sql server数据库将项目数据库先附加进去, 2.附加进去后,再 ...

  7. Windows系统安装Mariadb数据库(zip包方式安装)--九五小庞

    1.去Mariadb官网下载zip安装包 下载地址:https://downloads.mariadb.org/mariadb/10.3.31/ 2.解压压缩包到指定的安装位置 3.在安装包的data ...

  8. 一个故事看懂HTTPS

    我是一个浏览器,每到夜深人静的时候,主人就打开我开始学习. 为了不让别人看到浏览记录,主人选择了"无痕模式". 但网络中总是有很多坏人,他们通过抓包截获我和服务器的通信,主人干了什 ...

  9. IIS短文件名漏洞原理与挖掘思路

    首先来几个网址先了解一下 https://www.jb51.net/article/166405.htm https://www.freebuf.com/articles/web/172561.htm ...

  10. C++ //虚析构和纯虚析构

    1 //虚析构和纯虚析构 2 3 #include <iostream> 4 #include <string> 5 using namespace std; 6 7 clas ...