JavaWeb之DBUtils


 

 

一、什么是DBUtils及作用

  DBUtils是apache公司寫的。DBUtils是java編程中的數據庫操作實用工具,小巧簡單實用。

  DBUtils封裝了對JDBC的操作,簡化了JDBC操作。可以少寫代碼。

  1.對於數據表的讀操作,他可以把結果轉換成List,Array,Set等java集合,便於程序員操作;

  2.對於數據表的寫操作,也變得很簡單(只需寫sql語句)

  3.可以使用數據源,使用JNDI,數據庫連接池等技術來優化性能--重用已經構建好的數據庫連接對象

二、DBUtils的三個核心對象

  2.1、QueryRunner類

    QueryRunner中提供對sql語句操作的API.它主要有三個方法:query() 用於執行select,update() 用於執行insert update delete,batch() 批處理。等下下面的會詳細的介紹這幾種方法的用法。

  2.2、ResultSetHandler接口

    用於定義select操作后,怎樣封裝結果集.它總共有9個常用的實現類,下面我會詳細的為大家介紹怎么去使用。

  2.3、DbUtils類

    它就是一個工具類,定義了關閉資源與事務處理的方法

三、怎么去使用DBUtils框架

  3.1、使用步驟

    導入相對應的jar包

    創建QueryRunner對象

      使用query方法執行select語句

      使用ResultSetHandler封裝結果集

      使用DbUtils類釋放資源

  3.2、實例

    注:本人使用的是C3P0連接池

 1 import java.sql.ResultSet;
 2 import java.sql.SQLException;
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.apache.commons.dbutils.QueryRunner;
 7 import org.apache.commons.dbutils.ResultSetHandler;
 8 import org.apache.commons.dbutils.handlers.BeanListHandler;
 9 import org.junit.Test;
10 
11 import com.jxlg.domain.User;
12 
13 public class TestSelect {
14     
15     @Test
16     public void testSelect(){
17         //創建一個QueryRunner對象
18         QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
19         try {
20             // new ResultSetHandler<List<User>>告訴我們如何封裝結果集
21             List<User> list = qr.query("select * from user", new ResultSetHandler<List<User>>(){
22                 @Override
23                 //query語句執行select語句后,結果一返回值的形式傳遞過來
24                 public List<User> handle(ResultSet rs) throws SQLException {
25                     List<User> list = new ArrayList<User>();
26                     while(rs.next()){
27                         User u = new User();
28                         u.setId(rs.getInt(1));
29                         u.setUsername(rs.getString(2));
30                         u.setPassword(rs.getString(3));
31                         u.setEmail(rs.getString(4));
32                         u.setBirthday(rs.getDate(5));
33                         list.add(u);
34                     }
35                     return list;
36                 }
37                 
38             });
39             for (User user : list) {
40                 System.out.println(user);
41             }
42         } catch (SQLException e) {
43             e.printStackTrace();
44         }
45         
46 }
47     @Test
48     public void testSelect2(){
49         //創建一個QueryRunner對象
50         QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
51         try {
52             //執行sql語句,返回結果
53             List<User> list = qr.query("select * from user where id=? and username=?", new BeanListHandler<User>(User.class),1,"tom");
54             for (User user : list) {
55                 System.out.println(user);
56             }
57         } catch (SQLException e) {
58             e.printStackTrace();
59         }
60         
61         }
62 }

 

 四、DBUtils三個核心對象詳解

  4.1、QueryRunner對象

    4.1.1、構造函數

         new QueryRunner(); 它的事務可以手動控制。
                    也就是說此對象調用的方法(如:query、update、batch)參數中要有Connection對象。
           new QueryRunner(DataSource ds); 它的事務是自動控制的。一個sql一個事務。
                              此對象調用的方法(如:query、update、batrch)參數中無需Connection對象。

    4.1.2、常用方法

        

                 

        

        

        

 

  4.2、ResultSetHandler接口

    4.2.1、它有9個結果處理器

      ArrayHandler:適合取1條記錄。把該條記錄的每列值封裝到一個數組中Object[]
      ArrayListHandler:適合取多條記錄。把每條記錄的每列值封裝到一個數組中Object[],把數組封裝到一個List中
      ColumnListHandler:取某一列的數據。封裝到List中。
      KeyedHandler:取多條記錄,每一條記錄封裝到一個Map中,再把這個Map封裝到另外一個Map中,key為指定的字段值。
      MapHandler:適合取1條記錄。把當前記錄的列名和列值放到一個Map中
      MapListHandler:適合取多條記錄。把每條記錄封裝到一個Map中,再把Map封裝到List中
      ScalarHandler:適合取單行單列數據
      BeanHandler
      BeanListHandler

    4.2.2、實例

       

