源码-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) ------------------------------------------------- ...
随机推荐
- DTOJ 3999: 游戏
题目描述这个游戏是这样的,你有一个初始序列S ,你每次可以选择一段任意长度的连续区间,把他们+1 再膜k,给定目标序列,你需要尝试用尽量少的操作次数将初始序列变为目标序列.作为一名优秀的OIer,您认 ...
- excel-大于0的数值标记红色且标记红色上箭头,小于0的数值标记绿色且标记绿色下箭头,等于0的数值标记黄色且标记右箭头
0.数值是常规的数值: [蓝色]"↑"0;[红色]"↓"0;[黄色]"→"0 [蓝色]"↑"0.0;[红色]" ...
- javaWeb - 2 — ajax、json — 最后附:后台获取前端中的input type = "file"中的信息 — 更新完毕
1.ajax是什么? 面向百度百科一下就知道了,这里就简单提炼一下 Ajax即Asynchronous Javascript And XML(异步JavaScript和XML).当然其实我们学的应该叫 ...
- 日常Java 2021/10/25
ArrayList存储数字 import java.util.ArrayList; public class Arr_test { public static void main(String[] a ...
- C语言time函数获取当前时间
以前放了个链接,但是原作者把博文删了,这里放一个获取时间的代码,已经比较详细所以不做注释 #include<stdio.h> #include<time.h> #include ...
- Android 基础UI组件(二)
1.Spinner 提供一个快速的方法来从一组值中选择一个值.在默认状态Spinner显示当前选择的值.触摸Spinner与所有其他可用值显示一个下拉菜单,可以选择一个新的值. /** * 写死内容: ...
- Linux基础命令---mysqlshow显示数据库
mysqlshow mysqlshow是一个客户端的程序,它可以显示数据库的信息.表信息.字段信息. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 ...
- Ruby Gems更换淘宝源方法
官方的 Rubygems 源由于有些资源放在 Amazon S3 上面,所以有时会抽风,在 Linux 下我用 proxychains gem install xxx 实现了指定程序实行 Shadow ...
- rust方法集
随机数.数字对比.控制台输入 use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("please ...
- Spring(2):依赖注入DI
依赖注入DI 当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在Spring里,创建被 ...