天天看點

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屬性的值都是相同的。