import static org.junit.Assert.*;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import com.jxlg.domain.User;

public class TestResultSetHandler {

    @Test
    public void test1() {
        //ArrayHandler:適合取1條記錄。把該條記錄的每列值封裝到一個數組中Object[]
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            Object[] o = qr.query("select * from user where id=?", new ArrayHandler(),5);
            for (Object object : o) {
                System.out.println(object);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
    }
    
    @Test
    public void test2() throws SQLException {
        //ArrayListHandler:適合取多條記錄。把每條記錄的每列值封裝到一個數組中Object[],把數組封裝到一個List中
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Object[]> list = qr.query("select * from user", new ArrayListHandler());
        for (Object[] objects : list) {
            for (Object object : objects) {
                System.out.println(object);
            }
            System.out.println("----------------------");
        }
    }
    
    @Test
    public void test3() throws SQLException {
        //ColumnListHandler:取某一列的數據。封裝到List中
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Object> list = qr.query("select username,password from user ", new ColumnListHandler(1));
        for (Object object : list) {
            System.out.println(object);
        }    
    }
    
    @Test
    public void test4() throws SQLException {
        //KeyedHandler:取多條記錄,每一條記錄封裝到一個Map中,
        //再把這個Map封裝到另外一個Map中,key為指定的字段值。
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        //大的Map的key是表中的某列數據,小的Map的key是表的列名,所以大的map的key用的是Object類型,小的是String。
        Map<Object, Map<String, Object>> map = qr.query("select * from user", new KeyedHandler(1));
        for (Map.Entry<Object, Map<String,Object>> m : map.entrySet()) {
            System.out.println(m);//就是id至,因為設置了“1”.
            for (Map.Entry<String, Object> mm : m.getValue().entrySet()) {
                System.out.println(mm);//取出小map中的key和value
            }
            System.out.println("--------------------");
        }
        
    }
    
    @Test
    public void test5() throws SQLException {
        //MapHandler:適合取1條記錄。把當前記錄的列名和列值放到一個Map中
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Map<String, Object> map = qr.query("select * from user", new MapHandler());
        for (Map.Entry<String, Object> m : map.entrySet()) {
            System.out.println(m.getKey()+"\t"+m.getValue());
            //默認取第一行數據,需要去其它行用where加條件
        }
    }
    
    @Test
    public void test6() throws SQLException {
        //MapListHandler:適合取多條記錄。把每條記錄封裝到一個Map中,再把Map封裝到List中
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Map<String, Object>> list = qr.query("select * from user", new MapListHandler());
        
        for (Map<String, Object> map : list) {
            for (Map.Entry<String, Object> m : map.entrySet()) {
                System.out.println(m);    
            }
            System.out.println("-----------");
        }
    }
    
    @Test
    public void test7() throws SQLException {
        //ScalarHandler:適合取單行單列數據
     QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
     Object o = qr.query("select * from user", new ScalarHandler(2));
     System.out.println(o);
    }    
    
    @Test
    public void test8() throws SQLException {
        //BeanHandler:適合取單行單列數據
     QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
     User user = qr.query("select * from user", new BeanHandler<User>(User.class));
     System.out.println(user);
    }    

}

 

 五、使用DBUtils做一個增刪改查的例子

  

import static org.junit.Assert.*;

import java.sql.SQLException;
import java.util.Date;

import javax.crypto.spec.OAEPParameterSpec;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;

public class TestInCURD {

    @Test
    public void testInsert() {
        //創建一個QueryRunner對象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            qr.update("insert into user (username,password,email,birthday)values(?,?,?,?)", "guapi","4646","guapi@163.com",new Date());
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void testUpdate() {
        //創建一個QueryRunner對象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            qr.update("update user set username=?,password=? where id=4 ", "meizimeizi","520520");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    @Test
    public void testDelete() {
        //創建一個QueryRunner對象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            qr.update("delete from user where id=? ",4);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    @Test
    public void testBatch() {
        //創建一個QueryRunner對象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        try {
            Object[][] params = new Object[10][]; //高維代表執行多少次sql語句
            for(int i =0;i<params.length;i++){
                params[i] =new Object[]{"guapi"+i,"4646","guapi@163.com",new Date()}; 
            }
            
            qr.batch("insert into user (username,password,email,birthday)values(?,?,?,?)", params );
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    

}

 

2017-03-06

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM