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();
}
}
}
}
}

最新文章

  1. JavaScript 精粹
  2. C语言程序设计第4堂作业
  3. Singleton模式和Mono-State模式
  4. POJ1155 TELE(树形DP)
  5. 连连看的设计与实现——四人小组项目(NABCD)
  6. 使用 Vagrant 打造跨平台开发环境
  7. GenderGuesser
  8. cocos2dx 的基本框架
  9. 查看SQLServer各种缓存的情况
  10. 小猪的Android入门之路 Day 3 - part 3
  11. asp.net将object或string转为int
  12. 基于飞思卡尔i.MX 6Quad Sabrelite开发板的触摸屏调试
  13. 前端学习笔记(zepto或jquery)——对li标签的相关操作(四)
  14. Codeforces 320A Magic Numbers
  15. HDU 1728 逃离迷宫(DFS)
  16. 【转】redis-cluster安装配置
  17. windows 重装系统
  18. 依赖注入的方式测试ArrayList和LinkedList的效率(对依赖注入的再次理解)
  19. sphinx/Coreseek 4.1 执行make出错
  20. 用flask实现一个用户登录的功能

热门文章

  1. sqlite无法保存数据
  2. Bootstrap 树形列表与右键菜单
  3. pycharm配置selenium碰到的问题
  4. Java面向对象11——多态
  5. 刷到血赚!字节跳动内部出品:722页Android开发《360&#176;全方面性能调优》学习手册首次外放,附项目实战!
  6. MySQL全面瓦解27:主从复制(原理 + 实践)
  7. springboot项目打包docker镜像maven插件
  8. springboot:使用异步注解@Async的那些坑
  9. How to build your custom release bazel version?
  10. Blazor+Dapr+K8s微服务之状态管理