DBUtils工具的使用

2018-05-30  本文已影响19人  DramaScript

上一篇学习到如何使用JDBC来操作数据库驱动,从而实现Java操作数据库的操作,并且写了一个工具类,但是这个工具类还是有些缺陷,比如线程安全等问题,所以我们可以使用apache commons组件一个成员:DBUtils,DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。
Dbutils三个核心功能介绍

QueryRunner核心类

主要需要用的方法

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查询
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();
       }
   }
}
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查询
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);
       }
   }
}
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查询
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();
       }
   }
}
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集合中
    *  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集合
    */
   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);
       }
   }
}
一些其他配置

必须项

基本项(扩展)

上一篇下一篇

猜你喜欢

热点阅读