Apache DbUtil
Apache DbUtil工具类其实跟我们之前用JDBC写的工具类差不多,不过使用别人写好的自然更加节省时间和精力,其功能也更加强大,我们只要了解一下这个工具类的一些方法使用就可以了,轻松好上手
DBUtil是一个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,让代码更简洁高效。
这里面包含了三个重要的类:
- DBUtils : 打开/关闭连接
- QueryRunner:实现增删改查,QueryRunner类提供了两个构造方法:
- 默认的构造方法
- 需要一个 javax.sql.DataSource 来作参数的构造方法。
下面例子中使用的就是第二种构造方法,参数就是获取了阿里池的DataSource
- ResultSetHandler :处理结果集的接口,其有八种实现类,返回类型不同,所以对应的处理方法也不同,下面的测试类中我就使用的是BeanListHandler,可以看其处理方法,其他的可以看这篇博客的详细举例:https://blog.csdn.net/lidancsdn/article/details/116147080
Druid
Druid(德鲁伊)是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。
首先我们要先下载相应的jar包:
Apache DbUtil:
下载地址:http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi
下载步骤:
下载完成之后,进行解压,然后将jar包在Idea中配置好就可以了,图中的commons-dbutils-1.7.jar就是我们要使用到的jar包了(提示:javaweb项目就要配置到WEB-INF下面的lib包中,jar包不清楚配置的同学可以去查一下相关配置)
Druid
下载地址:在我的上传资源中有,可以下载,或者去网上找就好了
下载完成之后进行解压,和Apache DbUtil 的jar一样的配置完成就可以了
这里是我自己修改使用的Apache DbUtil 供大家学习参考~
package DB;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
import Class.*;
/**
* @author LD
* @date 2021/4/22
*/
public class ApacheDB {
/**
* 借助阿里云连接池,获取数据库连接对象
*
* @return 数据库连接对象
* @throws Exception 异常信息
*/
// 读取配置文件
static InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/db.properties");
static Properties properties = new Properties();
public static Connection getConnection() throws Exception {
properties.load(in);
DataSource dataSource = getDataSource();
return dataSource.getConnection();
}
//获取阿里池
public static DataSource getDataSource() {
// 使用阿里的连接池
DataSource dataSource = null;
try {
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
return dataSource;
}
// 关闭数据库连接
public static void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 查询(返回 Array),返回一行数据
public static Object[] queryArray(QueryRunner runner, String sql, Object... params) {
Object[] result = null;
try {
result = runner.query(sql, new ArrayHandler(), params);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
// 查询(返回 ArrayList)
//类型是Object
public static List<Object[]> queryArrayList(QueryRunner runner, String sql, Object... params) {
List<Object[]> result = null;
try {
result = runner.query(sql, new ArrayListHandler(), params);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//返回值是指定的Bean,这里的User是我自己写的一个实体类
//仅仅一条数据
public static <T> User queryBean(Connection con, QueryRunner runner, String sql, Object... params) {
User user = null;
try {
user = runner.query(con, sql, new BeanHandler<User>(User.class), params);
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
//返回值是指定的Beanlist List<T>
public static <T> List<User> queryBeanList(Connection con, QueryRunner runner, String sql, Object... params) {
List<User> user = null;
try {
user = runner.query(con, sql, new BeanListHandler<User>(User.class), params);
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
// 更新(包括 UPDATE、INSERT、DELETE,返回受影响的行数)
public static int update(QueryRunner runner, Connection conn, String sql, Object... params) {
int result = 0;
if (conn != null) {
try {
result = runner.update(conn, sql, params);
} catch (SQLException e) {
e.printStackTrace();
}
} else {
try {
result = runner.update(sql, params);
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
// 查询指定列名的值(单条数据)
public static Object queryColumn(QueryRunner runner, String column, String sql, Object... params) {
Object result = null;
try {
result = runner.query(sql, new ScalarHandler<Object>(column), params);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
// 查询指定列名的值(多条数据)
public static <T> List<T> queryColumnList(QueryRunner runner, String column, String sql, Object... params) {
List<T> result = null;
try {
result = runner.query(sql, new ColumnListHandler<T>(column), params);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
}
配置文件:db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/javaweb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
username=root
password=1024
initialSize=20
minIdle=5
maxActive=1000
测试类:以下
是对工具类的方法测试,下面的RandomValue是我自己写的随机生成数据信息的一个工具类,可以忽略
重点看一下工具类方法的调用!
package DB;
import com.sun.net.httpserver.HttpServer;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import Class.*;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
/**
* @author LD
* @date 2021/4/22
*/
@WebServlet(urlPatterns = "/test02")
public class Test02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("<html>");
resp.getWriter().println("<head>");
resp.getWriter().println("</title>用户信息</title>");
resp.getWriter().println("</head>");
resp.getWriter().println("<body>");
Connection con = null;
try {
con = ApacheDB.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
//1. 创建 QueryRunner 的实现类
QueryRunner queryRunner = new QueryRunner(ApacheDB.getDataSource());
//处理数据的条数
int count = 0;
String sql = "insert into user(id,username,password,sex,tel,jointime,vip) values(?,?,?,?,?,?,?)";
//需要插入的数据
Date now = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//可以方便地修改日期格式
String time = dateFormat.format(now);
String id = "10002";
User user = new User(id, null, null, null, null, null, null);
int sum = 0;
for (int i = 0; i < 4; i++){
user.setId(String.valueOf(Integer.parseInt(user.getId()) + 1));
user.setUsername(RandomValue.getChineseName());
user.setPassword(RandomValue.getRandomNum(6));
user.setSex(RandomValue.getSex());
user.setTel(RandomValue.getTel());
user.setVip(RandomValue.getVip());
user.setJointime(time);
String[] str = {user.getId(), user.getUsername(), user.getPassword(), user.getSex(), user.getTel(), user.getJointime(), user.getVip()};
//添加数据
count = ApacheDB.update(queryRunner, con, sql, str);
sum+=count;
}
resp.getWriter().println("<p>"+ sum + "条数据添加成功</p>");
//删除数据
sql = "delete from user where id=? or username=?";
//删除userId为1003或者username为雍成的用户信息
String[] str2 = {"10003","雍成"};
count = ApacheDB.update(queryRunner,con,sql,str2);
resp.getWriter().println("<p>"+ count+"条信息删除成功</p>");
//修改数据
sql = "update user set username=? , password=? where id=?";
//修改Id为1002的数据条的username为玲玲,password为401191
String[] str3 = {"玲玲","401191","10002"};
count = ApacheDB.update(queryRunner,con,sql,str3);
resp.getWriter().println("<p>"+count+"条信息修改成功</p>");
//查询数据
sql = "select * from user where id=? or username = ?";
String[] str4 = {"10001","李丹"};
//查询符合条件的多组数据,返回值是BeanList
List<User> userList = ApacheDB.queryBeanList(con,queryRunner,sql,str4);
resp.getWriter().println("<p>查询到的信息为:</p>");
resp.getWriter().println("<table style='border: 1px solid #cad9ea;border-collapse: collapse'>");
//输出信息
for (User u : userList) {
resp.getWriter().println("<tr>");
resp.getWriter().println("<td style='height:50px;border: 1px solid #cad9ea;'>");
resp.getWriter().println(u);
resp.getWriter().println("</td>");
resp.getWriter().println("</tr>");
}
resp.getWriter().println("</table>");
resp.getWriter().println("</body>");
resp.getWriter().println("</html>");
//关闭连接
ApacheDB.closeConnection(con);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
运行结果: