本实例使用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#解惑:HashSet<T>类

    原贴: https://blog.csdn.net/X_X_OO/article/details/52529548 https://www.cnblogs.com/refuge/p/9465466.h ...

  2. docker镜像仓库

    搭建私有镜像仓库 Docker Hub作为Docker默认官方公共镜像,如果想自己搭建私有镜像仓库,官方也提供registry镜像,使得搭建私有仓库非常简单. 下载registry镜像并启动 [roo ...

  3. JavaScript 中的 this 并不难

    js学习笔记 --- this 详解 js中的this,如果没有深入的学习了解,那么this将会是让开发人员很头疼的问题.下面,我就针对this,来做一个学习笔记. 1.调用位置 在理解this的绑定 ...

  4. mac OS 安装 Homebrew及常用命令

    Homebrew  是由国外大神 Max Howell 开发的一款包管理工具,类似Debian的apt,他可以安装任何你想安装的东西. 安装方法 命令行输入 /usr/bin/ruby -e &quo ...

  5. 利用Swiperefreshlayout实现下拉刷新功能的技术探讨

    在常见的APP中通常有着下拉页面从而达到刷新页面的功能,这种看似简单的功能有着花样繁多的实现方式.而利用Swiperefreshlayout实现下拉刷新功能则是其中比较简明扼要的一种. 一般来说,在竖 ...

  6. for循环(foreach型)流程

  7. Intellij idea创建javaWeb:实现JSP/Servlet(转)

    转自:https://www.jianshu.com/p/9684e90cf7b5 Intellij idea创建javaWeb:实现JSP/Servlet by_love唯念 关注 2016.12. ...

  8. WPF ComboBox 默认选中无效

    在WPF开发当中,我发现ComboBox的默认选中逻辑失效了,仔细查找后发现后台逻辑并没有出现问题. 测试后发现在XAML中,ComBoBox控件的SelectedValue属性需要写在ItemSou ...

  9. Spring Boot和Spring Cloud学习资源推荐

    Spring Boot和Spring Cloud学习资源推荐   比较好的学习资源,分享一下. 1.Spring Boot官方文档:http://projects.spring.io/spring-b ...

  10. mui使用总结

    mui是一个高性能的HTML5开发框架,从UI到效率,都在极力追求原生体验:这个框架自身有一些规则,刚接触的同学不很熟悉,特总结本文:想了解mui更详细的信息,请访问mui官网 DOM结构 关于mui ...