zoukankan      html  css  js  c++  java
  • Java基础学习笔记二十七 DBUtils和连接池

    DBUtils

    如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils。DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。

    DBUtils是java编程中的数据库操作实用工具,小巧简单实用。

    DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

    Dbutils三个核心功能介绍

    • QueryRunner中提供对sql语句操作的API
    • ResultSetHandler接口,用于定义select操作后,怎样封装结果集
    • DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

    QueryRunner核心类

    update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
    query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作

    QueryRunner实现添加、更新、删除操作

    update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作

    增删改代码演示:

    package jdbc;
    
    import org.apache.commons.dbutils.QueryRunner;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    /**
     * Created by Administrator on 2017/7/20.
     */
    public class Demo01 {
        //添加
        public void insert() {
            try {
                //获取一个用来执行SQL语句的对象 QueryRunner
                QueryRunner qr = new QueryRunner();
    
                String sql = "INSERT INTO zhangwu(name,money,parent) VALUES(?,?,?)";
                Object[] params = {"股票收入", 5500, "收入"};
                Connection conn = JDBCUtils0.getConnection();
                int line = qr.update(conn, sql, params);// 用来完成表数据的增加、删除、更新操作
                //结果集处理
                System.out.println("line = " + line);
    
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        
        //更新
        public void update() {
            try {
                //创建一个QueryRunner对象,用来完成SQL语句的执行
                QueryRunner qr = new QueryRunner();
                //执行SQL语句
                String sql = "UPDATE zhangwu SET money = money+1000 WHERE name=?";
                Object[] params = {"股票收入"};
                Connection conn = JDBCUtils0.getConnection();
                int line = qr.update(conn, sql, params);
                //结果集的处理
                System.out.println("line=" + line);
    
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        
        //删除
        public void delete() {
            try {
                //创建一个QueryRunner对象,用来完成SQL语句的执行
                QueryRunner qr = new QueryRunner();
                //执行SQL语句
                String sql = "DELETE FROM zhangwu WHERE name = ?";
                Object[] params = {"股票收入"};
                Connection conn = JDBCUtils0.getConnection();
                int line = qr.update(conn, sql, params);
                //结果集的处理
                System.out.println("line=" + line);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    JDBCUtils0类:
    package jdbc;
    /*
     *  实现JDBC的工具类
     *  定义方法,直接返回数据库的连接对象
     *
     *  写关闭方法
     */
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JDBCUtils0 {
        private JDBCUtils0(){}
        private static Connection con ;
    
        static{
            try{
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql://localhost:3306/mybase";
                String username="root";
                String password="123456";
                con = DriverManager.getConnection(url, username, password);
            }catch(Exception ex){
                throw new RuntimeException(ex+"数据库连接失败");
            }
        }
    
        /*
         * 定义静态方法,返回数据库的连接对象
         */
        public static Connection getConnection(){
            return con;
        }
    
    
        public static void close(Connection con,Statement stat){
    
            if(stat!=null){
                try{
                    stat.close();
                }catch(SQLException ex){}
            }
    
            if(con!=null){
                try{
                    con.close();
                }catch(SQLException ex){}
            }
    
        }
    
    
        public static void close(Connection con,Statement stat , ResultSet rs){
            if(rs!=null){
                try{
                    rs.close();
                }catch(SQLException ex){}
            }
    
            if(stat!=null){
                try{
                    stat.close();
                }catch(SQLException ex){}
            }
    
            if(con!=null){
                try{
                    con.close();
                }catch(SQLException ex){}
            }
    
        }
    }

    QueryRunner实现查询操作

    query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作

    ResultSetHandler结果集处理类

    ArrayHandler

    将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值

    ArrayListHandler

    将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

    BeanHandler

    将结果集中第一条记录封装到一个指定的javaBean中。

    BeanListHandler

    将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

    ColumnListHandler

    将结果集中指定的列的字段值,封装到一个List集合中

    ScalarHandler

    它是用于单数据。例如select count(*) from 表操作。

    MapHandler

    将结果集第一行封装到Map集合中,Key 列名, Value 该列数据

    MapListHandler

    将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

    JavaBean

    JavaBean就是一个类,在开发中常用封装数据。具有如下特性

    • 1.需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
    • 2.提供私有字段:private 类型 字段名;
    • 3.提供getter/setter方法:
    • 4.提供无参构造
    package jdbc;
    
    /*
    * 账务类
    */
    public class ZhangWu {
        private int id;
        private String name;
        private double money;
        private String parent;
    
        public ZhangWu() {
            super();
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public double getMoney() {
            return money;
        }
        public void setMoney(double money) {
            this.money = money;
        }
        public String getParent() {
            return parent;
        }
        public void setParent(String parent) {
            this.parent = parent;
        }
    
        @Override
        public String toString() { //该方法可以省略
            return "ZhangWu [id=" + id + ", name=" + name + ", money=" + money + ", parent=" + parent + "]";
        }
    }

    ArrayHandler与ArrayListHandler查询

    ArrayHandler:将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值

    package jdbc;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.ArrayHandler;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Arrays;
    
    public class ArrayHandlerDemo {
        public void method(){
            try {
                //获取QueryRunner对象
                QueryRunner qr = new QueryRunner();
                //执行SQL语句
                String sql = "SELECT * FROM zhangwu";
                Object[] params = {};
                Connection conn = JDBCUtils0.getConnection();
                Object[] objArray = qr.query(conn, sql, new ArrayHandler(), params);
                //结果集的处理
                System.out.println( Arrays.toString(objArray) );
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //[1, 吃饭支出, 247.0]

    ArrayListHandler:将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

    package jdbc;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.ArrayListHandler;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Arrays;
    import java.util.List;
    
    public class ArrayListHandlerDemo {
        public void method() {
            try {
                //获取QueryRunner对象
                QueryRunner qr = new QueryRunner();
                //执行SQL语句
                String sql = "SELECT * FROM zhangwu WHERE zmoney>?";
                Object[] params = {2000};
                Connection conn = JDBCUtils0.getConnection();
                List<Object[]> list = qr.query(conn, sql, new ArrayListHandler(), params);
                //结果集的处理
                for (Object[] objArray : list) {
                    System.out.println(Arrays.toString(objArray));
                }
    
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //[2, 工资收入, 12345.0]
    //[5, 股票收入, 8000.0]
    //[6, 打麻将支出, 8000.0]
    //[7, null, 5000.0]

    BeanHandler与BeanListHandler查询

    BeanHandler :将结果集中第一条记录封装到一个指定的javaBean中。

    package jdbc;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    public class BeanHandlerDemo {
        public void method() {
            try {
                //获取QueryRunner
                QueryRunner qr = new QueryRunner();
                //执行SQL语句
                String sql = "SELECT * FROM zhangwu WHERE id=?";
                Object[] params = {1};
                Connection conn = JDBCUtils0.getConnection();
                ZhangWu zw = qr.query(conn, sql, new BeanHandler<ZhangWu>(ZhangWu.class), params);
                //结果集处理
                System.out.println(zw);
    
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    //ZhangWu [id=1, name=null, money=0.0, parent=null]

    BeanListHandler :将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

    package jdbc;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;
    
    public class BeanListHandlerDemo {
        public void method() {
            try {
                //获取QueryRunner
                QueryRunner qr = new QueryRunner();
                //执行SQL语句
                String sql = "SELECT * FROM zhangwu WHERE zmoney>?";
                Object[] params = {2000};
                Connection conn = JDBCUtils0.getConnection();
                List<ZhangWu> list = qr.query(conn, sql, new BeanListHandler<ZhangWu>(ZhangWu.class), params);
                //结果集处理
                for (ZhangWu zw : list) {
                    System.out.println(zw);
                }
    
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    //ZhangWu [id=2, name=null, money=0.0, parent=null]
    //ZhangWu [id=5, name=null, money=0.0, parent=null]
    //ZhangWu [id=6, name=null, money=0.0, parent=null]
    //ZhangWu [id=7, name=null, money=0.0, parent=null]

    ColumnListHandler与ScalarHandler查询

    ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中

    package jdbc;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.ColumnListHandler;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;
    
    public class ColumnListHandlerDemo {
        public void method(){
            try {
                //获取QueryRunner对象
                QueryRunner qr = new QueryRunner();
                //执行SQL语句
                String sql = "SELECT zname FROM zhangwu WHERE zmoney>?";
                Object[] params = {2000};
                Connection conn = JDBCUtils0.getConnection();
                List<String> list = qr.query(conn, sql, new ColumnListHandler<String>(), params);
                //结果集的处理
                for (String str : list) {
                    System.out.println(str);
                }
    
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    //工资收入
    //股票收入
    //打麻将支出
    //null

    ScalarHandler:它是用于单数据。例如select count(*) from 表操作。

    package jdbc;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    public class ScalarHandlerDemo {
        public void method(){
            try {
                //获取QueryRunner对象
                QueryRunner qr = new QueryRunner();
    
                //执行SQL语句
                String sql = "SELECT MAX(zmoney) FROM zhangwu";
                Object[] params = {};
                Connection conn = JDBCUtils0.getConnection();
                Double max = qr.query(conn, sql, new ScalarHandler<Double>(), params);
                //结果集的处理
                System.out.println("max=" + max);
    
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    //max=12345.0

    连接池

    实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池。

    用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

    Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
    常见的连接池:DBCP、C3P0。
    接下来,我们就详细的学习一下DBCP连接池。

    DBCP连接池

    DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池。

    • 导入jar包  commons-dbcp-1.4.jar 
    • 编写工具类

    连接数据库表的工具类, 采用DBCP连接池的方式来完成,Java中提供了一个连接池的规则接口 :
    DataSource :它是java中提供的连接池,作为 DriverManager 工具的替代项。在DBCP包中提供了DataSource接口的实现类,我们要用的具体的连接池 BasicDataSource类

    package jdbc;
    /*
     *  使用DBCP实现数据库的连接池
     *  连接池配置,自定义类,
     *  最基本四项完整
     *  对于数据库连接池其他配置,自定义
     */
    
    import org.apache.commons.dbcp.BasicDataSource;
    import javax.sql.DataSource;
    
    public class JDBCUtils {
        //创建出BasicDataSource类对象
        private static BasicDataSource datasource = new BasicDataSource();
    
        //静态代码块,对象BasicDataSource对象中的配置,自定义
        static {
            //数据库连接信息,必须的
            datasource.setDriverClassName("com.mysql.jdbc.Driver");
            datasource.setUrl("jdbc:mysql://localhost:3306/mybase");
            datasource.setUsername("root");
            datasource.setPassword("123");
            //对象连接池中的连接数量配置,可选的
            datasource.setInitialSize(10);//初始化的连接数
            datasource.setMaxActive(8);//最大连接数量
            datasource.setMaxIdle(5);//最大空闲数
            datasource.setMinIdle(1);//最小空闲
        }
    //定义静态方法,返回BasicDataSource类的对象 public static DataSource getDataSource() { return datasource; } }

    工具类的使用

    测试类

    package jdbc;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    
    import java.sql.SQLException;
    
    /*
    * 演示使用DBUtils工具 完成数据库表的增加操作
    */
    public class Demo02 {
        // 插入功能
        public void insert() {
            try {
                //获取一个用来执行SQL语句的对象 QueryRunner
                QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
                String sql = "INSERT INTO zhangwu(zname,zmoney) VALUES(?,?)";
                Object[] params = {"股票收入", 5500};
                int line = qr.update(sql, params);
                //结果集处理
                System.out.println("line = " + line);
    
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        //删除功能
        public void delete() {
            try {
                //创建一个QueryRunner对象,用来完成SQL语句的执行
                QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
                //执行SQL语句
                String sql = "DELETE FROM zhangwu WHERE zname = ?";
                Object[] params = {"股票收入"};
                int line = qr.update(sql, params);
                //结果集的处理
                System.out.println("line=" + line);
    
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        //更新功能
        public void update() {
            try {
                //创建一个QueryRunner对象,用来完成SQL语句的执行
                QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
                //执行SQL语句
                String sql = "UPDATE zhangwu SET zmoney = zmoney+1000 WHERE zname=?";
                Object[] params = {"股票收入"};
                int line = qr.update(sql, params);
                //结果集的处理
                System.out.println("line=" + line);
    
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        //查询功能,将结果集中第一条记录封装到一个指定的javaBean中。
        public void search() {
            try {
                //获取QueryRunner
                QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
                //执行SQL语句
                String sql = "SELECT * FROM zhangwu";
                Object[] params = {};
                ZhangWu p = qr.query(sql, new BeanHandler<ZhangWu>(ZhangWu.class), params);
                //结果集处理
                System.out.println(p);
    
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    //line = 1
    //line=1
    //line=1
    //ZhangWu [id=1, name=null, money=0.0, parent=null]

    常见配置项

    分类

    属性

    描述

    必须项

    driverClassName

    数据库驱动名称

    url

    数据库的地址

    username

    用户名

    password

    密码

    基本项(扩展)

    maxActive

    最大连接数量

    minIdle

    最小空闲连接

    maxIdle

    最大空闲连接

    initialSize

    初始化连接

    参考文档:http://commons.apache.org/proper/commons-dbcp/configuration.html

  • 相关阅读:
    CODING x 百果园 _ 水果零售龙头迈出 DevOps 体系建设第一步
    Nocalhost 亮相 CD Foundation 国内首届 Meetup,Keith Chan 将出席致辞
    做云原生时代标准化工具,实现高效云上研发工作流
    打造数字化软件工厂 —— 一站式 DevOps 平台全景解读
    WePack —— 助力企业渐进式 DevOps 转型
    CODING Compass —— 打造行云流水般的软件工厂
    Nocalhost —— 让云原生开发回归原始而又简单
    CODING 代码资产安全系列之 —— 构建全链路安全能力,守护代码资产安全
    Nocalhost:云原生开发新体验
    使用 Nocalhost 开发 Kubernetes 中的 APISIX Ingress Controller
  • 原文地址:https://www.cnblogs.com/ginb/p/7211455.html
Copyright © 2011-2022 走看看