1. 程式人生 > >Mybatis Mapper代理的開發方式

Mybatis Mapper代理的開發方式

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代理開發。

    mybatisdao的開發方法,分別是原始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

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

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

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

3、 mapper介面的方法引數型別要和mapper對映檔案的statementparameterType的值一致。

4、 mapper介面的方法返回值型別要和mapper對映檔案的statementresultType的值一致



 4.開發

  【1】Mapping介面

public interface UserMapper{
	//1.根據使用者ID查詢使用者資訊
	public User findUserById(int id) throws Exception;

	//2.新增使用者
	public void insertUser(User user) throws Exception;
	
	//3.根據使用者名稱字查詢使用者資訊
	public List<User> findUserByName(String username) throws Exception;
  }

【2】Mapper對映檔案

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

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

<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">  

   <!--  根據id查詢使用者資訊
      id:唯一標識一個statement  
      #{}:表示一個佔位符,如果#{}中傳入簡單型別的引數,#{}中的名稱隨意  
      parameterType:輸入引數的型別,通過#{}接收parameterType輸入的引數  
      resultType:輸出結果型別,不管返回是多條還是單條,指定單條記錄對映的pojo型別  
    -->  
   <select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.user">  
      SELECT * FROM USER WHERE id= #{id}  
   </select> 


   <!-- 新增使用者  
     parameterType:輸入引數的型別,User物件包括username,birthday,sex,address  
     #{}接收pojo資料,可以使用OGNL解析出pojo的屬性值  
     #{username}表示從parameterType中獲取pojo的屬性值  
     selectKey:用於進行主鍵返回,定義了獲取主鍵值的sql  
     order:設定selectKey中sql執行的順序,相對於insert語句來說  
     keyProperty:將主鍵值設定到哪個屬性  
     resultType:select LAST_INSERT_ID()的結果型別  
   -->  

   <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">  
      <selectKey keyProperty="id" order="AFTER" resultType="int">  
         select LAST_INSERT_ID()  
      </selectKey>  
       
      INSERT INTO USER(username,birthday,sex,address)VALUES(#{username},#{birthday},#{sex},#{address})  
   </insert>  


   <!-- 根據使用者名稱稱查詢使用者資訊,可能返回多條  
    ${}:表示sql的拼接,通過${}接收引數,將引數的內容不加任何修飾拼接在sql中。   
    -->  
   <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">  
      select * from user where usernamelike '%${value}%'  
   </select>
</mapper>

【3】載入對映檔案

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

   

    【4】測試程式碼

     

小結:

代理物件內部呼叫selectOne或selectList

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

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