本实例使用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. 修改el-input

    无论是input框,还是select, 都是对 el-input 进行修改: .houseRegisterCompany .el-input{ width: 130px; }

  2. C#log4net的使用

    一,下载log4net.dll,在项目中添加引用 二,在站点根目录添加,配置文件(log4net.xml), <file value="logs/logfile.txt"/& ...

  3. 《代码大全2》读书笔记 Week 1

    <代码大全2>第一.二.三章 隐喻思维在西方是一个热门的话题,隐喻的认知功能在各个学科正受到越来越多的重视,依照我的理解,其实就是以众所周知或者理解主体熟悉的事物为符号去将新事物.新概念具 ...

  4. Java使用SSH远程访问Windows并执行命令

    转载于:http://blog.csdn.net/carolzhang8406/article/details/6760430   https://blog.csdn.net/angel_xiaa/a ...

  5. JavaSE---多线程---Callable、Future

    1.概述 1.1 JDK1.5后,Java提供了Callable接口,该接口提供一个call方法作为线程执行体,该call方法可以  有返回值.声明抛出异常: 因此,我们可以直接将Callable接口 ...

  6. Windows下Redis安装+可视化工具Redis Desktop Manager使用

    Redis是有名的NoSql数据库,一般Linux都会默认支持.但在Windows环境中,可能需要手动安装设置才能有效使用.这里就简单介绍一下Windows下Redis服务的安装方法,希望能够帮到你. ...

  7. 那些长短不一的PCI-E插槽都有什么不一样?

    https://www.ednchina.com/news/20171121-PCI-E.html 时间:2017-11-21   目前PCI-E插槽已经成为了主板上的主力扩展插槽,除了显卡会用到P ...

  8. mysql查询诊断分析工具

    Query Profiler是MYSQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的性能瓶颈在什么地方.通常我们是使用的explain,以及slow query log都无法做到 ...

  9. [CSP-S模拟测试41]题解

    中间咕的几次考试就先咕着吧…… A.夜莺与玫瑰 枚举斜率.只考虑斜率为正且不平行于坐标轴的直线,最后把$ans\times 2$再$+1$即可. 首先肯定需要用$gcd(i,j)==1$确保斜率的唯一 ...

  10. Java IO Demo

    //FileReader FileWriter 读写英文    public void FileReaderAndWriter1() throws Exception { File filePath ...