使用DbUtils和dbcp连接池写的通用的CRUD工具类
目录
1 项目目录结构
这里只介绍工具类相关的部分
2 工具类需要的jar包
2.1 Dbutils需要的jar包
commons-dbutils-1.7.jar
2.2 dbcp需要的jar包
commons-dbcp2-2.5.0.jar
commons-logging-1.2.jar
commons-pool2-2.6.0.jar
2.3 数据库jar包
这里使用了mysql8的数据库,需要导入相应的jar包,根据自己的数据库导入jar包
mysql-connector-java-8.0.12.jar
3 代码部分
3.1 dbcp.properties
#连接设置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/stus?useSSL=false&serverTimezone=Asia/Shanghai
username=root
password=123456
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=UTF8
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
3.2 DBCPUtils.java
package com.zhujunwei.util ;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
/**
* 数据库操作的工具类
* @author zhujunwei
* 2019年1月24日 下午3:36:21
*/
public class DBCPUtil {
static DataSource dataSource = null ;
static {
try {
dataSource = BasicDataSourceFactory.createDataSource(getProperties());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 得到DataSource连接资源
* @return dataSource
*/
public static DataSource getDataSource() {
return dataSource ;
}
/**
* 得到Connection连接
* @return Connection
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* 得到配置文件
* @return properties
*/
private static Properties getProperties() {
Properties properties = null ;
try {
properties = new Properties() ;
// InputStream is = new FileInputStream("src//dbcp.properties");
//使用类加载器,去读取src底下的资源文件。 后面在servlet
InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
return properties;
}
/**
* 释放资源
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn , Statement st , ResultSet rs){
closeRs(rs);
closeSt(st);
closeConn(conn);
}
public static void release(Connection conn , Statement st){
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}
}
private static void closeSt(Statement st){
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
private static void closeConn(Connection conn){
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
3.3 CommenCRUDUtil.java
package com.zhujunwei.util;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
/**
* 提供通用的增删改查方法,只需要提供相应的sql语句以及参数 依赖于commons-dbutils.jar包
* @author zhujunwei
* 2019年1月20日 下午9:53:51
*/
public class CommonCRUDUtil {
/**
* 通用的【增删改】方法
* @param sql 要执行的sql语句
* @param args sql语句带的参数
* @return 返回执行成功的行数
*/
public static int update(String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
int len = 0;
try {
conn = DBCPUtil.getConnection();
ps = conn.prepareStatement(sql);
ParameterMetaData metaData = ps.getParameterMetaData();
int count = metaData.getParameterCount();
// 取到sql语句的参数
for (int i = 0; i < count; i++) {
ps.setObject(i + 1, args[i]);
}
len = ps.executeUpdate();
System.out.println("【CommonCRUDUtil:update】成功修改" + len + "行。");
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBCPUtil.release(conn, ps);
}
return len;
}
/**
* 通用的,不带参数的查询
*
* @param sql 执行的sql语句
* @param rsh ResultSetHandler接口的实现子类 new BeanHandler<Account>(Account.class)
* 或new BeanListHandler<Account>(Account.class)
* @return 返回的查询对象或对象集合,可以使用List<Account> list=接收或Account account接收
* @throws SQLException
*/
public static <T> T query(String sql, ResultSetHandler<T> rsh){
T t = null;
try {
DataSource dataSource = DBCPUtil.getDataSource();
QueryRunner queryRunner = new QueryRunner(dataSource);
t = queryRunner.query(sql, rsh);
} catch (SQLException e) {
e.printStackTrace();
}
return t;
}
/**
* 带参数的通用查询
*
* @param sql 执行的sql语句
* @param rsh ResultSetHandler接口的实现子类 new BeanHandler<Account>(Account.class)
* 或new BeanListHandler<Account>(Account.class)
* @param args sql语句参数
* @return 返回的查询对象或对象集合,可以使用List<Account> list=接收或Account account接收
*/
public static <T> T query(String sql, ResultSetHandler<T> rsh, Object... args) {
T t = null;
try {
DataSource dataSource = DBCPUtil.getDataSource();
QueryRunner queryRunner = new QueryRunner(dataSource);
t = queryRunner.query(sql, rsh, args);
} catch (SQLException e) {
e.printStackTrace();
}
return t;
}
}
4 使用方法
4.1 StudentDao.java
package com.zhujunwei.dao;
import java.util.List;
import com.zhujunwei.domain.Student;
/**
* 这是针对学生表的数据访问
* @author zhujunwei
* 2019年1月23日 上午10:57:40
*/
public interface StudentDao {
int PAGE_SIZE = 2 ;
/**
* 查询所有学生
* @return List<Student>
*/
public List<Student> findAll();
/**
* 添加学生信息
* @param student 接收一个学生对象
* @return 返回成功的条数
*/
public int insert(Student student);
/**
* 根据学生id删除学生
* @param sid
* @return 返回成功删除的条数
*/
public int delete(String sid);
/**
* 根据学生id查询单个学生
* @param sid
* @return 返回查询到的学生类
*/
public Student findStudentById(String sid);
/**
* 更新一个学生的信息
* @param student
* @return 更新成功的条数
*/
public int update(Student student);
/**
* 根据学生名字、性别查询学生
* @param sname 学生名字
* @param sgender 学生性别
* @return 查询到的学生集合
*/
public List<Student> searchStudent(String sname , String gender);
/**
* 查询当页的学生数据
* @param currentPage 当前第几页
* @return 查询到的学生列表
*/
public List<Student> findStudentByPage(int currentPage);
/**
* 查询总的学生记录数
* @return
*/
public int findCount();
}
4.2 StudenDaoImpl.java
package com.zhujunwei.dao.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.zhujunwei.dao.StudentDao;
import com.zhujunwei.domain.Student;
import com.zhujunwei.util.CommonCRUDUtil;
import com.zhujunwei.util.TextUtils;
/**
* 这是StudentDao的实现。针对前面的定义规范,做出具体的实现。
* @author zhujunwei
* 2019年1月23日 上午11:02:08
*/
public class StudentDaoImpl implements StudentDao {
@Override
public List<Student> findAll() {
String sql = "select * from stu";
return CommonCRUDUtil.query(sql , new BeanListHandler<Student>(Student.class));
}
@Override
public int insert(Student student) {
String sql = "insert into stu values(null,?,?,?,?,?,?)";
return CommonCRUDUtil.update(sql ,
student.getSname(),
student.getGender(),
student.getPhone(),
student.getBirthday(),
student.getHobby(),
student.getInfo());
}
@Override
public int delete(String sid) {
String sql = "delete from stu where sid = ?";
return CommonCRUDUtil.update(sql, sid);
}
@Override
public Student findStudentById(String sid) {
String sql = "select * from stu where sid = ?" ;
return CommonCRUDUtil.query(sql, new BeanHandler<Student>(Student.class),sid);
}
@Override
public int update(Student student) {
String sql = "update stu set sname=?,gender=?,phone=?,birthday=?,hobby=?,info=? where sid=?";
return CommonCRUDUtil.update(sql ,
student.getSname(),
student.getGender(),
student.getPhone(),
student.getBirthday(),
student.getHobby(),
student.getInfo(),
student.getSid());
}
@Override
public List<Student> searchStudent(String sname, String gender) {
String sql = "select * from stu where 1=1 " ;
List<String> list = new ArrayList<String>();
if(!TextUtils.isEmpty(sname)) {
sname = "%"+sname+"%";
sql = sql + "and sname like ?";
list.add(sname);
}
if(!TextUtils.isEmpty(gender)) {
sql = sql + "and gender=?" ;
list.add(gender);
}
return CommonCRUDUtil.query(sql, new BeanListHandler<Student>(Student.class),list.toArray());
}
@Override
public List<Student> findStudentByPage(int currentPage) {
String sql = "select * from stu limit ? offset ?" ;
return CommonCRUDUtil.query(sql, new BeanListHandler<Student>(Student.class), StudentDao.PAGE_SIZE,(currentPage-1)*StudentDao.PAGE_SIZE);
}
@Override
public int findCount() {
String sql = "select count(*) from stu" ;
Long len = (Long)CommonCRUDUtil.query(sql, new ScalarHandler<Object>());
// QueryRunner queryRunner = new QueryRunner(DBCPUtil.getDataSource());
// Long len = (Long)queryRunner.query(sql, new ScalarHandler());
return len.intValue() ;
}
}
---------------
我每一次回头,都感觉自己不够努力,所以我不再回头。
---------------