zoukankan      html  css  js  c++  java
  • 从JDBC到commons-DBUtils

    DBUtils与连接池  

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

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

    1.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;   

    2.对于数据表的写操作,也变得很简单(只需写sql语句)   

    3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象1.DBUtils的三个核心对象   

    > QueryRunner类   

    > ResultSetHandler接口   

    > DBUtils类QueryRunner类   

    QueryRunner中提供对sql语句操作的API  

    它主要有三个方法   

    query() 用于执行select  

    update() 用于执行insert update delete  

    batch() 批处理

    ResultSetHandler接口   

    用于定义select操作后,怎样封装结果集.

    DbUtils类   

    它就是一个工具类,定义了关闭资源与事务处理的方法2.Dbutils快速入门   

    > 1.导入jar包           

    > 2.创建QueryRunner对象   

    > 3.使用query方法执行select语句   

    > 4.使用ResultSetHandler封装结果集   

    > 5.使用DbUtils类释放资源    原始操作方法(使用ResultSetHandler)

     1     @Test
     2 
     3     public void testSelect01() throws Exception{
     4 
     5         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
     6 
     7         List<User> list =qr.query("select * from bookcard;", new ResultSetHandler<List<User>>(){
     8 
     9             //当query方法执行完select语句后,将结果集以参数的形式传递进来
    10 
    11             public List<User> handle(ResultSet rs) throws SQLException {
    12 
    13                 List<User> list = new ArrayList<User>();
    14 
    15                 while(rs.next()){
    16 
    17                     User u = new User();
    18 
    19                     u.setCid(rs.getInt(1));
    20 
    21                     u.setName(rs.getString(2));
    22 
    23                     u.setSex(rs.getString(3));
    24 
    25                     u.setCardDate(rs.getString(4));
    26 
    27                     u.setDeposit(rs.getDouble(5));
    28 
    29                     list.add(u);
    30 
    31                 }
    32 
    33                 return list;
    34 
    35             }});
    36 
    37         
    38 
    39         for(User user :list){
    40 
    41             System.out.println(user.toString());
    42 
    43         }
    44 
    45     }

     简化后的操作方法(BeanListHandler implements ResultSetHandler)

    1     @Test
    2     public void testSelect02() throws SQLException{
    3         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
    4         List<User> list =qr.query("select * from bookcard where cid=?;", new BeanListHandler<User>(User.class),1001);
    5         for(User user : list){
    6             System.out.println(user.toString());
    7         }
    8     }

    3.QueryRunner对象

    commons-dbutils-1.4/apidocs/index.html

    new QueryRunner(); 它的事务可以手动控制。

    也就是说此对象调用的方法(如:query、update、batrch)参数中要有Connection对象

    new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。

      此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。

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

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

    - int     update(String sql, Object... params)   

    - int     update(Connection conn, String sql, Object... params)   

    - int[]     batch(String sql, Object[][] params)   

    - int[]     batch(Connection conn, String sql, Object[][] params)

     1     public class TestCRUD {
     2     @Test
     3         public void testSelect() throws SQLException{
     4             QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
     5             List<User> list =qr.query("select * from bookcard where cid=?;", new BeanListHandler<User>(User.class),1001);
     6             for(User user : list){
     7                 System.out.println(user.toString());
     8             }
     9         }
    10         @Test
    11         public void testInsert() throws SQLException{
    12             QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
    13             qr.update("insert into bookcard(cid,name,sex,cardDate,deposit) values(?,?,?,?,?)",1004,"小小","男","2019-01-01",404);
    14 
    15         }
    16 
    17        @Test
    18         public void testUpdate() throws SQLException{
    19             QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
    20             qr.update("update bookcard set name=?,sex=? where cid=?;","消亡","女",1004);
    21         }
    22      
    23         @Test
    24         public void testDelete() throws SQLException{            
    25             QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
    26             qr.update("delete from bookcard where cid=?",1004);
    27         }
    28 
    29         @Test
    30         public void testBatch() throws SQLException{
    31             //只能执行相同类型的sql语句
    32             QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
    33             Object[][] params = new Object[5][];//高维代表执行多少次sql语句
    34             for(int i=0;i<5;i++){
    35                 params[i]= new Object[]{"小王0"+i,"男","2010-10-10",406}; //给每次执行sql语句中的?赋值
    36             }
    37             qr.batch("insert into bookcard(name,sex,cardDate,deposit) values(?,?,?,?)", params);
    38         }    
    39     }

    4.ResultSetHandler接口

    ResultSetHandler下的所有结果处理器(9个类):  

    ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]   

    ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中   

    ColumnListHandler:取某一列的数据。封装到List中。   

    KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。   

    MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中   

    MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中   

    ScalarHandler:适合取单行单列数据   

    BeanHandler:适合单行数据的查询   

    BeanListHandler:最常用的方式

      1     @Test//ArrayHandler:适合取1条记录。把该记录的每列值封装到一个数组Object[]中
      2 
      3     public void test01() throws SQLException{
      4 
      5         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
      6 
      7         //Object[]  arr=qr.query("select * from bookcard where cid=?;", new ArrayHandler(),1002);
      8 
      9         Object[] arr = qr.query("select * from bookcard;", new ArrayHandler());
     10 
     11         for(Object o : arr){
     12 
     13             System.out.println(o);
     14 
     15         }
     16 
     17     }
     18 
     19     
     20 
     21     @Test//ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组Object[]中,把数组封装到一个List中
     22 
     23     public void test02() throws SQLException{
     24 
     25         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
     26 
     27          List<Object[]>  list =qr.query("select * from bookcard;", new ArrayListHandler());
     28 
     29          for(Object[] obj : list){
     30 
     31              for(Object o : obj){
     32 
     33                  System.out.println(o);
     34 
     35              }
     36 
     37              System.out.println("------------------------------");
     38 
     39          }
     40 
     41     }
     42 
     43     
     44 
     45     @Test//ColumnListHandler:取某一列的数据,封装到List中。
     46 
     47     public void test03() throws SQLException{
     48 
     49         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
     50 
     51         List<Object> list =qr.query("select cid,name from bookcard;", new ColumnListHandler(2));
     52 
     53         for(Object o : list){
     54 
     55             System.out.println(o);
     56 
     57         }
     58 
     59     }
     60 
     61     
     62 
     63     @Test //KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另一个Map中,key为指定的字段值。
     64 
     65     public void test04() throws SQLException{
     66 
     67         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
     68 
     69          Map<Object, Map<String, Object>>  map =qr.query("select * from bookcard;", new KeyedHandler(1));
     70 
     71          for(Map.Entry<Object, Map<String,Object>> m : map.entrySet()){
     72 
     73              for(Map.Entry<String, Object> mm : m.getValue().entrySet()){
     74 
     75                  System.out.println(mm.getKey()+"	"+mm.getValue());
     76 
     77              }
     78 
     79              System.out.println("------------------------");
     80 
     81          }
     82 
     83     }
     84 
     85     
     86 
     87     @Test//MapHandler:适合取一条记录,把当前记录的列名和列值放到一个Map中
     88 
     89     public void test05() throws SQLException{
     90 
     91         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
     92 
     93         Map<String, Object> map =qr.query("select * from bookcard where cid=?", new MapHandler(),1002);
     94 
     95         for(Map.Entry<String, Object> m : map.entrySet()){
     96 
     97             System.out.println(m.getKey()+"	"+m.getValue());
     98 
     99         }
    100 
    101     }
    102 
    103     
    104 
    105     @Test //MapListHandler:适合取多条记录,把每条记录封装到一个Map中,再把Map封装到List中。
    106 
    107     public void test06() throws SQLException{
    108 
    109         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
    110 
    111          List<Map<String, Object>> list =qr.query("select * from bookcard;", new MapListHandler());
    112 
    113          for(Map<String,Object> map : list){
    114 
    115              for(Map.Entry<String, Object> m : map.entrySet()){
    116 
    117                  System.out.println(m.getKey()+"	"+m.getValue());
    118 
    119              }
    120 
    121              System.out.println("--------------------");
    122 
    123          }
    124 
    125     }
    126 
    127     
    128 
    129     @Test //ScalarHandler:适合取单行单列数据
    130 
    131     public void test07() throws SQLException{
    132 
    133         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
    134 
    135         Object object = qr.query("select name from bookcard where cid=?;", new ScalarHandler(1),1002);
    136 
    137         System.out.println(object);
    138 
    139     }
    140 
    141     
    142 
    143     @Test //BeanHandler:适合单行数据的查询
    144 
    145     public void test08() throws SQLException{
    146 
    147         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
    148 
    149         User user =qr.query("select * from bookcard;", new BeanHandler<User>(User.class));
    150 
    151         System.out.println(user);
    152 
    153     }
    154 
    155     
    156 
    157     @Test //BeanListHandler
    158 
    159     public void test09() throws SQLException{
    160 
    161         QueryRunner qr = new QueryRunner(C3P0Util.getDatesource());
    162 
    163         List<User> list =qr.query("select * from bookcard;", new BeanListHandler<User>(User.class));
    164 
    165         for(User user: list){
    166 
    167             System.out.println(user);
    168 
    169         }
    170 
    171     }

    5.ThreadLocal(作用:只有当前线程能够访问到存放的变量,适用与进行事务的处理操作)

    模拟ThreadLocal的设计:调用该类的get方法,永远返回当前线程放入的数据。线程局部变量。

     1     public class ThreadLocal{
     2 
     3         private Map<Runnable,Object> container = new HashMap<Runnable,Object>();
     4 
     5     
     6 
     7         public void set(Object value){
     8 
     9     
    10 
    11             container.put(Thread.currentThread(),value);//用当前线程作为key
    12 
    13             }
    14 
    15  
    16 
    17         public Object get(){
    18 
    19        
    20 
    21             return container.get(Thread.currentThread());
    22 
    23         }
    24 
    25  
    26 
    27         public void remove(){
    28 
    29     
    30 
    31             container.remove(Thread.currentThread());
    32 
    33         }
    34 
    35     }
  • 相关阅读:
    [Java] SSH框架笔记_框架分析+环境搭建+实例源码下载
    [JavaEE] WEB-INF有关的目录路径总结
    网站标题分隔符
    [Windows] 解决kmplayer播放rmvb文件音视不同步
    [MySQL] 数据统计 —— 按周,按月,按日分组统计数据
    [Java] JSTL格式化时间计算时差
    [C.Sharp] TimeSpan的用法,获取测试程序运行时间
    [设计模式] .NET设计模式笔记
    Spring Boot使用redis做数据缓存
    Spring Boot使用redis做数据缓存
  • 原文地址:https://www.cnblogs.com/Tony98/p/10755963.html
Copyright © 2011-2022 走看看