Mybatis 接口綁定


 

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,更能發揮出接口式編程的強大潛力


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM