標籤: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
- <?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對應檔的statement的parameterType的值一致。
4、 mapper介面的方法傳回值類型要和mapper對應檔的statement的resultType的值一致。
4.開發
【1】Mapping介面
[html] view plain copy
- 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介面的全限定名一致
[java] view plain copy
- <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查詢資料庫。
Mybatis Mapper代理的開發方式