1. 程式人生 > >JavaWeb 之 16.DBUtils 使用jdbc案例

JavaWeb 之 16.DBUtils 使用jdbc案例

    
## 元資料、DBUtils和編寫案例 ##


**ThreadLocal事務的操作**
    
    1.目的:傳遞conn物件
        * 可以通過引數的方式傳遞
        * 通過ThreadLocal類把conn繫結到ThreadLocal中。
    
**元資料**
    
    1.SUN提供的一些規範,介面。
    2.元資料:可以獲取資料庫的基本的資訊,表,欄位的資訊,引數的資訊。
    3.作用:編寫一些框架。
    4.元資料的分類
        * 資料庫元資料
        * 引數元資料
        * 結果集元資料    
        
**資料庫元資料**


    
    1.DataBaseMetaData  -- 資料庫元資料
    2.誰建立資料庫元資料?
        * 由Connection物件建立的
        DatabaseMetaData metaData = conn.getMetaData();
    
    3.資料庫元資料獲取的內容?
        * 獲取url
        * 獲取username
        * 獲取驅動的名稱
        * 獲取主鍵
    4.方法
        * getURL() 獲取此 DBMS 的 URL。
        * getUserName() 獲取此資料庫的已知的使用者名稱稱
        * getDriverName() 獲取此 JDBC 驅動程式的名稱
        * getPrimaryKeys(null, null, 表名) 獲取對給定表的主鍵列的描述
        
    
**引數元資料(ParameterMetaData)**

    
    1.作用:獲取SQL語句中?的個數和型別(型別獲取的不準確)
    2.PreparedStatement可以獲取引數元資料
        * ParameterMetaData metaData  = stmt.getParameterMetaData();
    3.方法
        * getParameterCount()   -- 獲取引數的個數(獲取?的個數)
        
        
**結果集元資料(ResultSetMetaData)**

    
    1.作用:獲取結果集中的列的資訊
    2.由ResultSet建立
        * ResultSetMetaData metaData = rs.getMetaData();
    3.方法
        * getColumnCount() 返回resultset物件的列數
        * getColumnName(int column) 獲得指定列的名稱
        * getColumnTypeName(int column)獲得指定列的型別 


**抽取通用的方法**
 

**DBUtils工具類(框架)**
    
    1.commons-dbutils 是 Apache 組織提供的一個開源 JDBC工具類庫,它是對JDBC的簡單封裝,學習成本極低,並且使用dbutils能極大簡化jdbc編碼的工作量,同時也不會影響程式的效能。因此dbutils成為很多不喜歡hibernate的公司的首選。
    
    2.匯入jar包。commons-dbutils-1.4.jar
    
    3.核心的類    QueryRunner類 -- 做增刪改查的操作
        * 方法
            * QueryRunner()
            * QueryRunner(DataSource ds) 

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

            *  <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) 
            *  <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) 
            
        * 組合
            * 沒有事務
            * QueryRunner(DataSource ds)     -- 傳入連線池(獲取連線)
            * int update(String sql, Object... params) 
            * <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) 
            注意:DBUtils在建立QueryRunner時傳入dataSource物件每次在執行完之後都會自動關閉Connection連線物件
            
            * 和事務相關的(conn向下傳遞)
            * QueryRunner()
            * int update(Connection conn, String sql, Object... params) 
            * <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) 
            
    4.ResultSetHandler介面,可以使用者自己來實現,重寫方法。9個實現類。
    5.DbUtils類
        * 和事務相關的方法
        *  static void     rollbackAndClose(Connection conn) 
        *  static void     rollback(Connection conn) 
        *  static void     commitAndClose(Connection conn)     


**QueryRunner類**    

    1.update(String sql,Object... obj)
    2.query(String sql ,ResultSetHandler reh,Object... ojb)

