本实例使用C3P0连接池做连接,详见https://www.cnblogs.com/qf123/p/10097662.html开源连接池C3P0的使用

DBUtils.java

 package com.qf.util;

 import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.sql.Statement; public class DBUtils {
  
static ComboPooledDataSource ds ;
static {
ds = new ComboPooledDataSource();//创建c3p0连接池数据源
} public static Connection getConn() {
Connection conn = null;
try {
conn = ds.getConnection();//从连接池获取数据库连接
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
} /*
* 释放资源
*/
public static void releaseResource(ResultSet rs,Statement statement,Connection conn) {
closeConnect(conn);
closeResultSet(rs);
closeStatement(statement);
}
public static void releaseResource(Statement statement,Connection conn) {
closeConnect(conn);
closeStatement(statement);
}
private static void closeResultSet(ResultSet rs) {
try {
if(rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void closeStatement(Statement statement) {
try {
if(statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void closeConnect(Connection conn) {
try {
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

ResultSetHandler接口,用于定义处理结果集的方法

package com.qf.util.dao;

import java.sql.ResultSet;

public interface ResultSetHandler<T> {

	T handle(ResultSet rs);
}

自定义通用DbUtils类MyDbUtils.java

  • query方法参数ResultSetHandler就是为了让用户根据实际情况自己定义结果集处理的方法
  • 使用T泛型,灵活返回具体对象
 package com.qf.util;

 import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import org.junit.Test; import com.qf.pojo.Person;
import com.qf.util.dao.ResultSetHandler; public class MyDbUtils {
@Test
public void test1() {
Person person = query("select * from person where id=?", new ResultSetHandler<Person>() { @Override
public Person handle(ResultSet rs) {
try {
if(rs.next()) {
String address = rs.getString("address");
Date time = rs.getDate("time");
int age = rs.getInt("age");
String name = rs.getString("name");
Person person = new Person(name , age, time, address);
return person;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}, 1);
System.out.println(person);
/**控制台输出结果:
* Person [name=smile, age=12, time=2018-03-06, address=null]
*/
} @Test
public void test2() {
List<Person> list = query("select * from person", new ResultSetHandler<List<Person>>() {
@Override
public List<Person> handle(ResultSet rs) {
try {
List<Person> list = new ArrayList<Person>();
while(rs.next()) {
String address = rs.getString("address");
Date time = rs.getDate("time");
int age = rs.getInt("age");
String name = rs.getString("name");
Person person = new Person(name , age, time, address);
list.add(person);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
});
for (Person person : list) {
System.out.println(person);
} /**控制台输出结果:
* Person [name=smile, age=12, time=2018-03-06, address=null]
* Person [name=wxf, age=13, time=2018-03-07, address=null]
* Person [name=smile, age=24, time=1970-01-01, address=null]
*/
} /**
* 查询
* @param sql
* @param handler 用于处理结果集rs
* @param args sql中?对应的参数值
* @return
*/
public <T> T query(String sql,ResultSetHandler<T> handler, Object ...args){
ResultSet rs = null;
PreparedStatement ps = null;
Connection conn = null;
try {
conn = DBUtils.getConn(); ps = conn.prepareStatement(sql);
ParameterMetaData metaData = ps.getParameterMetaData();
int count = metaData.getParameterCount();
for (int i = 0; i < count; i++) {
ps.setObject(i+1, args[i]);
}
rs = ps.executeQuery();
T t = handler.handle(rs);
return t;
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtils.releaseResource(ps, conn);
}
return null;
} /**
* 增删改
* @param sql
* @param args sql中?对应的参数值
*/
public void update(String sql,Object ...args) {
PreparedStatement ps = null;
Connection conn = null;
try {
conn = DBUtils.getConn();
ps = conn.prepareStatement(sql);
ParameterMetaData metaData = ps.getParameterMetaData();
int count = metaData.getParameterCount();
for (int i = 0; i < count; i++) {
ps.setObject(i+1, args[i]);
}
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtils.releaseResource(ps, conn);
}
} }

自定义DbUtils通用类的更多相关文章

  1. poi导出excel通用类

    一.关键的通用类public class PoiExportUtils {    private static HSSFWorkbook workBook; public PoiExportUtils ...

  2. mongdo通用类(C#版)

    日前从公司离职,很快,还没休息就步入了现在的公司,开始跟着公司的脚步走. 公司的项目基本都是大数据的,所以在数据库上大部分都是使用Mongodb和Redis,基本都是Nosql型的数据库为主.以前自己 ...

  3. 使用C# 操作存储过程,执行sql语句通用类

    如何使用C# 操作存储过程,执行sql语句? 闲话不多说,直接上代码:     /// <summary>    /// Sql通用类    /// </summary>    ...

  4. Excel通用类工具(二)

    前言 上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题:其实很简单的,只需要在上一篇的基础上加一个类就 ...

  5. Java学习笔记49(DBUtils工具类二)

    上一篇文章是我们自己模拟的DBUtils工具类,其实有开发好的工具类 这里使用commons-dbutils-1.6.jar 事务的简单介绍: 在数据库中应用事务处理案例:转账案例 张三和李四都有有自 ...

  6. Java基础-DButils工具类(QueryRunner)详解

    Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...

  7. 30_java之DButils工具类

    01DButils工具类的介绍个三个核心类 * A: DButils工具类的介绍个三个核心类 * a: 概述 * DBUtils是java编程中的数据库操作实用工具,小巧简单实用. * DBUtils ...

  8. DBUtils工具类和DBCP连接池

    今日内容介绍 1.DBUtils2.处理结果集的八种方式3.连接池4.连接池的用法1 PrepareStatement接口预编译SQL语句 1.1 预处理对象 * 使用PreparedStatemen ...

  9. Android 文件管理器通用类 FileUtil

    1.整体分析 1.1.源代码如下,可以直接Copy. public class FileUtil { private FileUtil() { } //****系统文件目录************** ...

随机推荐

  1. c# 遍历 Mysql 所有表所有列,查找目标数据

    在 Mysql 的 information_schema 库中 COLUMNS 表中存放了所有表的所有列. using MySql.Data.MySqlClient; using System; us ...

  2. 【杂记】docker搭建ELK 集群6.4.0版本 + elasticsearch-head IK分词器与拼音分词器整合

    大佬博客地址:https://blog.csdn.net/supermao1013/article/category/8269552 docker elasticsearch 集群启动命令 docke ...

  3. 解决mac pro 软件损坏

    1,打开终端 2,输入 sudo spctl --master-disable 3,打开系统偏好设置——>安全与隐私——>勾选任何来源

  4. python 在图像上写中文字体 (python write Chinese in image)

    本人处理图像的时候经常使用opencv的包,但是 cv2.putText 显示不了中文,所以查找了如何在python在图像上写中文的方法,在伟大的Stack Overflow上面找到一个方法,分享给大 ...

  5. C# 在Word表格中插入新行(表格含合并行)

    public string CreateWordFile(string CheckedInfo)         {             string message = "" ...

  6. jsp标签的介绍

    cankao:http://www.cnblogs.com/xdp-gacl/p/3788369.html jsp常用的标签有以下3个 1.<jsp:include>标签 2.<js ...

  7. MPU6050寄存器记录

    参考资料:http://blog.sina.com.cn/s/blog_8240cbef01018i10.html 不过有一些寄存器没有写到,所以我自己加一点: 1)Register 25  - IN ...

  8. SQL中LEFT JOIN ON AND 与 LEFT JOIN ON WHERE的区别

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. ON...WHERE ' order by ts.id SQL执行过程: 生成临时表: ON条件:  ...

  9. Python基础教程(004)--Python的设计哲学

    前言 Python已经成为了一门流行的编程语言. 知识点 1,优雅 2,明确 3,简单 Python开发者的哲学是:用一种方法,最好是只有一种方法来做一件事. 如果面临多种选择,Python开发者都会 ...

  10. SQL语句之-函数

    六.函数 1.文本处理函数 2.日期和时间处理函数 MySQL数据库:SELECT * FROM orders WHERE YEAR(order_date)=2012  七.汇总数据 1.AVG()函 ...