目录

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. RDK新一代模型转换可视化工具!!!

    作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 之前在使用的RDK X3的时候,吴诺老师@wunuo发布了新一代量化转换工具链使用教程,这个工具真的非常的方便, ...

  2. FreeSql学习笔记——2.插入

    前言 由于还没有表结构,就先从新增开始,插入一些数据后才好做查询.修改.删除操作. 初始化 前面注入FreeSql时设置过自动同步表结构,那么就不用管数据库了,只需要在项目中定义实体,就会自动生成表结 ...

  3. Core WebAPI配置Swagger

    1.配置Swagger: Swagger是一套接口文档的规范,通过这套规范,你只需要按照它的规范去定义接口以及接口相关的信息.再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接 ...

  4. 支付宝 v3 自签名如何实现

    今天在看文档的时候,发现支付宝新出了一个 v3 版本的接口调用方式,感觉有点意思,花了点时间研究了下这个版本要怎么实现自签名,大家有兴趣可以看看. 什么是支付宝 API v3 版本? 官网上给的解释是 ...

  5. Blazor开发框架KnownPro-创建新项目

    摘要 本文主要介绍如何使用Known专业版创建新项目. 操作步骤 登录Known专业版VIP会员管理系统. 进入首页,点击[创建项目]按钮. 弹出创建项目对话框,填写项目ID.名称和数据库类型(默认S ...

  6. 4. MySQL 逻辑架构说明

    4. MySQL 逻辑架构说明 @ 目录 4. MySQL 逻辑架构说明 1. 逻辑架构剖析 1.1 服务器处理客户端请求 1.2 Connectors(连接器) 1.3 第1层:连接层 1.4 第2 ...

  7. Qt QFileSystemModel 的使用

    Model 指的是数据 View 指的是界面,View不用设置,只需要和Model进行绑定,绑定完成之后就是Model的格式了 例子:本例子中QListView QTableView QTreeVie ...

  8. Emacs 的优点及与 DE 的比较

    一.引言 在编程领域,对于工具的选择一直是开发者们热议的话题.今天,我们来探讨一下 Emacs 及其所具有的优点,并思考使用 Emacs 写程序是否真的比使用集成开发环境(IDE)更方便. 二.Ema ...

  9. PowerShell实现读取照片并做灰度处理

    Powershell一直是我的学习目标.做一个小例子.PowerShell实现读取照片并做灰度处理.还想要保存这张灰度照片并直接打开查看. 分析需求: [读取照片]  需要借助.net framewo ...

  10. centos 运行springboot 项目

    jar文件发布: 准备工作: 发布在springboot项目中的pom.xml文件添加如下: <build> <plugins> <plugin> <grou ...