Mybatis Mapper代理的開發方式

來源:互聯網
上載者:User

標籤:zh-cn   輸入參數   線程   查詢   知識庫   方法參數   void   map對象   data-   

1.Mapper代理的開發方式      

使用Mybatis開發Dao,通常有兩個方法,即原始Dao開發方法和Mapper介面開發方法。mybatis在進行dao開發的時候,涉及到三姐妹,分別是SqlSessionFactoryBuilder、SqlSessionFactroy、SqlSession。

小夥伴們都知道,SqlSession中封裝了對資料庫的操作,如:增刪改查,通過SqlSessionFactory建立SqlSession,而SqlSessionFactory是通過SqlSessionFactoryBuilder進行建立的

 

a、SqlSessionFactoryBuilder

SqlSessionFactoryBuilder用於建立SqlSessionFacoty,SqlSessionFacoty一旦建立完成就不需要SqlSessionFactoryBuilder了,因為SqlSession是通過SqlSessionFactory生產,所以可以將SqlSessionFactoryBuilder當成一個工具類使用,最佳使用範圍是方法範圍即方法體內局部變數。

b、SqlSessionFactory

SqlSessionFactory是一個介面,介面中定義了openSession的不同重載方法,SqlSessionFactory的最佳使用範圍是整個應用運行期間,一旦建立後可以重複使用,通常以單例模式管理SqlSessionFactory。

c、SqlSession

SqlSession是一個面向使用者的介面, sqlSession中定義了資料庫操作,預設使用DefaultSqlSession實作類別。

 

SqlSession中提供了很多操作資料庫的方法:如:selectOne(返回單個對象)、selectList(返回單個或多個對象),SqlSession是線程不安全的,在SqlSesion實作類別中除了有介面中的方法(操作資料庫的方法)還有資料域屬性,SqlSession最佳應用場合在方法體內,定義成局部變數使用,絕對不能將SqlSession執行個體的引用放在一個類的靜態欄位或執行個體欄位中。今天的博文中,小編將著重介紹小夥伴們介紹mybatis中開發dao的兩種方法,原始dao的開發方式和mapper代理開發。

    mybatis 中 dao 的開發方法,分別是原始 dao 的開發和 mapper 代理開發,原始Dao開發和Mapper動態代理開發,這兩種各有優點。原始Dao開發:程式員要寫Dao和Dao實現,需要些較多的代碼,但是比較好理解。Mapper動態代理:程式員只需要寫Mapper介面,然後按照規範進行配置,MyBatis就會自動實作類別似Dao實現,減少模板方法。mybatis官方推薦使用mapper代理方法開發mapper介面,程式員不用編寫mapper介面實作類別,使用mapper代理方法時,輸入參數可以使用pojo封裝對象或map對象,保證dao的通用性。

     這裡主要介紹mapping代理開發模式

 

 2.Mybatis開發過程

 

1、編寫mybatis的設定檔SqlMapConfig.xml

2、編寫mybatis的對應檔mapper.xml

         這裡主要是定義了statement和sql語句

3、編程通過設定檔建立SqlSessionFactory

4、通過SqlSessionFactory擷取SqlSession

5、通過SqlSession操作資料庫

         如果執行添加、更新、刪除需要調用SqlSession.commit()

6、SqlSesion使用完成要關閉

 

 

 

3. Mapper代理的開發規範

 

1、 mapper介面的全限定名要和mapper對應檔的namespace值一致。

UserMapper.xml

 

 

[java] view plain copy 
  1. <?xmlversion="1.0"encoding="UTF-8"?>  
  2. <!DOCTYPEmapper  
  3. PUBLIC"-//mybatis.org//DTDMapper 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <!--namespace命名空間,為了對sql語句進行隔離,方便管理,mapper開發dao方式,使用namespace有特殊作用  
  6. mapper代理開發時將namespace指定為mapper介面的全限定名  
  7.  -->  
  8. <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">  

 

此步驟目的:通過mapper.xml和mapper.Java進行關聯。

 

2、 UserMapper.xml中statement的id就是mapper.java中的方法名

3、 mapper介面的方法參數類型要和mapper對應檔的statement的parameterType的值一致。

4、 mapper介面的方法傳回值類型要和mapper對應檔的statement的resultType的值一致。



 4.開發

  【1】Mapping介面

 

[html] view plain copy 
  1. public interface UserMapper{  
  2.     //1.根據使用者ID查詢使用者資訊  
  3.     public User findUserById(int id) throws Exception;  
  4.   
  5.     //2.添加使用者  
  6.     public void insertUser(User user) throws Exception;  
  7.       
  8.     //3.根據使用者名稱字查詢使用者資訊  
  9.     public List<User> findUserByName(String username) throws Exception;  
  10.   }  

【2】Mapper對應檔

在config下建立mapper目錄然後建立UserMapper.xml

namespace和mapper介面的全限定名一致

 

[java] view plain copy 
  1. <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">    
  2.   
  3.    <!--  根據id查詢使用者資訊  
  4.       id:唯一標識一個statement    
  5.       #{}:表示一個預留位置,如果#{}中傳入簡單類型的參數,#{}中的名稱隨意    
  6.       parameterType:輸入參數的類型,通過#{}接收parameterType輸入的參數    
  7.       resultType:輸出結果類型,不管返回是多條還是單條,指定單條記錄映射的pojo類型    
  8.     -->    
  9.    <select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.user">    
  10.       SELECT * FROM USER WHERE id= #{id}    
  11.    </select>   
  12.   
  13.   
  14.    <!-- 添加使用者    
  15.      parameterType:輸入參數的類型,User對象包括username,birthday,sex,address    
  16.      #{}接收pojo資料,可以使用OGNL解析出pojo的屬性值    
  17.      #{username}表示從parameterType中擷取pojo的屬性值    
  18.      selectKey:用於進行主鍵返回,定義了擷取主索引值的sql    
  19.      order:設定selectKey中sql執行的順序,相對於insert語句來說    
  20.      keyProperty:將主索引值設定到哪個屬性    
  21.      resultType:select LAST_INSERT_ID()的結果類型    
  22.    -->    
  23.   
  24.    <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">    
  25.       <selectKey keyProperty="id" order="AFTER" resultType="int">    
  26.          select LAST_INSERT_ID()    
  27.       </selectKey>    
  28.          
  29.       INSERT INTO USER(username,birthday,sex,address)VALUES(#{username},#{birthday},#{sex},#{address})    
  30.    </insert>    
  31.   
  32.   
  33.    <!-- 根據使用者名稱稱查詢使用者資訊,可能返回多條    
  34.     ${}:表示sql的拼接,通過${}接收參數,將參數的內容不加任何修飾拼接在sql中。     
  35.     -->    
  36.    <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">    
  37.       select * from user where usernamelike ‘%${value}%‘    
  38.    </select>  
  39. </mapper>  

 

【3】載入對應檔

 

  在SqlMapConfing.xml中載入UserMapper.xml,如果將和spring整合後,可以使用整合包中提供的mapper掃描器,此處的mappers不用配置了。代碼如下所示:

   

 

    【4】測試代碼

     

小結:

代理對象內部調用selectOne或selectList

 如果mapper方法返回單個pojo對象(非集合對象),代理對象內部通過selectOne查詢資料庫。

 如果mapper方法返回集合對象,代理對象內部通過selectList查詢資料庫。

Mybatis Mapper代理的開發方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.