美文网首页
DBUtils工具的使用

DBUtils工具的使用

作者: DramaScript | 来源:发表于2018-05-30 09:52 被阅读19次

    上一篇学习到如何使用JDBC来操作数据库驱动,从而实现Java操作数据库的操作,并且写了一个工具类,但是这个工具类还是有些缺陷,比如线程安全等问题,所以我们可以使用apache commons组件一个成员:DBUtils,DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。
    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) ,用来完成表数据的增加、删除、更新操作

    • 添加
    public void insert(){
       try {
           //获取一个用来执行SQL语句的对象   QueryRunner
           QueryRunner qr = new QueryRunner();
           
           String sql = "INSERT INTO zhangwu(name,money,parent) VALUES(?,?,?)";
           Object[] params = {"股票收入", 5500, "收入"};
           // JDBCUtils这个工具是上篇所提到的工具类
           Connection conn = JDBCUtils.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 = JDBCUtils.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 = JDBCUtils.getConnection();
           int line = qr.update(conn, sql, params);
           //结果集的处理
           System.out.println("line="+line);
           
       } catch (SQLException e) {
           throw new RuntimeException(e);
       }
    }
    
    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. 提供无参构造
    ArrayHandler与ArrayListHandler查询
    • ArrayHandler:将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
    public class ArrayHandlerDemo {
       
       @Test
       public void method(){
           try {
               //获取QueryRunner对象
               QueryRunner qr = new QueryRunner();
               //执行SQL语句
               String sql = "SELECT * FROM zhangwu";
               Object[] params = {};
               Connection conn = JDBCUtils.getConnection();
               Object[] objArray = qr.query(conn, sql, new ArrayHandler(), params);
               //结果集的处理
               System.out.println( Arrays.toString(objArray) );
               
               conn.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
    }
    
    • ArrayListHandler:将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
    public class ArrayListHandlerDemo {
       @Test
       public void method(){
           try {
               //获取QueryRunner对象
               QueryRunner qr = new QueryRunner();
               //执行SQL语句
               String sql = "SELECT * FROM zhangwu WHERE money>?";
               Object[] params = {2000};
               Connection conn = JDBCUtils.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();
           }
       }
    }
    
    BeanHandler与BeanListHandler查询
    • BeanHandler :将结果集中第一条记录封装到一个指定的javaBean中。记住这个javaBean必须要有空参数构造器
    public class BeanHandlerDemo {
       @Test
       public void method(){
           try{
               //获取QueryRunner 
               QueryRunner qr = new QueryRunner();
               //执行SQL语句
               String sql = "SELECT * FROM zhangwu WHERE id=?";
               Object[] params = {1};
               Connection conn = JDBCUtils.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);
           }
       }
    }
    
    • BeanListHandler :将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中。
    public class BeanListHandlerDemo {
       @Test
       public void method(){
           try{
               //获取QueryRunner 
               QueryRunner qr = new QueryRunner();
               //执行SQL语句
               String sql = "SELECT * FROM zhangwu WHERE money>?";
               Object[] params = {2000};
               Connection conn = JDBCUtils.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);
           }
       }
    }
    
    ColumnListHandler与ScalarHandler查询
    • ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中
    public class ColumnListHandlerDemo {
       @Test
       public void method(){
           try {
               //获取QueryRunner对象
               QueryRunner qr = new QueryRunner();
               //执行SQL语句
               String sql = "SELECT name FROM zhangwu WHERE money>?";
               Object[] params = {2000};
               Connection conn = JDBCUtils.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();
           }
       }
    }
    
    • ScalarHandler:它是用于单数据。例如select count(*) from 表操作。
    public class ScalarHandlerDemo {
       @Test
       public void method(){
           try {
               //获取QueryRunner对象
               QueryRunner qr = new QueryRunner();
               
               //执行SQL语句
               String sql = "SELECT MAX(money) FROM zhangwu";
               Object[] params = {};
               Connection conn = JDBCUtils.getConnection();
               Double max = qr.query(conn, sql, new ScalarHandler<Double>(), params);
               //结果集的处理
               System.out.println("max=" + max);
               
               conn.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
    }
    
    MapHandler与MapListHandler查询
    • MapHandler将结果集第一行数据,封装到Map集合中
    /*
        *  结果集第七种处理方法,MapHandler
        *  将结果集第一行数据,封装到Map集合中
        *  Map<键,值> 键:列名  值:这列的数据
        */
       public static void mapHandler()throws SQLException{
           QueryRunner qr = new QueryRunner();
           String sql = "SELECT  * FROM sort";
           //调用方法query,传递结果集实现类MapHandler
           //返回值: Map集合,Map接口实现类, 泛型
           Map<String,Object> map = qr.query(con, sql, new MapHandler());
           //遍历Map集合
           for(String key : map.keySet()){
               System.out.println(key+".."+map.get(key));
           }
       }
    
    • MapListHandler将结果集每一行存储到Map集合,键:列名,值:数据,Map集合过多,存储到List集合
    /*
        *  结果集第八种处理方法,MapListHandler
        *  将结果集每一行存储到Map集合,键:列名,值:数据
        *  Map集合过多,存储到List集合
        */
       public static void mapListHandler()throws SQLException{
           QueryRunner qr = new QueryRunner();
           String sql = "SELECT  * FROM sort";
           //调用方法query,传递结果集实现类MapListHandler
           //返回值List集合, 存储的是Map集合
           List<Map<String,Object>> list = qr.query(con, sql, new MapListHandler());
           //遍历集合list
           for( Map<String,Object> map : list ){
               for(String key : map.keySet()){
                   System.out.print(key+"..."+map.get(key));
               }
               System.out.println();
           }
           
       }
    

    连接池

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

    导入jar包
    图片.png
    编写工具类

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

    public class JDBCUtils {
       public static final String DRIVER = "com.mysql.jdbc.Driver";
       public static final String URL = "jdbc:mysql://localhost:3306/daydb";
       public static final String USERNAME = "root";
       public static final String PASSWORD = "root";
       /*
        * 创建连接池BasicDataSource
        */
       public static BasicDataSource dataSource = new BasicDataSource();
       //静态代码块
       static {
           //对连接池对象 进行基本的配置
           dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
           dataSource.setUrl(URL); //指定要连接的数据库地址
           dataSource.setUsername(USERNAME); //指定要连接数据的用户名
           dataSource.setPassword(PASSWORD); //指定要连接数据的密码
       }
       /*
        * 返回连接池对象
        */
       public static DataSource getDataSource(){
           return dataSource;
       }
    }
    
    工具类的使用

    以下是一些简单示例代码:

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

    必须项

    • driverClassName 数据库驱动名称
    • url 数据库的地址
    • username 用户名
    • password 密码

    基本项(扩展)

    相关文章

      网友评论

          本文标题:DBUtils工具的使用

          本文链接:https://www.haomeiwen.com/subject/cosojftx.html