MyBatis框架詳解—Dao 代理(上篇)

本篇文章主要內(nèi)容
Dao?接口動態(tài)代理
參數(shù)傳遞
處理查詢結(jié)果
like?和主鍵
Dao?代理實現(xiàn)數(shù)據(jù)庫操作
步驟
(1)?去掉 Dao?接口實現(xiàn)類

(2)?getMapper?獲取代理對象
只需調(diào)用 SqlSession 的getMapper()方法,即可獲取指定接口的實現(xiàn)類對象。該方法的參數(shù)為指定Dao 接口類的 class 值。
SqlSession session = factory.openSession();
StudentDao dao = session.getMapper(StudentDao.class);
?使用工具類:
StudentDao studentDao =?
MyBatisUtil.getSqlSession().getMapper(StudentDao.class);
getMapper()創(chuàng)建的對象,是代替我們自己創(chuàng)建的 StudentDaoImpl 類
(3)?使用 Dao?代理對象方法執(zhí)行 sql?語句
select 方法:

?insert 方法:

深入理解參數(shù)
從java?代碼中把參數(shù)傳遞到mapper.xml?文件。
parameterType
parameterType: 接口中方法參數(shù)的類型, 類型的完全限定名或別名。這個屬性是可選的,因為 MyBatis?可以推斷出具體傳入語句的參數(shù),默認值為未設(shè)置
(unset)。接口中方法的參數(shù)從java 代碼傳入到 mapper 文件的sql 語句。
int 或 java.lang.Integer?
hashmap 或 java.util.
HashMap list 或 java.util.ArrayList
student 或 com.bjpowernode.domain.Student
更多看課件資源中的有關(guān)別名的文件或者 mybatis-3.5.1.pdf 的 15 頁。????
<select>,<insert>,<update>,<delete>都可以使用parameterType 指定類型。
例如:

一個簡單參數(shù)
Dao 接口中方法的參數(shù)只有一個簡單類型(java 基本類型和String),占位符 #{ 任意字符 },和方法的參數(shù)名無關(guān)。
接口方法:

測試方法:

多個參數(shù)-使用@Param
當(dāng)Dao?接口方法多個參數(shù),需要通過名稱使用參數(shù)。 在方法形參前面加入@Param(“自定義參數(shù)名”),mapper?文件使用#{自定義參數(shù)名}。
例如定義
List<Student> selectStudent( @Param(“personName”)?
String name ) { … }
? ? ? ? ? ? ?mapper 文 件 select * from student where name =?
#{ personName}
?接口方法:

mapper 文件:

測試方法:

多個參數(shù)-使用對象
使用java 對象傳遞參數(shù), java 的屬性值就是 sql 需要的參數(shù)值。 每一個屬性就是一個參數(shù)。
語法格式: #{ property,javaType=java 中數(shù)據(jù)類型名,jdbcType=數(shù)據(jù)類型名稱 }
javaType, jdbcType 的類型MyBatis 可以檢測出來,一般不需要設(shè)置。常用格式 #{ property }
mybatis-3.5.1.pdf 第 43 頁 4.1.5.4 小節(jié):

創(chuàng)建保存參數(shù)值的對象 QueryParam

接口方法:
List<Student> selectMultiObject(QueryParam queryParam);
mapper 文件:

測試方法:

多個參數(shù)-按位置
參數(shù)位置從 0 開始, 引用參數(shù)語法 #{ arg 位置 } , 第一個參數(shù)是#{arg0}, 第二個是#{arg1}
注意:mybatis-3.3 版本和之前的版本使用#{0},#{1}方式, 從mybatis3.4 開始使用#{arg0}方式。
接口方法:
List<Student> selectByNameAndAge(String name,int age);
mapper 文件

測試方法:

多個參數(shù)-使用 Map
Map 集合可以存儲多個值,使用 Map 向mapper 文件一次傳入多個參數(shù)。Map 集合使用String 的key,
Object 類型的值存儲參數(shù)。 mapper 文件使用 # { key } 引用參數(shù)值。
例如:Map<String,Object> data = new HashMap<String,Object>();?
? ? ? ? ? data.put(“myname”,”李力”);
? ? ? ? ? data.put(“myage”,20);
接口方法:
List<Student> selectMultiMap(Map<String,Object> map);
mapper 文件:

測試方法:

#和$
#:占位符,告訴mybatis 使用實際的參數(shù)值代替。
并使用PrepareStatement 對象執(zhí)行sql 語句, #{…}代替 sql 語句的“?”。
這樣做更安全,更迅速,通常也是首選做法,
?mapper 文件

轉(zhuǎn)為 MyBatis 的執(zhí)行是:
String sql=” select id,name,email,age from student where id=?”; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1,1005);
解釋:
where id=? 就 是 where id=#{studentId} ps.setInt(1,1005) , 1005 會替換掉 #{studentId}
$ 字符串替換,告訴mybatis 使用$包?含的“字符串”替換所在位置。使用Statement 把sql 語句和${}的內(nèi)容連接起來。主要用在替換表名,列名,不同列排序等操作。
例 1:?
分別使用 id , email 列查詢 Student?
接口方法:
Student findById(int id);
Student findByEmail(String email);
?mapper 文件:

測試方法:

例 2:通用方法,使用不同列作為查詢條件
接口方法:
Student findByDiffField(@Param("col") String colunName,@Param("cval")?
Object value);
mapper 文件:

測試方法:

最后奉上視頻教程??,視頻觀看效果更佳?。∽哌^路過別忘素質(zhì)三連哦~~

