zoukankan      html  css  js  c++  java
  • JDBC小工具TxQueryRunner及其单元测试

    1.TxQueryRunner的简介(需要相关jar包的请留言)

    TxQueryRunner类是common-dbutils下QueryRunner的子类,是用来简化JDBC操作的,所以要导入common-dbutils的jar包。

    TxQueryRunner底层是使用了JdbcUtils。可以使用JdbcUtils.getConnection()来获取连接。使用JdbcUtils.releaseConnection()来关闭连接。

    2.TxQueryRunner中的方法

    TxQueryRunner主要涉及3个方法:
    1.update() -->insert、delete、update

    2.query()   -->select

    3.batch()  -->批处理

    TxQueryRunner的【代码清单--0】

      1 package com.lxf.myCommonUtils;
      2 
      3 import java.sql.Connection;
      4 import java.sql.SQLException;
      5 
      6 import org.apache.commons.dbutils.QueryRunner;
      7 import org.apache.commons.dbutils.ResultSetHandler;
      8 
      9 public class TxQueryRunner extends QueryRunner 
     10 {
     11     /**
     12      * 1.批处理
     13      */
     14     @Override
     15     public int[]batch(String sql,Object[][] params)throws SQLException
     16     {
     17         //获取连接
     18         Connection con = JdbcUtils.getConnection();
     19         //操作
     20         int[] result = super.batch(con, sql, params);
     21         //释放连接
     22         JdbcUtils.releaseConnection(con);
     23         return result;
     24     }
     25     
     26     /**
     27      * 2.带有查询条件的query()方法。
     28      *  单行查询
     29      */
     30     @Override
     31     public <T> T query(String sql,ResultSetHandler<T> rsh,Object... params)
     32     throws SQLException
     33     {
     34         //获取连接
     35         Connection con = JdbcUtils.getConnection();
     36         //操作
     37         T  result = super.query(con, sql, rsh, params);
     38         //释放连接
     39         JdbcUtils.releaseConnection(con);
     40         return result;
     41     }
     42     
     43     /**
     44      * 3.多行查询
     45      */
     46     @Override
     47     public <T> T query(String sql,ResultSetHandler<T> rsh)
     48             throws SQLException
     49             {
     50                 //获取连接
     51                 Connection con = JdbcUtils.getConnection();
     52                 //操作
     53                 T  result = super.query(con, sql, rsh);
     54                 //释放连接
     55                 JdbcUtils.releaseConnection(con);
     56                 return result;
     57             }
     58     
     59     /**
     60      * 4.不带参数的update()
     61      */
     62     @Override
     63     public int update(String sql)throws SQLException
     64     {
     65         //获取连接
     66         Connection con = JdbcUtils.getConnection();
     67         //操作
     68         int result = super.update(con, sql);
     69         //释放连接
     70         JdbcUtils.releaseConnection(con);
     71         return result;
     72     }
     73     
     74     /**
     75      * 带有一个参数的uodate()
     76      */
     77     @Override
     78     public int update(String sql,Object param)throws SQLException
     79     {
     80         //获取连接
     81         Connection con = JdbcUtils.getConnection();
     82         //操作
     83         int result = super.update(con, sql, param);
     84         //释放连接
     85         JdbcUtils.releaseConnection(con);
     86         return result;
     87     }
     88     
     89     @Override
     90     public int update(String sql,Object... params)throws SQLException
     91     {
     92         //获取连接
     93         Connection con = JdbcUtils.getConnection();
     94         //操作
     95         int result = super.update(con, sql, params);
     96         //释放连接
     97         JdbcUtils.releaseConnection(con);
     98         return result;
     99     }
    100 
    101 }

    3.TxQueryRunner的单元测试

    3.1--准备工作 

      为了进行TxQueryRunner的单元测试,我们需要在数据库中建立一张表(此处我建立的是person表)。另外还需要创建一个Person实体类。

    注意:表中的字段名必须和Person实体类的属性名保持一致。

     - 数据库表的建立

           

      - Person实体类【代码清单--1】

     1  1 package com.lxf.bean;
     2  2 
     3  3 /**
     4  4  * Person实体类
     5  5  * @author Administrator
     6  6  *
     7  7  */
     8  8 public class Person 
     9  9 {
    10 10     private String pid;
    11 11     private String pname;
    12 12     private int page;
    13 13     private String sex;
    14 14     
    15 15     public String getPid() {
    16 16         return pid;
    17 17     }
    18 18     public void setPid(String pid) {
    19 19         this.pid = pid;
    20 20     }
    21 21     public String getPname() {
    22 22         return pname;
    23 23     }
    24 24     public void setPname(String pname) {
    25 25         this.pname = pname;
    26 26     }
    27 27     public int getPage() {
    28 28         return page;
    29 29     }
    30 30     public void setPage(int page) {
    31 31         this.page = page;
    32 32     }
    33 33     public String getSex() {
    34 34         return sex;
    35 35     }
    36 36     public void setSex(String sex) {
    37 37         this.sex = sex;
    38 38     }
    39 39     @Override
    40 40     public String toString() {
    41 41         return "Person [pid=" + pid + ", pname=" + pname + ", page=" + page
    42 42                 + ", sex=" + sex + "]";
    43 43     }
    44 44     
    45 45 }

    3.2单元测试

    这里主要测试的方法有:

     - 测试update的相关方法

     - 测试查询的相关方法

    具体见【代码清单--2】

      1 package com.lxf.test;
      2 
      3 import java.sql.SQLException;
      4 import java.util.List;
      5 import java.util.Map;
      6 
      7 import org.apache.commons.dbutils.QueryRunner;
      8 import org.apache.commons.dbutils.handlers.BeanHandler;
      9 import org.apache.commons.dbutils.handlers.BeanListHandler;
     10 import org.apache.commons.dbutils.handlers.MapHandler;
     11 import org.apache.commons.dbutils.handlers.MapListHandler;
     12 import org.apache.commons.dbutils.handlers.ScalarHandler;
     13 import org.junit.Test;
     14 
     15 import com.lxf.bean.Person;
     16 import com.lxf.myCommonUtils.JdbcUtils;
     17 
     18 import cn.itcast.jdbc.TxQueryRunner;
     19 
     20 /**
     21  * TxQueryRunner类是common-dbutils下QueryRunner的子类,是用来简化JDBC操作的。
     22  * 所以要导入common-dbutils的jar包
     23  * TxQueryRunner底层是使用了JdbcUtils的。
     24  * 它里面主要涉及3个方法:
     25  *     1.update  -->insert、delete、update
     26  *  2.query   -->select
     27  *  3.批处理
     28  * @author Administrator
     29  *
     30  */
     31 public class TxQueryRunnerTest 
     32 {
     33     /**
     34      * 测试update方法,用来执行insert、delete、update语句。
     35      * @throws SQLException
     36      */
     37     @Test
     38     public void testUpdate() throws SQLException
     39     {
     40         String sql = "insert into person(pid,pname,page,sex)values(?,?,?,?)";
     41         //给sql中对应的参数赋值
     42         Object[] params = {"3","p3","3","男"};
     43         QueryRunner qr = new TxQueryRunner();
     44         qr.update(sql, params);
     45     }
     46 
     47     /**
     48      * 使用事务
     49      * @throws SQLException
     50      */
     51     @Test
     52     public void testUpdate2() throws Exception
     53     {
     54 
     55         try
     56         {
     57             //1.开启事务
     58             JdbcUtils.beginTransaction();
     59             
     60             //2.多次操作
     61             String sql = "insert into person(pid,pname,page,sex)values(?,?,?,?)";
     62             //给sql中对应的参数赋值
     63             Object[] params = {"4","p4","4","women"};
     64             QueryRunner qr = new TxQueryRunner();
     65             //执行
     66             qr.update(sql, params);
     67             
     68             if(false)
     69             {
     70                 throw new Exception();
     71             }
     72             
     73             params = new Object[]{"5","p5","5","women"};
     74             //执行
     75             qr.update(sql,params);
     76             
     77             //3.提交事务
     78             JdbcUtils.commitTransaction();
     79             
     80         }catch(Exception e)
     81         {
     82             try 
     83             {
     84                 //4.回滚事务
     85                 JdbcUtils.rollbackTransaction();
     86             }
     87             catch (SQLException e1) 
     88             {
     89                 e1.printStackTrace();
     90             }
     91             throw e;
     92         }
     93     }
     94     
     95     /**
     96      *测试查询方法
     97      *JDBC查询的结果是ResultSet;
     98      *而QueryRunner查询的结果是通过 ResultSet映射后的数据。
     99      *转换结果:
    100      *    1.javaBean:把结果集封装到javaBean中;
    101      *    2.Map:把结果集封装到Map中。
    102      *    3.把结果集封装到Object中(结果集是单行单列)
    103      * @throws SQLException 
    104      */
    105     
    106     /**
    107      * 单行结果集映射到javaBean中
    108      * @throws SQLException
    109      */
    110     @Test
    111     public void testQuery1() throws SQLException
    112     {
    113         String sql = "select * from person where pid = ?";
    114         QueryRunner qr = new TxQueryRunner();
    115         /*
    116          *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
    117          *BeanHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
    118          */
    119         Person p = qr.query(sql, new BeanHandler<Person>(Person.class),"1");
    120         System.out.println(p);
    121     }
    122     
    123     /**
    124      * 使用BeanListHandler
    125      * 把多行结果集映射到List<Bean>中,即多个javaBean对象
    126      * 一行结果映射到一个javaBean对象中,多行结果映射到List<Bean>中。
    127      * @throws SQLException
    128      */
    129     @Test
    130     public void testQuery2() throws SQLException
    131     {
    132         //相比单行映射名只需要把条件去掉即可
    133         String sql = "select * from person ";
    134         QueryRunner qr = new TxQueryRunner();
    135         /*
    136          *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
    137          *BeanListHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
    138          */
    139         List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class));
    140         System.out.println(list);
    141     }
    142     
    143     /**
    144      * Map
    145      * 使用MapHandler将单行结果集映射到Map中
    146      * @throws SQLException
    147      */
    148     @Test
    149     public void testQuery3() throws SQLException
    150     {
    151         //相比单行映射名只需要把条件去掉即可
    152         String sql = "select * from person where pid = ?";
    153         QueryRunner qr = new TxQueryRunner();
    154         /*
    155          *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
    156          *MapHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
    157          */
    158         Map map = qr.query(sql, new MapHandler(),"1");
    159         System.out.println(map);
    160     }
    161     
    162     /**
    163      * 使用MapListHandler将多行结果集映射到MapList中,
    164      * 即一行结果集映射到Map中,多行结果集映射到MapList中。
    165      * @throws SQLException
    166      */
    167     @Test
    168     public void testQuery4() throws SQLException
    169     {
    170         //相比单行映射名只需要把条件去掉即可
    171         String sql = "select * from person";
    172         QueryRunner qr = new TxQueryRunner();
    173         /*
    174          *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
    175          *MapHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
    176          */
    177         List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler());
    178         System.out.println(mapList);
    179     }
    180     
    181     /**
    182      * 使用ScalarHandler将单行单列的结果集映射到Object中
    183      * @throws SQLException
    184      */
    185     @Test
    186     public void testQuery5() throws SQLException
    187     {
    188         //相比单行映射名只需要把条件去掉即可
    189         String sql = "select count(*) from person";
    190         QueryRunner qr = new TxQueryRunner();
    191         /*
    192          *第二个参数类型为ResultSetHandler,他是一个接口,表示映射的结果类型。
    193          *MapHandler ,它是 ResultSetHandler的实现类,他的作用是把结果集封装到Person对象中。
    194          */
    195         Object obj = qr.query(sql, new ScalarHandler());
    196         Number number = (Number)obj;
    197         long count = number.longValue();
    198         System.out.println(count);
    199     }
    200     
    201     
    202 }

    4.后期补充

     新增【多表映射,代码清单--4】

     1 /**
     2      * 多表映射
     3      * 一行结果集中包含两张表的数据
     4      * 使用MapHnadler来处理数据
     5      * 把数据封装到Map中,
     6      * 使用Map分别生成Person和Address对象
     7      * 将两个对象建立联系
     8      * @throws SQLException
     9      */
    10     @Test
    11     public void testQuery6() throws SQLException
    12     {
    13         //相比单行映射名只需要把条件去掉即可
    14         String sql = "select * from person t , t_address b where t.pid = b.aid and t.pid = ?";
    15         QueryRunner qr = new TxQueryRunner();
    16         Map map = qr.query(sql, new MapHandler(),"1");
    17         //生成Person对象
    18         Person p = CommonUtils.toBean(map, Person.class);
    19         //生成Address对象
    20         Address a = CommonUtils.toBean(map, Address.class);
    21         //建立联系
    22         p.setAddr(a);
    23         System.out.println(p);
    24     }

    此时,需要在bean中新建一个Address实体类,并且在Person类中引用。以此来建立联系。

    【Address实体类】

     1 package com.lxf.bean;
     2 
     3 /**
     4  * 地址类
     5  * @author Administrator
     6  *
     7  */
     8 public class Address
     9 {
    10     //编号,省份,城市,街道
    11     private String aid;
    12     
    13     private String province;
    14     
    15     private String city;
    16     
    17     private String street;
    18 
    19     public String getAid() {
    20         return aid;
    21     }
    22 
    23     public void setAid(String aid) {
    24         this.aid = aid;
    25     }
    26 
    27     public String getProvince() {
    28         return province;
    29     }
    30 
    31     public void setProvince(String province) {
    32         this.province = province;
    33     }
    34 
    35     public String getCity() {
    36         return city;
    37     }
    38 
    39     public void setCity(String city) {
    40         this.city = city;
    41     }
    42 
    43     public String getStreet() {
    44         return street;
    45     }
    46 
    47     public void setStreet(String street) {
    48         this.street = street;
    49     }
    50 
    51     @Override
    52     public String toString() {
    53         return "Address [aid=" + aid + ", province=" + province + ", city="
    54                 + city + ", street=" + street + "]";
    55     }
    56     
    57     
    58 }

    在数据库中建立t_address表。如图:

  • 相关阅读:
    【TopCoder 11469】—Nim(Fwt)
    【BZOJ4228】—Tibbar的后花园(生成函数+NTT)
    【BZOJ4228】—Tibbar的后花园(生成函数+NTT)
    多测师讲解接口测试 _postman(下)_高级讲师肖sir
    多测师讲解接口测试 _fiddler无法打开浏览器_高级讲师肖sir
    多测师讲解接口测试 _postman(上)_高级讲师肖sir
    多测师讲解接口测试 _HTTP常见的状态码归纳_高级讲师肖sir
    多测师讲解接口测试_F12中network里headers各项属性的含义——高级讲师肖sir
    SVN服务的模式和多种访问方式 多种访问原理图解与优缺点
    svn 目录
  • 原文地址:https://www.cnblogs.com/lthIU/p/5914845.html
Copyright © 2011-2022 走看看