使用DbUtils和dbcp连接池写的通用的CRUD工具类

目录

1 项目目录结构

2 工具类需要的jar包

2.1 Dbutils需要的jar包

2.2 dbcp需要的jar包

2.3 数据库jar包

3 代码部分

3.1 dbcp.properties

3.2 DBCPUtils.java

3.3 CommenCRUDUtil.java

4 使用方法

4.1 StudentDao.java

4.2 StudenDaoImpl.java


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() ;
	}

}

 

posted @ 2019-02-27 19:52  雨中遐想  阅读(11)  评论(0编辑  收藏  举报  来源