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