MyBatis輸入映射和輸出映射的實現(xiàn)示例
前言
MyBatis的輸入映射和輸出映射是將Java對象和數(shù)據(jù)庫表的列進行映射,實現(xiàn)數(shù)據(jù)的自動轉(zhuǎn)換。
輸入映射(Parameter Mapping):是將Java對象轉(zhuǎn)換為可供SQL語句執(zhí)行的參數(shù)。MyBatis提供了多種方式進行輸入映射,包括基本類型、Map、注解、XML映射文件等。
輸出映射(Result Mapping):是將SQL查詢結(jié)果映射為Java對象。MyBatis提供了多種方式進行輸出映射,包括基本類型、Map、注解、XML映射文件等。其中XML映射文件是最常用的方式,可以根據(jù)列名或列索引將查詢結(jié)果映射為Java對象的屬性。
通過輸入映射和輸出映射,可以方便地完成Java對象與數(shù)據(jù)庫表的轉(zhuǎn)換,提高了開發(fā)效率和代碼的可維護性。
resultMap的使用
使用resultMap的場景如下:
- 數(shù)據(jù)庫表和Java類字段名稱不一致。如果數(shù)據(jù)庫表中的列名稱和Java類中的屬性名稱不一致,可以使用resultMap來映射這兩者之間的關(guān)系,避免手動轉(zhuǎn)換的繁瑣和容易出錯。
- 處理復(fù)雜查詢結(jié)果。如果查詢結(jié)果是多表聯(lián)合查詢,或者需要按照特定的順序和格式顯示結(jié)果,可以使用resultMap來定制化查詢結(jié)果的映射。
- 查詢結(jié)果中包含關(guān)聯(lián)對象。如果查詢結(jié)果中包含了與主對象關(guān)聯(lián)的其他對象,可以使用resultMap來映射出這些關(guān)聯(lián)對象,方便進行對象的嵌套查詢和處理。
- 可以提高程序性能。使用resultMap可以緩存映射規(guī)則,避免每次查詢都需要重新定義映射規(guī)則的操作,從而提高程序的性能。
總之,如果需要處理一些復(fù)雜的查詢結(jié)果或者需要將數(shù)據(jù)庫查詢結(jié)果映射到Java對象中,就可以使用resultMap。
MyBatis框架的工作執(zhí)行流程如下
(1)讀取MyBatis配置文件mybatis-config.xml
(2)加載映射文件Mapper.xml
(3)構(gòu)建會話工廠
(4)創(chuàng)建SqlSession對象
(5)使用Executor接口來操作數(shù)據(jù)庫
(6)使用MappedStatement類型的參數(shù)對映射信息進行封裝。
(7)輸入?yún)?shù)映射
(8)輸出結(jié)果映射
mapper元素子元素及其作用
在映射文件中,<mapper>元素是映射文件的根元素,其他元素都是它的子元素。這些子元素及其作用如下所示:
<select>:用于映射查詢語句,可自定義參數(shù),返回結(jié)果集等。<insert>:用于映射插入語句,執(zhí)行后返回一個整數(shù),代表插入的條數(shù)。<update>:用于映射更新語句,執(zhí)行后返回一個整數(shù),代表更新的條數(shù)。<delete>:用于映射刪除語句,執(zhí)行后返回一個整數(shù),代表刪除的條數(shù)。<sql>:用于定義一部分SQL,然后可被其他語句引用此SQL。<cache>:用于給定命名空間的緩存配置。<cache-ref>:用于其他命名空間緩存配置的引用。<resultMap>:用于描述如何從數(shù)據(jù)庫結(jié)果集中來加載對象。
案例
po 類
public class Dept {
private Integer deptno;
private String dname;
private String loc;
// 自動生成兩個構(gòu)造方法、Getter/Setter/toString
}在同main/java包中,新建mapper包,里面新建同名的一個接口,一個映射文件
映射文件的 namespace 是接口的限定名
只有查詢語句有查詢
在接口文件中:
List<Dept> queryAll();
對應(yīng)的映射文件:
<mapper namespace="com.mybatis.mapper.DeptMapper">
<!-- 如果查詢中的列名和某個po類的屬性名不一致,那么我們就需要配置結(jié)果的映射 -->
<!-- type:po類的名字 -->
<resultMap type="Dept" id="dept">
<!-- id標記配置的是主鍵列的映射關(guān)系 -->
<id column="no" property="deptno" />
<!-- result配置的是非主鍵列和屬性的映射關(guān)系 -->
<result column="name" property="dname"/>
<result column="location" property="loc"/>
</resultMap>
<!-- 如果查詢語句中的列名和某個po類中的屬性名一致,那么需要配置resultType -->
<!-- dept:上面的id值 -->
<select id="queryAll" resultMap="dept">
select deptno as no,dname as name,loc as location
from dept
</select>
</mapper>測試代碼:
@Test
public void queryDept() {
DeptMapper mapper = session.getMapper(DeptMapper.class);
List<Dept> list = mapper.queryAll();
// foreach 生成
for (Dept dept : list) {
System.out.println(dept);
}
}
總結(jié)
如果查詢語句中的列名和某個po類中的屬性名一致,那么需要配置resultType
如果查詢中的列名和某個 po 類的屬性名不一致,那么就需要配置結(jié)果的映射
id 標記配置的是主鍵列的映射關(guān)系
result 配置的是非主鍵列和屬性的映射關(guān)系
到此這篇關(guān)于MyBatis輸入映射和輸出映射的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)MyBatis輸入映射和輸出映射內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android/Java中創(chuàng)建類實例的各種模式實例代碼
這篇文章主要介紹了Android/Java中創(chuàng)建類實例各種模式的相關(guān)資料,包括New關(guān)鍵字、靜態(tài)工廠方法、建造者模式、單例模式、依賴注入、抽象工廠模式、原型模式和Reflection,每個模式有其特點和適用場景,需要的朋友可以參考下2025-09-09
spring-boot 如何實現(xiàn)單次執(zhí)行程序
這篇文章主要介紹了spring-boot 實現(xiàn)單次執(zhí)行程序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
解決JAVA非對稱加密不同系統(tǒng)加密結(jié)果不一致的問題
這篇文章主要介紹了解決JAVA非對稱加密不同系統(tǒng)加密結(jié)果不一致的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10

