自定义DbUtils通用类
本实例使用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通用类的更多相关文章
- poi导出excel通用类
一.关键的通用类public class PoiExportUtils { private static HSSFWorkbook workBook; public PoiExportUtils ...
- mongdo通用类(C#版)
日前从公司离职,很快,还没休息就步入了现在的公司,开始跟着公司的脚步走. 公司的项目基本都是大数据的,所以在数据库上大部分都是使用Mongodb和Redis,基本都是Nosql型的数据库为主.以前自己 ...
- 使用C# 操作存储过程,执行sql语句通用类
如何使用C# 操作存储过程,执行sql语句? 闲话不多说,直接上代码: /// <summary> /// Sql通用类 /// </summary> ...
- Excel通用类工具(二)
前言 上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题:其实很简单的,只需要在上一篇的基础上加一个类就 ...
- Java学习笔记49(DBUtils工具类二)
上一篇文章是我们自己模拟的DBUtils工具类,其实有开发好的工具类 这里使用commons-dbutils-1.6.jar 事务的简单介绍: 在数据库中应用事务处理案例:转账案例 张三和李四都有有自 ...
- Java基础-DButils工具类(QueryRunner)详解
Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...
- 30_java之DButils工具类
01DButils工具类的介绍个三个核心类 * A: DButils工具类的介绍个三个核心类 * a: 概述 * DBUtils是java编程中的数据库操作实用工具,小巧简单实用. * DBUtils ...
- DBUtils工具类和DBCP连接池
今日内容介绍 1.DBUtils2.处理结果集的八种方式3.连接池4.连接池的用法1 PrepareStatement接口预编译SQL语句 1.1 预处理对象 * 使用PreparedStatemen ...
- Android 文件管理器通用类 FileUtil
1.整体分析 1.1.源代码如下,可以直接Copy. public class FileUtil { private FileUtil() { } //****系统文件目录************** ...
随机推荐
- 关于C++中的非静态类成员函数指针
昨天发现了一个问题,就是使用对类中的非静态成员函数使用std::bind时,不能像普通函数一样直接传递函数名,而是必须显式地调用&(取地址),于是引申出我们今天的问题:非静态类成员函数指针和普 ...
- Python随笔记录之一
import os import random from copy import deepcopy ''' 读取特定目录下所有的文件夹, 和文件名 ''' def eachDir(path): for ...
- 力扣—one plus(加一) python实现
题目描述: 中文: 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头 ...
- web之请求转发与重定向
请求转发: 重定向:
- 【leetcode】662. Maximum Width of Binary Tree
题目如下: Given a binary tree, write a function to get the maximum width of the given tree. The width of ...
- 【JZOJ1913】【BZOJ2124】等差子序列
description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<-<pLen<=N (Len>=3), 使得A ...
- Linux的软件包管理
此博客的环境任意. 主题Linux的软件包管理 一软件管理工具 1编译安装 2rpm包管理 3yum管理 二软件运行和编译 1ABI 应用程序的二进制接口 ABI:Appl ...
- POJ 2528(线段树+离散化+特殊离散化)网上博客很少有人真正写对!!! 是POJ数据太水...
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
- 【Flutter学习】一些重要的概念之of(context)方法
在flutter中我们经常会使用到这样的代码 //打开一个新的页面 Navigator.of(context).push //打开Scaffold的Drawer Scaffold.of(context ...
- python 的按位与、或、异或 运算
符号 描述 运算规则 by MoreWindows & 与 两个位都为1时,结果才为1 (统计奇数) | 或 两个位都为0时,结果才为0 ...