源码-DbUtil.java
package com.tetralogy.util; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.*; public class DbUtil {
private static DbUtil instance;
// 连接池数据源(即连接池)
DataSource dataSource; public static DbUtil getInstance() {
if (null == instance) {
instance = new DbUtil();
}
return instance;
}
private DbUtil() {
Properties prop = new Properties();
InputStream is = DbUtil.class.getResourceAsStream("/druid.properties");
try {
prop.load(is);
//返回的是DataSource
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
} private Connection getConnection() throws Exception {
Connection conn = dataSource.getConnection();;
return conn;
} public static int Execute(String sql,Object[] object) throws Exception{
Connection con = null;
PreparedStatement pstmt = null;
int count = -1;
try {
DbUtil instance = DbUtil.getInstance();
con = instance.getConnection();
pstmt = con.prepareStatement(sql);
if(object==null ||object.equals("")){ //判断一下 object 是否为空 如果为空直接执行sql语句
count = pstmt.executeUpdate();
}else{
for(int i=0;i<object.length;i++){
pstmt.setObject(i+1,object[i]);
}
count = pstmt.executeUpdate(); //最后执行executeQuery()方法 执行sql语句
}
} catch (Exception e) {
throw e;
}finally {
DbUtil.close(con,pstmt,null);
}
return count;
} public static int executeByParams(String sql, Object...params) throws Exception{
List<Object> list = new ArrayList<>();
if(null!=params){
for(int i=0;i<params.length;i++){
list.add(params[i]);
}
}
return Execute(sql,list.toArray());
} public static List queryForList(String sql, Object[] object) throws Exception {
DbUtil instance = DbUtil.getInstance();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List list = null;
try {
con = instance.getConnection();
pstmt = con.prepareStatement(sql);
if(object==null){
rs = pstmt.executeQuery();
}else{
for(int i=0;i<object.length;i++){
pstmt.setObject(i+1,object[i]);
}
rs = pstmt.executeQuery();
}
//转化
list = DbUtil.rsToList(rs);
} catch (Exception e) {
throw e;
}finally {
DbUtil.close(con,pstmt,rs);
}
return list;
} //T:代表我返回的结果,他是集合里面使用的泛型的结果;他和我们传过来的字节码文件也是一个类型
// class<T> cls :我们实体类的字节码对象
public static <T> List<T> queryForList(Class<T> cls, String sql, Object[] object) throws Exception {
DbUtil instance = DbUtil.getInstance();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List list = null;
try {
con = instance.getConnection();
pstmt = con.prepareStatement(sql);
if(object==null){
rs = pstmt.executeQuery();
}else{
for(int i=0;i<object.length;i++){
pstmt.setObject(i+1,object[i]);
}
rs = pstmt.executeQuery();
}
//转化
list = DbUtil.rsToEntity(cls,rs);
} catch (Exception e) {
throw e;
}finally {
DbUtil.close(con,pstmt,rs);
}
return list;
} public static <T> T queryForEntity(Class<T> cls, String sql, Object[] param) throws Exception {
List<T> list = queryForList(cls,sql,param);
if(list!=null && list.size()>0){
return list.get(0);
}
return null;
} public static String queryForOne(String sql, Object[] object) throws Exception {
DbUtil instance = DbUtil.getInstance();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String result = "";
try {
con = instance.getConnection();
pstmt = con.prepareStatement(sql);
if(object==null){
rs = pstmt.executeQuery();
}else{
for(int i=0;i<object.length;i++){
pstmt.setObject(i+1,object[i]);
}
rs = pstmt.executeQuery();
}
while (rs.next()) {
result = rs.getString(1);
break;
} } catch (Exception e) {
throw e;
}finally {
DbUtil.close(con,pstmt,rs);
}
return result;
} //关闭流原则,先创建后关闭
private static void close(Connection con, PreparedStatement ps, ResultSet rs) throws Exception {
if (ps != null) {
ps.close();
ps = null;
}
if (rs != null) {
rs.close();
rs = null;
}
if (con != null) {
con.close();
con = null;
}
} private static List rsToList(ResultSet rs) throws Exception{
List list = new ArrayList();
ResultSetMetaData md = rs.getMetaData();//获取键名
int columnCount = md.getColumnCount();//获取行的数量
while (rs.next()) {
Map rowData = new HashMap();//声明Map
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));//获取键名及值
}
list.add(rowData);
}
return list;
} private static <T> List<T> rsToEntity(Class<T> cls, ResultSet rs) throws Exception{
ResultSetMetaData md = rs.getMetaData();//获取键名
int columnCount = md.getColumnCount();//获取行的数量
List<T> list = new ArrayList<>();
while (rs.next()) {
T t = cls.newInstance();
for (int i = 1; i <= columnCount; i++) {
String colName = md.getColumnLabel(i);
Object valueObj = rs.getObject(colName);
Field field = cls.getDeclaredField(colName);
field.setAccessible(true);
field.set(t,valueObj);
}
list.add(t);
}
return list;
}
}
源码-DbUtil.java的更多相关文章
- 源码(09) -- java.util.Arrays
java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...
- 从源码学习Java并发的锁是怎么维护内部线程队列的
从源码学习Java并发的锁是怎么维护内部线程队列的 在上一篇文章中,凯哥对同步组件基础框架- AbstractQueuedSynchronizer(AQS)做了大概的介绍.我们知道AQS能够通过内置的 ...
- JDK1.8源码(五)——java.util.Vector类
JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html
- JDK1.7.0_45源码阅读<java.lang.Boolean>
本文适合的人群 其实感觉写这个标题的内容没有必要,只要你觉得对你有帮助那么就适合你,对你没帮助那么就不适合你.毕竟我不是专业作者,但咱会尽力的.其实最重要的一点是我不希望浪费您宝贵时间. 简要把内容在 ...
- Java源码之 java.util.concurrent 学习笔记01
准备花点时间看看 java.util.concurrent这个包的源代码,来提高自己对Java的认识,努力~~~ 参阅了@梧留柒的博客!边看源码,边通过前辈的博客学习! 包下的代码结构分类: 1.ja ...
- 如何阅读Java源码 阅读java的真实体会
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比 ...
- 从源码看java中Integer的缓存问题
在开始详细的说明问题之前,我们先看一段代码 public static void compare1(){ Integer i1 = 127, i2 = 127, i3 = 128, i4 = 128; ...
- 源码(03) -- java.util.Collection<E>
java.util.Collection<E> 源码分析(JDK1.7) -------------------------------------------------------- ...
- 源码(05) -- java.util.AbstractCollection<E>
java.util.AbstractCollection<E> 源码分析(JDK1.7) ------------------------------------------------- ...
随机推荐
- 洛谷 P4755 - Beautiful Pair(主席树+分治+启发式优化)
题面传送门 wssb,我紫菜 看到这类与最大值统计有关的问题可以很自然地想到分治,考虑对 \([l,r]\) 进行分治,求出对于所有 \(l\le x\le y\le r\) 的点对 \((x,y)\ ...
- 62-Binary Tree Level Order Traversal
Binary Tree Level Order Traversal My Submissions QuestionEditorial Solution Total Accepted: 102531 T ...
- EXCEL excel中运用ctrl+D、ctrl+enter、ctrl+E批量填充数据
在excel中,利用鼠标拖动可以快速向下或者向右填充序列或者复制单元格.但是利用快捷键也可以实现多种填充方式,本文就为大家介绍一些ctrl系列快捷键的填充,一起来看看吧. 封面tu 一,ctrl+D/ ...
- 强化学习实战 | 自定义Gym环境之井字棋
在文章 强化学习实战 | 自定义Gym环境 中 ,我们了解了一个简单的环境应该如何定义,并使用 print 简单地呈现了环境.在本文中,我们将学习自定义一个稍微复杂一点的环境--井字棋.回想一下井字棋 ...
- C#最大值
dtToSList = sqlAccess.ExecuteTable(CommandText); ToSNo = Convert.ToString(dtToSList.Rows[i].ItemArra ...
- flink-----实时项目---day05-------1. ProcessFunction 2. apply对窗口进行全量聚合 3使用aggregate方法实现增量聚合 4.使用ProcessFunction结合定时器实现排序
1. ProcessFunction ProcessFunction是一个低级的流处理操作,可以访问所有(非循环)流应用程序的基本构建块: event(流元素) state(容错,一致性,只能在Key ...
- k8s配置中心-configmap,Secret密码
目录 k8s配置中心-configmap,Secret 创建ConfigMap 使用ConfigMap subPath参数 Secret 官方文档 编写secret清单 使用secret 在 Pod ...
- Android项目的settings.gradle和build.gradle
gradle构建的项目中的build.gradle和settings.gradle文件 build.gradle 浅析(一) 史上最全的Android build.gradle配置教程 Android ...
- oracle 存储过程及REF CURSOR的使用
基本使用方法及示例 1.基本结构: CREATE OR REPLACE PROCEDURE 存储过程名字 (参数1 IN NUMBER,参数2 IN NUMBER) AS 变量1 INTEGER := ...
- SpringBoot(4):整合Mybatis
1. 导入mybatis所需要的依赖 1 <!-- 引入 myBatis,这是 MyBatis官方提供的适配 Spring Boot的--> 2 <dependency> 3 ...