Java——DBUtils的使用(简化了JDBC操作,可以少写代码)

DBUtils

如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,我们采用apache commons组件一个成员:DBUtils

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

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

Dbutils三个核心功能

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

QueryRunner核心类

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

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

一、QueryRunner实现增删改操作

使用格式:

update (Connection con,String sql,Object...param) 

private static void func() throws SQLException {
    //创建QueryRunner对象
    QueryRunner qr = new QueryRunner();
    //书写sql语句
    //String sql = "insert into sort(sname,sprice,sdesc)VALUES(?,?,?)";     // 增
    //String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?";      // 改
    String sql = "DELETE FROM sort WHERE sid=?";     // 删

    //将三个?占位符的实际参数,写在数组中
    Object[] params = {2};
    //调用QueryRunner类的方法update执行SQL语句,返回受影响的函数
    int row = qr.update(conn, sql, params);
    //打印行数
    System.out.println(row);
    /*
     *  判断insert,update,delete执行是否成功
     *  对返回值row判断
     *  if(row>0) 执行成功
     */
    //关闭连接
    DbUtils.closeQuietly(conn);
}
 1 package cn.x5456.demo;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.sql.Connection;
 6 import java.sql.DriverManager;
 7 import java.util.Properties;
 8 
 9 public class JDBCUtils {
10     private JDBCUtils(){}
11     private static Connection conn ;
12     private static String dirverClass;
13     private static String url;
14     private static String username;
15     private static String password;
16 
17     // 静态代码块,调用就执行
18     static{
19         try{
20             func();
21             Class.forName(dirverClass);
22             conn = DriverManager.getConnection(url, username, password);
23         }catch(Exception ex){
24             throw new RuntimeException(ex+"数据库连接失败");
25         }
26     }
27 
28 
29     private static void func() throws IOException {
30         //                                     获取类的加载器      返回指定资源的输入流
31         InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties");
32 
33         Properties prop = new Properties();
34         prop.load(in);
35 
36         dirverClass = prop.getProperty("dirverClass");
37         url = prop.getProperty("url");
38         username = prop.getProperty("username");
39         password = prop.getProperty("password");
40     }
41 
42     /*
43      * 定义静态方法,返回数据库的连接对象
44      */
45     public static Connection getConnection(){
46         return conn;
47     }
48 }
JDBCUtils
1 dirverClass=com.mysql.jdbc.Driver
2 url=jdbc:mysql://127.0.0.1:3306/testdb
3 username=root
4 password=xxx
database.properties

二、QueryRunner实现查询操作 

query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)

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集合

1) ArrayHandler

/*
 *  结果集第一种处理方法, ArrayHandler
 *  将结果集的第一行存储到对象数组中  Object[]
 */
public static void arrayHandler() throws SQLException {
    QueryRunner qr = new QueryRunner();
    String sql = "SELECT * FROM sort";

    Object[] result = qr.query(conn,sql,new ArrayHandler());    // 返回一个Object数组

    for (Object obj : result){
        System.out.print(obj+"\t");
    }
}

结果

1 书 9.9 年终大促

2)ArrayListHandler

/*
 *  结果集第二种处理方法,ArrayListHandler
 *  将结果集的每一行,封装到对象数组中, 出现很多对象数组
 *  对象数组存储到List集合
 */
public static void arrayListHandler() throws SQLException {
    QueryRunner qr = new QueryRunner();
    String sql = "SELECT * FROM sort";

    List<Object[]> result = qr.query(conn,sql,new ArrayListHandler());    // 返回一个Object数组

    for (Object[] objs : result){
        for (Object obj : objs){
            System.out.print(obj+"\t");
        }
        System.out.println();
    }
}

结果

1 书 9.9 年终大促
3 椅子 998.0 只要998
5 体育用品 289.32 购买体育用品 

JavaBean

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

  1. 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
  2. 提供私有字段:private 类型字段名。
  3. 提供getter/setter方法。
  4. 提供无参构造。

全部可以使用IDE自动生成

3)beanHandler

/*
 *  结果集第三种处理方法,BeanHandler
 *  将结果集的第一行数据,封装成JavaBean对象
 *  注意: 被封装成数据到JavaBean对象, Sort类必须有空参数构造
 */
