目录

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. FANUC发那科机器人控制箱维修操作流程

    FANUC发那科机器人在工业自动化领域中占有重要地位,其高效.稳定和精确的性能赢得了众多用户的青睐.然而,随着使用时间的增长,可能会出现FANUC机器人控制柜故障,影响到发那科机器人的正常运行.本文将 ...

  2. 机器学习 | 强化学习(1) | 马尔科夫决策过程(MDP)概论

    最近在搞强化学习(Reinforcement Learning),打算把之前写的笔记整理一下 本文基于大卫 希尔维(David Silver)教授的强化学习概论课程,视频中所采用的样例学生马尔科夫链( ...

  3. 【前端解决方案】已有本地项目如何建立github仓库

    步骤 1:在本地初始化 Git(如果还没初始化) 如果你的本地项目还没有 Git 仓库,先进入你的项目目录,并初始化 Git:   cd /你的本地项目路径 git init 这样会在你的项目中创建一 ...

  4. php用token做登录认证

    https://blog.csdn.net/qq_20869933/article/details/133201967 作用: PHP 使用token验证可有效的防止非法来源数据提交访问,增加数据操作 ...

  5. Qt设置QTextEdit的行高

    Qt设置QTextEdit的行高 解决方法: QTextDocument* doc = ui->edtCountryIntroduce->document(); for(QTextBloc ...

  6. SuiGo智能博客系统

    一款由Golang+Vue开发的博客类网站,支持大模型对话编写智能博客,同时适配PC和移动端. 功能点说明 系统主要包括 1.博客功能:博客编写也可对话AI模型协助编写.查询.编辑页面.详情页面.分享 ...

  7. Netty基础—7.Netty实现消息推送服务

    大纲 1.Netty实现HTTP服务器 2.Netty实现WebSocket 3.Netty实现的消息推送系统 (1)基于WebSocket的消息推送系统说明 (2)消息推送系统的PushServer ...

  8. BUUCTF--Dangeous RSA(小e)

    对于e很小,可以直接采取爆破的手段,直接上代码 点击查看代码 #python3 ## -*- coding: utf-8 -*-# import binascii from gmpy2 import ...

  9. BUUCTF---还原大师(MD5)

    1.题目 我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码.但是我们获得它的32位M ...

  10. 导入SpaceClaim的iges模型尺寸被放大1000倍的问题

    问题 ANSYS APDL 和 Workbench 联合仿真时,导入 SpaceClaim 的 .iges 模型尺寸被放大 1000 倍数. 如 APDL 生成的尺寸为 10 mm(注:此处的 mm ...