利用Apache DbUtil 的工具类+阿里连接池 来替代自己写的JDBC数据库工具类

9 篇文章 0 订阅
3 篇文章 0 订阅

Apache DbUtil

Apache DbUtil工具类其实跟我们之前用JDBC写的工具类差不多,不过使用别人写好的自然更加节省时间和精力,其功能也更加强大,我们只要了解一下这个工具类的一些方法使用就可以了,轻松好上手

DBUtil是一个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,让代码更简洁高效。

这里面包含了三个重要的类:

  • DBUtils : 打开/关闭连接
  • QueryRunner:实现增删改查,QueryRunner类提供了两个构造方法:
  • 默认的构造方法
  • 需要一个 javax.sql.DataSource 来作参数的构造方法。
    下面例子中使用的就是第二种构造方法,参数就是获取了阿里池的DataSource
  1. 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);
    }
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值