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

  1. 源码(09) -- java.util.Arrays

    java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...

  2. 从源码学习Java并发的锁是怎么维护内部线程队列的

    从源码学习Java并发的锁是怎么维护内部线程队列的 在上一篇文章中,凯哥对同步组件基础框架- AbstractQueuedSynchronizer(AQS)做了大概的介绍.我们知道AQS能够通过内置的 ...

  3. JDK1.8源码(五)——java.util.Vector类

    JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html

  4. JDK1.7.0_45源码阅读<java.lang.Boolean>

    本文适合的人群 其实感觉写这个标题的内容没有必要,只要你觉得对你有帮助那么就适合你,对你没帮助那么就不适合你.毕竟我不是专业作者,但咱会尽力的.其实最重要的一点是我不希望浪费您宝贵时间. 简要把内容在 ...

  5. Java源码之 java.util.concurrent 学习笔记01

    准备花点时间看看 java.util.concurrent这个包的源代码,来提高自己对Java的认识,努力~~~ 参阅了@梧留柒的博客!边看源码,边通过前辈的博客学习! 包下的代码结构分类: 1.ja ...

  6. 如何阅读Java源码 阅读java的真实体会

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心.   说到技术基础,我打个比 ...

  7. 从源码看java中Integer的缓存问题

    在开始详细的说明问题之前,我们先看一段代码 public static void compare1(){ Integer i1 = 127, i2 = 127, i3 = 128, i4 = 128; ...

  8. 源码(03) -- java.util.Collection<E>

     java.util.Collection<E> 源码分析(JDK1.7) -------------------------------------------------------- ...

  9. 源码(05) -- java.util.AbstractCollection<E>

    java.util.AbstractCollection<E> 源码分析(JDK1.7) ------------------------------------------------- ...

随机推荐

  1. SpringSecurity过滤器原理

    SpringSecurity原理 主要过滤器链 SpringSecurity的功能主要是由一系列的过滤器链相互配合完成的.验证一个过滤器之后放行到下一个过滤器链,然后到最后. 认证流程 过滤器作用 S ...

  2. CF1004D Sonya and Matrix

    不要想当然. 考虑到我们一定有存在个数为\(4\)的倍数的数. 否则第一个不是的数即为\(x\). 那么我们设\(b\)为所有的数的最大值. 那么显然有\(|n - x| + |m - y| = b\ ...

  3. CF932F Escape Through Leaf

    CF932F Escape Through Leaf 首先, $ O(n^2) $ dp 是很显然的,方程长这样: \[dp[u] = min\{dp[v] + a_u\times b_v\} \] ...

  4. zabbix 内网机器通信状态

    a=0 for xgip in ${xgipset[*]} do let a+=1 fping $xgip|grep alive >/dev/null if [ $a != 3 ];then i ...

  5. Markdown-写作必备

    Markdown--入门指南 导语: Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdow ...

  6. 安装octave详解

    1. 一些可以替换的库(可跳过) 默认的库安装libblas.dll.OpenBLAS-v2.6.0-0-54e7b37_dynamicarch_nt4(自动检测CPU类型) 在目录下<your ...

  7. php操作mongodb手册地址

    php操作mongodb手册地址: http://php.net/manual/zh/class.mongocollection.php

  8. JAVA写入TXT

    用java生成txt文件有两种方式: 1)是通过字符流(或字节流): 2)是直接调用PrintWriter类. 具体实现过程如下: 1)字符流(字节流) 代码如下: import java.io.Fi ...

  9. python-3.x-生成器使用

    生成器函数代码: 1 def gen(n): 2 i = 1; 3 sum = 0; 4 while i <= n: 5 ''' 6 方法体1 -- sum求和是1到9的和 7 yield su ...

  10. C++ 中的多重继承的问题

    如何正确使用C++多重继承 BY R12F · PUBLISHED 2011年06月17日 · UPDATED 2012年03月11日   原创文章,转载请注明:转载自Soul Apogee本文链接地 ...