目录

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

使用DbUtils和dbcp连接池写的通用的CRUD工具类的更多相关文章

  1. DBUtils工具类和DBCP连接池

    今日内容介绍 1.DBUtils2.处理结果集的八种方式3.连接池4.连接池的用法1 PrepareStatement接口预编译SQL语句 1.1 预处理对象 * 使用PreparedStatemen ...

  2. JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作

    1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...

  3. Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...

  4. DBCP连接池介绍

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...

  5. DBCP连接池原理分析及配置用法

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...

  6. 【转】DBCP连接池原理分析

    ---------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 JDBC 3. DB ...

  7. 使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案

    转自:http://blog.csdn.net/wangfayinn/article/details/24623575 c3p0数据库连接池mysql8小时 目录(?)[-] 基本问题解决 项目环境 ...

  8. 使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方式

    本文提供了对c3p0与DBCP连接池连接MySql数据库时. 8小时内无请求自己主动断开连接的解决方式.首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方式. ...

  9. DBCP连接池使用

    转载请注明原文地址https://www.cnblogs.com/ygj0930/p/11280475.html 一:引入jar包或添加依赖 1:jar包 2:maven依赖 <dependen ...

  10. DBCP连接池原理分析(转载)

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...

随机推荐

  1. linux安装wps

     1. http://wps-community.org/downloads 下载            wps-office_10.1.0.5672~a21_i386.deb            ...

  2. DeepSeek + 在线Excel , 打造智能表格新纪元

    微信搜一搜[葡萄城社区]关注,了解更多动态 SpreadJS 已经接入 DeepSeek 啦! 相信这段时间,大家都被[DeepSeek]刷屏了.DeepSeek 以其强大的技术能力和创新的解决方案, ...

  3. curl使用总结

    1.请求源码 curl http://wttr.in/ 天气网站  2.文件下载 -o :保存文件 -s:禁用进度表 --progress-bar:让进度显示为进度条 -C - :断点连续下载 --l ...

  4. idle如何调试程序

    1.启动idle ctrl+n 快捷键 新建命令窗口 输入程序 4.F5 调试程序,结果看在启动界面查看

  5. 【记录】C++STL容器/特有类 使用积累

    STL容器共有成员函数 size() max_size() empty() begin() end() clear() [链接]csdn_STL中所有容器共有成员函数 双端队列deque 1.创建与初 ...

  6. OpenCV开发笔记(八十三):图像remap实现哈哈镜效果

    前言   对图像进行非规则的扭曲,实现哈哈镜就是一种非常规的扭曲方式,本文先描述remap的原理,然后通过remap实现哈哈镜.   Demo              基于原始算法,可以进行二次开发 ...

  7. 这是base-还原数字查正确码表再解码

    题目: dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 1 ...

  8. Oracle10g RAC -- Linux 集群文件系统

    通常,集群只是一组作为单一系统运行的服务器( PC 或者工作站).但是,这个定义的外延不断显著扩大:集群技术现在不但是一个动态领域,而且其各种应用程序正不断吸收新的特性.此外,集群文件系统技术(无论是 ...

  9. Anaconda指定目录安装终极指南+避坑大全

    最近被Python环境搞疯了吧?一个项目跑起来另一个就报错?用Conda环境隔离大法就对了!但默认安装竟吃掉根分区8G的硬盘?今天手把手教你迁移安装目录+实战部署AI项目. 今天测试AIREPORT, ...

  10. 从上下文切换谈thread_local工作原理

    从上下文切换谈thread_local工作原理 thread_local是什么 熟悉多线程编程的小伙伴一定对thread_local不陌生,thread_local 是 C++11 引入的一种存储类说 ...