MyBatis的接口綁定:
參考鏈接:http://blog.csdn.net/chris_mao/article/details/48836039
接口映射就是在IBatis中任意定義接口,然后把接口里邊的方法和SQL語句綁定,我們可以直接調用接口方法,比起SqlSession提供的方法我們可以有更加靈活的選擇和設置
iBatis:
iBatis是以SQL為中心的持久化層框架。能支持懶加載、關聯查詢、繼承等特性
iBatis不同於一般的OR映射框架(將數據庫表、字段映射到類、屬性,是一種元數據映射(meta-data))
iBatis是將sql查詢的參數和結果集映射到類
因此可以說,iBatis做的是SQL Mapping的工作。它把SQL語句看成輸入以及輸出,結果集就是輸出,而where后面的條件參數則是輸入
iBatis能將輸入的普通POJO對象、Map、XML等映射到SQL的條件參數上,同時也可以將查詢結果映射到普通POJO對象(集合)、Map、XML等上面
iBatis使用xml文件來映射這些輸入以及輸出。能大大減少數據庫存儲部分的代碼量,而且可以非常方便的利用SQL中的一些小技巧
易百教程:http://www.yiibai.com/ibatis/ibatis_overview.html
在不使用接口映射的情況下,我們經常使用SqlSession實例的selectXXX(selectOne, selectList, selectMap)方法來執行映射文件中相應的SQL語句的,這些方法都有一個String類型的參數,用來指明調用的是哪一個映射文件下的哪一條sql語句,所以通常是包名+類名+id,如:
<select id="selectBlog" parameterType="int" resultType="Blog"> select * from blog where id = #{id} </select>
SqlSession session = MyBatisUtil.getSqlsession();
//加載com.roxy.mybatis.mapper包下的BlogMapper.xml文件中id為selectBlog的sql語句
//傳遞的參數為1
Blog blog = session.selectOne("com.roxy.mybatis.mapper.BlogMapper.selectBlog", 1);
session.close();
而這存在一些潛在的問題:
- 為了確保名稱空間的唯一性,通常會使用相對較長的、且有一定含義的字符串來作為其值,這樣就很難保證我們在代碼不出現拼寫錯誤的情況,即使是直接從映射文件拷貝過來的,也存在不經意間被修改的可能性
- 從selectXXX方法的簽名可以看到,它的第二個參數是Object類型,那么如果我們傳入的參數類型與映射文件中由parameterType屬性指定的類型不一致時,將會出現不可預知的錯誤
- 同樣,selectXXX方法返回值使用了泛型,我們須確保用於接收其返回值的變量類型與映射文件中屬性resultType指定的類型相一致
在引入了接口映射之后:
接口式編程,我們可以簡單的理解為Mybatis為映射文件定義了一個代理接口,以后全部通過這個接口來和映射文件交互,而不再是使用以前方法
映射文件如何知道自己被哪個接口代理呢?
這里就是通過名稱空間來實現的,映射文件的名稱空間再也不是隨心所欲的定義的了,而是要使用代理接口的全限定名作為其名稱空間。所謂全限定名,就是接口所在的包名加上接口名稱
//指明此映射文件的代理接口是com.roxy.mybatis.mapper包下的BlogMapper接口
<mapper namespace="com.roxy.mybatis.mapper.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select *
from blog where id = #{id}
</select>
</mapper>
接口定義好了,那么如何將映射文件中的select / insert / update / delete 等元素與代理接口中的方法綁定呢?
其實很簡單,只需要在代理接口中定義一些方法,並以相應元素的id屬性值做為方法名,parameterType屬性值做為方法參數類型,屬性resultType值做為方法的返回值即可
public interface BlogMapper { //單條語句查詢 Blog selectBlog(Integer id);
}
接口定義好了,是不是還要再定義一個實現類呢?
答案是否定的。Mybatis會使用動態代理機制來幫助我們完成額外的工作,我們需要做的就是把這個接口注冊到Mybatis中。在Mybatis的總配置文件中進行配置
<!-- 定義映射文件 -->
<mappers>
<package name="com.roxy.mybatis.mapper"/>
</mappers>
之后就可以在項目中直接調用代理接口中的方法了
SqlSession session = MyBatisUtil.getSqlsession(); BlogMapper blogMapper = session.getMapper(BlogMapper.class); Blog blog = blogMapper.selectBlog(1); session.close();
接口式編程與之前的調用方式相比較,有以下優點:
- 調用方法明確,因為我們調用的是接口中的某個具體方法,而不再是通過一個字符串來指定執行映射文件中的某個SQL語句了
- 傳入參數和返回值都不再是Object了,這樣就可以在代碼編寫階段確保傳入的參數類型是正確的,也不再需要對返回值進行強類型轉換了
- 最主要的一點,就是將來Mybatis遇到了Spring,更能發揮出接口式編程的強大潛力