Mybatis?resultMap標簽繼承、復用、嵌套方式

 更新時間:2022年03月10日 14:50:09   作者:王二小丷  
這篇文章主要介紹了Mybatis?resultMap標簽繼承、復用、嵌套方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

resultMap標簽繼承、復用、嵌套

記錄演示 Mybatis 中 resultMap 標簽繼承、復用(包括跨文件)以及多層嵌套的使用方法,

  • 繼承: 繼承已存在的 resultMap 標簽進行擴展
  • 復用: 跨mapper文件引用現存的 resultMap 標簽
  • 嵌套: 多層嵌套的JavaBean與 resultMap 映射方法

定義表與實體類

創建三個表 group member score

score 與 member 一對一,通過 score.id 關聯

group 與 member 一對多,通過 group.id 關聯

create table `score` (
? ? `id` int comment '主鍵',
? ? `math` float comment '數學成績',
? ? `history` float comment '歷史成績',
? ? primary key (`id`)
)
create table `member` (
? ? `id` int comment '主鍵',
? ? `name` varchar comment '姓名',
? ? `group_id` int comment '所屬組group表id',
? ? `score_id` int comment '成績Score表id',
? ? primary key (`id`)
)
create table `group` (
? ? `id` int comment '主鍵',
? ? `name` varchar comment '組名',
? ? primary key (`id`)
)

實體類

創建三個實體類 Group Member Score

Score 類的對象是 Member 類的成員變量

Member 類的對象集合是 Group 類的成員變量

/** 成績類 */
public class Score {
? ? private Integer id;
? ? /** 數學成績 */
? ? private Float math;
? ? /** 歷史成績 */
? ? private Float hitory;
? ? ...getter And setter...
}
/** 成員類 */
public class Member {
? ? private Integer id;
? ? /** 姓名 */
? ? private String name;
? ? /** 分數對象 */
? ? private Score score;
? ? ...getter And setter...
}
/** 組類 */
public class Group {
? ? private Integer id;
? ? /** 組名 */
? ? private String groupName;
? ? /** 成員 */
? ? private List<Member> members;
? ? ...getter And setter...
}

定義與表映射的 resultMap

在 BeanMapper.xml 定義最基本的與數據庫表字段映射的 resultMap 標簽

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.BeanMapper">
? ? <!-- Score實體類映射 -->
? ? <resultMap id="scoreMap" type="com.example.Score">
? ? ? ? <id column="id" jdbcType="INTEGER" property="id" />
? ? ? ? <result column="math" jdbcType="FLOAT" property="math" />
? ? ? ? <result column="history" jdbcType="FLOAT" property="history" />
? ? </resultMap>
? ? <!-- Member實體類映射 -->
? ? <resultMap id="memberMap" type="com.example.Member">
? ? ? ? <id column="id" jdbcType="INTEGER" property="id" />
? ? ? ? <result column="name" jdbcType="VARCHAR" property="name" />
? ? </resultMap>
? ? <!-- Group實體類映射 -->
? ? <resultMap id="groupMap" type="com.example.Group">
? ? ? ? <id column="id" jdbcType="INTEGER" property="id" />
? ? ? ? <result column="name" jdbcType="VARCHAR" property="groupName" />
? ? </resultMap>
</mapper>

繼承、復用、嵌套

創建 DemoMapper.xml,演示標簽的繼承、復用、嵌套

復用現存標簽時若位于相同mapper文件可直接使用 resultMap 的 id 屬性引用,跨文件時需要指定 namespace 屬性才可正常引用

  • extends: 繼承,可繼承其他 resultMap 并加以擴展
  • association: 復用現存的 resultMap,適用于對應的屬性為單JavaBean時,使用 javaType 指定Java類型
  • collection: 復用現存的 resultMap,適用于對應的屬性為JavaBean集合時,使用 ofType 指定Java類型
  • columnPrefix: 只將該屬性指定前綴的屬性賦值給當前 resultMap,存在多層嵌套時每進入一層就會將本層前綴截取掉。

如下面的mapper文件中,外層的 fullMemberMap 前綴為 member_,經本次篩選 member_score_id -> score_id,

內層的 scoreMap 前綴為 score_,經本次篩選 score_id -> id,最終被賦值給 Score.id

所以只有形如 member_score_id 的字段才會最終進入 scoreMap 的取值范圍中