**ResultsetHandler的實現類**
    
    1.BeanHandler              -- 把一條記錄封裝到JavaBean物件中
        例:QueryRunner runner = new QueryRunner(MyJdbcUtil2.getDataSource());
            Account ac = runner.query("select * from t_account where id = ?", new BeanHandler<Account>(Account.class), 2);
            System.out.println(ac);
        結果為:Account [id=2, username=美美, money=1000.0]
        
    2.BeanListHandler            -- 把一條記錄封裝到JavaBean物件中,把多個JavaBean放入List集合中。
        最終把這些JavaBean存放到List集合中
        例:List<Account> list = runner.query("select * from t_account", new BeanListHandler<Account>(Account.class));
            for (Account account : list) {
                System.out.println(account);
            }
        結果為:Account [id=1, username=聰聰, money=18000.0]
                Account [id=2, username=美美, money=1000.0]
                Account [id=3, username=小鳳, money=10000.0]
                Account [id=4, username=趙劉, money=10000.0]
                Account [id=5, username=天啟, money=10000.0]
        
    3.ArrayHandler                -- 把一條記錄封裝到陣列中
        例:Object [] obj = runner.query("select * from t_account where id = ?", new ArrayHandler(),2);
            System.out.println(Arrays.toString(obj));
        結果為:[2, 美美, 1000.0]
        
    4.ArrayListHandler          -- 把一條記錄封裝到陣列中,把陣列存放在集合中
        例:List<Object []> list = runner.query("select * from t_account", new ArrayListHandler());
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
        結果為:[1, 聰聰, 18000.0]
                [2, 美美, 1000.0]
                [3, 小鳳, 10000.0]
                [4, 趙劉, 10000.0]
                [5, 天啟, 10000.0]
        
    5.MapHandler                -- 一條記錄封裝到Map集合
        例:Map<String, Object> map = runner.query("select * from t_account where id = ?", new MapHandler(),2);
            System.out.println(map);
        結果為:{id=2, username=美美, money=1000.0}
        
    6.MapListHandler            -- 一條記錄封裝到Map集合,把Map集合存放到集合中
        例:List<Map<String, Object>> list = runner.query("select * from t_account", new MapListHandler());
            System.out.println(list);
        結果為:
            [
                {id=1, username=聰聰, money=18000.0}, 
                {id=2, username=美美, money=1000.0}, 
                {id=3, username=小鳳, money=10000.0}, 
                {id=4, username=趙劉, money=10000.0}, 
                {id=5, username=天啟, money=10000.0}
            ]
    
    7.ScalarHandler            -- 封裝count(*) 單行單列資料
        例:long obj = (Long) runner.query("select count(*) from t_account", new ScalarHandler());
            System.out.println(obj);
        結果為:5

    8.ColumnListHandler        -- 查詢是一列資料,把一列資料封裝到集合中。
        例:List<Object> list = runner.query("select username,money from t_account", new ColumnListHandler("money"));
            for (Object object : list) {
                System.out.println(object);
            }
        結果為:
            18000.0
            1000.0
            10000.0
            10000.0
            10000.0
        
    9.KeyedHandler            -- 把一條記錄封裝到一個map集合,把該map集合又存放在另一個map集合中。
        例:Map<Object, Map<String, Object>> map = runner.query("select * from t_account", new KeyedHandler("username"));
            System.out.println(map);
        結果為:
          { 
              趙劉={id=4, username=趙劉, money=10000.0}, 
              天啟={id=5, username=天啟, money=10000.0}, 
              小鳳={id=3, username=小鳳, money=10000.0}, 
              聰聰={id=1, username=聰聰, money=18000.0}, 
              美美={id=2, username=美美, money=1000.0}
          }
    
    * 重點    BeanHandler     BeanListHandler        ScalarHandler
        
        
**客戶管理案例**
    
    1.目的:總結JDBC,和Servlet JSP結合到一起。
    2.開發中的一些小技巧。
    3.客戶管理平臺功能
        * 新增客戶
        * 查詢所有的客戶的資訊
        * 修改客戶資訊
        * 刪除客戶資訊
        * 按條件查詢
        * 分頁查詢資料
        
    4.準備環境
    5.Servlet + JSP +JavaBean + JDBC 
    6.資料庫
        create database day19 character set 'utf8' collate 'utf8_general_ci';
        use day19;
        create table t_customer(
            id varchar(40) primary key,
            username varchar(20),
            gender varchar(10),
            birthday varchar(20),
            cellphone varchar(20),
            email varchar(40),
            love varchar(100),
            type varchar(40)
        );    
        
    7.匯入jar包。
        * MySLQ驅動包
        * BeanUtils包
        * JSTL標籤庫
        * DBUtils
        * c3p0
        
    8.建立包結構
        * cn.itcast.action
        * cn.itcast.service
        * cn.itcast.dao
        * cn.itcast.vo
        * cn.itcast.utils

    9.把工具類和配置檔案複製過來
        

**新增客戶的功能**
    
    1.form表單 -- 校驗
    2.欄位的名稱和javaBean的屬性和表單中name屬性的值都是相同的。