private static void beanHandler() throws SQLException {
    QueryRunner qr = new QueryRunner();
    String sql = "SELECT * FROM sort";

    Sort s = qr.query(conn,sql,new BeanHandler<Sort>(Sort.class));   //传递Sort的class文件的对象,目的是反射创建对象

    System.out.println(s);
}
 1 package cn.x5456.bean;
 2 
 3 public class Sort {
 4     private int sid;
 5     private String sname;
 6     private double sprice;
 7     private String sdesc;
 8 
 9     public Sort(int sid, String sname, double sprice, String sdesc) {
10         this.sid = sid;
11         this.sname = sname;
12         this.sprice = sprice;
13         this.sdesc = sdesc;
14     }
15 
16     public Sort() {
17     }
18 
19     public int getSid() {
20         return sid;
21     }
22 
23     public String getSname() {
24         return sname;
25     }
26 
27     public double getSprice() {
28         return sprice;
29     }
30 
31     public String getSdesc() {
32         return sdesc;
33     }
34 
35     public void setSid(int sid) {
36         this.sid = sid;
37     }
38 
39     public void setSname(String sname) {
40         this.sname = sname;
41     }
42 
43     public void setSprice(double sprice) {
44         this.sprice = sprice;
45     }
46 
47     public void setSdesc(String sdesc) {
48         this.sdesc = sdesc;
49     }
50 
51     @Override
52     public String toString() {
53         return "Sort{" +
54                 "sid=" + sid +
55                 ", sname='" + sname + '\'' +
56                 ", sprice=" + sprice +
57                 ", sdesc='" + sdesc + '\'' +
58                 '}';
59     }
60 }
Sort.java

结果

Sort{sid=1, sname='书', sprice=9.9, sdesc='年终大促'}

4)beanListHandler

/*
 *  结果集第四种处理方法, BeanListHandler
 *  结果集每一行数据,封装JavaBean对象
 *  多个JavaBean对象,存储到List集合
 */
private static void beanListHandler() throws SQLException {
    QueryRunner qr = new QueryRunner();
    String sql = "SELECT * FROM sort";

    List<Sort> list = qr.query(conn,sql,new BeanListHandler<Sort>(Sort.class));   //传递Sort的class文件的对象,目的是反射创建对象

    for (Sort s : list){
        System.out.println(s);
    }
}

结果

Sort{sid=1, sname='书', sprice=9.9, sdesc='年终大促'}
Sort{sid=3, sname='椅子', sprice=998.0, sdesc='只要998'}
Sort{sid=5, sname='体育用品', sprice=289.32, sdesc='购买体育用品'}

5)ColumnListHandler

/*
 *  结果集第五种处理方法,ColumnListHandler
 *  结果集,指定列的数据,存储到List集合
 *  List<Object> 每个列数据类型不同
 */
private static void columnListHandler() throws SQLException {
    QueryRunner qr = new QueryRunner();
    String sql = "SELECT * FROM sort";

    //调用方法 query,传递结果集实现类ColumnListHandler
    //实现类构造方法中,使用字符串的列名
    List<String> list = qr.query(conn,sql,new ColumnListHandler<String>("sname"));

    for(String str : list){
        System.out.println(str);
    }
}

结果


椅子
体育用品

6)ScalarHandler

/*
 *  结果集第六种处理方法,ScalarHandler
 *  对于查询后,只有1个结果
 */
private static void scalarHandler() throws SQLException {
    QueryRunner qr = new QueryRunner();
    String sql = "SELECT count(*) FROM sort";

    //调用方法query,传递结果集处理实现类ScalarHandler
    long count = qr.query(conn,sql,new ScalarHandler<Long>());

    System.out.println(count);
}

7)MapHandler

/*
 *  结果集第七种处理方法,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(conn, sql, new MapHandler());
    //遍历Map集合
    for(String key : map.keySet()){
        System.out.println(key+".."+map.get(key));
    }
}

结果

sid..1
sname..书
sprice..9.9
sdesc..年终大促

8)MapListHandler

/*
 *  结果集第八种处理方法,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(conn, 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();
    }
}

结果

sid...1sname...书sprice...9.9sdesc...年终大促
sid...3sname...椅子sprice...998.0sdesc...只要998
sid...5sname...体育用品sprice...289.32sdesc...购买体育用品

 

posted @ 2018-02-13 17:37  想54256  阅读(347)  评论(0编辑  收藏  举报