若是不復用只是單純嵌套,則可以直接將三個類寫在一個 resultMap 標簽內實現

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.DemoMapper">
? ? <!-- extends: 繼承 -->
? ? <resultMap id="fullMemberMap" extends="com.example.BeanMapper.memberMap" type="com.example.Member">
? ? ? ? <!-- association: 復用已存在的resultMap,單JavaBean屬性時使用
? ? ? ? ? ? ? ? ? ? ? ? 使用javaType屬性指定JavaBean的類型
? ? ? ? ? ? ? ? ? ? ? ? 跨文件引用需指定namespace -->
? ? ? ? <!-- columnPrefix: 只從 score_ 開頭的字段為當前resultMap取值 -->
? ? ? ? <association ?property="score" resultMap="com.example.BeanMapper.scoreMap" javaType="com.example.Score" columnPrefix="score_" />
? ? </resultMap>
? ??
? ? <resultMap id="fullGroupMap" extends="com.example.BeanMapper.groupMap" type="com.example.Group">
? ? ? ? <!-- collection: 復用已存在的resultMap,JavaBean集合屬性時使用
? ? ? ? ? ? ? ? ? ? ? ? 使用ofType屬性指定JavaBean的類型
? ? ? ? ? ? ? ? ? ? ? ? 同文件引用無需指定namespace -->
? ? ? ? <!-- columnPrefix: 只從 member_ 開頭的字段為當前resultMap取值
? ? ? ? ? ? ? ? ? ? ? ? 進入fullMemberMap內嵌套的scoreMap時前綴 member_ 會被去除,即 member_score_id 字段才能被scoreMap正確接收 -->
? ? ? ? <collection property="members" ofType="com.example.Member" resultMap="fullMemberMap" columnPrefix="member_"/>
? ? </resultMap>
? ? <!-- 直接引用最終的resultMap,并根據columnPrefix屬性設置的前綴為各個字段指定不同的別名 -->
? ? <select id="selectGroupById" parameterType="java.lang.Integer" resultMap="fullGroupMap">
? ? ? ? select g.id, g.name,
? ? ? ? ? ? ? ?m.id member_id, m.name member_name,
? ? ? ? ? ? ? ?s.id member_score_id, s.math member_score_math, s.history member_score_history
? ? ? ? ? from `group` g
? ? ? ? ? ? left join `member` m on m.group_id = g.id
? ? ? ? ? ? left join `score` s on s.id = m.score_id
? ? ? ? ? where g.id = #{id,jdbcType=INTEGER}
? ? </select>
</mapper>

使用resultMap需要注意的地方

今天主要還是根據需求在進行sql的編寫 ,在mybatis里面進行復查和復用的時候一定要去看所對應的有沒有這個類 ,今天弄了幾個dto,還有時間戳的轉換,java里面的時間戳是以毫秒來進行計算的。

所以說在專用mysql的時候要注意

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MyBatis Generator 自定義生成注釋的方法

    MyBatis Generator 自定義生成注釋的方法

    這篇文章主要介紹了MyBatis Generator 自定義生成注釋的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • java反射遍歷實體類屬性和類型,并賦值和獲取值的簡單方法

    java反射遍歷實體類屬性和類型,并賦值和獲取值的簡單方法

    下面小編就為大家帶來一篇java反射遍歷實體類屬性和類型,并賦值和獲取值的簡單方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 關于ObjectUtils.isEmpty()?和?null?的區別

    關于ObjectUtils.isEmpty()?和?null?的區別

    這篇文章主要介紹了關于ObjectUtils.isEmpty()?和?null?的區別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Springboot使用influxDB時序數據庫的實現

    Springboot使用influxDB時序數據庫的實現

    項目中需要存放大量設備日志,且需要對其進行簡單的數據分析,信息提取工作,所以本文就介紹一下Springboot使用influxDB時序數據庫,感興趣的可以了解一下
    2021-08-08
  • 全面解析Java支持的數據類型及Java的常量和變量類型

    全面解析Java支持的數據類型及Java的常量和變量類型

    這篇文章主要介紹了Java支持的數據類型及Java的常量和變量類型,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2016-02-02
  • 完美解決idea沒有tomcat server選項的問題

    完美解決idea沒有tomcat server選項的問題

    這篇文章主要介紹了完美解決idea沒有tomcat server選項的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • springboot解決java.lang.ArrayStoreException異常

    springboot解決java.lang.ArrayStoreException異常

    這篇文章介紹了springboot解決java.lang.ArrayStoreException異常的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • mybatis的insert語句插入數據時的返回值的實現

    mybatis的insert語句插入數據時的返回值的實現

    這篇文章主要介紹了mybatis的insert語句插入數據時的返回值的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Java?中泛型?T?和???的區別詳解

    Java?中泛型?T?和???的區別詳解

    本文主要介紹了Java?中泛型?T?和???的區別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 帶你入門Java的類與對象

    帶你入門Java的類與對象

    下面小編就為大家帶來一篇深入理解Java 對象和類。小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給你帶來幫助
    2021-07-07

最新評論

免费人成视频在线观看