你知道 Mybatis 框架如何实现级联关系吗?

# 你知道 Mybatis 框架如何实现级联关系吗?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kbYHQfpy-1602664881939)(https://imgkr.cn-bj.ufileos.com/768074eb-5e03-4ad1-81ee-5432b6614e4a.jpg)]

## 级联关系实现的方式

- 一对一

- 一对多


## 案例实操

### 一对一关系

实现方式 resultType/resultMap

**接口方法**

~~~ java

/**

* 一对一关联查询 resultType

* @param userId

* @return

*/

UserDto queryUserCardInfoForResultType(@Param("userId")int userId);

~~~

**sql 查询**

~~~ xml

<select id="queryUserCardInfoForResultType" resultType="userDto">

    SELECT

u.id,

u.user_name AS userName,

u.user_pwd AS userPwd,

u.flag,

u.cid,

c.number

FROM

USER u

LEFT JOIN card c ON u.cid = c.id

WHERE

u.id = #{userId}

</select>

~~~

#### resultType **实现**

~~~ xml

<select id="queryUserByIdResultType" parameterType="int" resultType="com.xxx.dto.UserDto">

SELECT

u.id,

u.user_name AS userName,

u.create_time,

u.flag,

u.cid AS cid,

c.number

FROM

User u

LEFT JOIN card c u ON u.cid =c.id

WHERE

u.id = #{id}

</select>

~~~

#### resultMap 实现

~~~ xml

<!--自定义映射关系实现关联  -->

<resultMap id="baseUser" type="com.xxx.mybatis.pojo.User">

    <id column="id"  property="id" /> <!-- 主键 -->

    <!-- 普通例 -->

    <result column="user_name" property="userName" />

    <result column="true_name" property="trueName" />

    <result column="role_name" property="roleName"/>

</resultMap>

<select id="queryUserInfoByIdV2"  parameterType="int" resultMap="baseUser" >

    SELECT u.id,u.user_name,u.true_name,l.role_name   

    FROM t_user u JOIN t_user_role r

    ON (u.id = r.user_id) JOIN t_role l

    on (r.role_id = l.id)

    WHERE u.id  =  #{id}

</select>

~~~

#### resultMap + association实现

**resultMap** **映射定义**

~~~ xml

<resultMap id="baseUserRole" type="userRole">

    <id  column="id"  property="id"></id>

    <result column="role_id"  property="roleId"></result>

    <association property="role"  column="role_id" select="queryRoleById"/>

</resultMap>

<resultMap id="baseRole" type="role">

    <id column="id" property="id"></id>

    <result column="role_name" property="roleName"/>

    <result column="role_remark" property="roleRemark"/>

</resultMap>

~~~

**查询**

~~~ xml

<select id="queryUserRoleInfoById" parameterType="int" resultMap="baseUserRole">

    SELECT  id, role_id  FROM  t_user_role WHERE  id = #{id}

</select>

<select id="queryRoleById" parameterType="int"  resultMap="baseRole">

    SELECT  id, role_name , role_remark  FROM t_role WHERE  id = #{role_id}

</select>

~~~

### 一对多关系

实现方式:resultMap 实现

resultType 有局限,无法去重,需手动处理。

**ResultMap 定义 **

~~~ xml

<resultMap id="baseGoods" type="goods">

    <id column="id" property="id"/>

    <result column="name" property="goodsName"/>

    <result column="promotePrice" property="price"/>

    <collection property="ixxxs" column="id" select="queryGoodsIxxxsById"/>

</resultMap>

<resultMap id="baseGoodsImnage" type="GoodsIxxxs">

    <id column="id" property="id"></id>

    <result  column="goods_skuid" property="goodsSkuid" ></result>

    <result  column="goods_img" property="ixxxUrl" ></result>

</resultMap>

~~~

查询

~~~ xml

<select id="queryGoodsById"  parameterType="int" resultMap="baseGoods" useCache="true">

    select  id, name , promotePrice FROM yg_goods WHERE id = #{id}

</select>

<select id="queryGoodsIxxxsById" parameterType="int" resultMap="baseGoodsImnage" useCache="true">

    SELECT id , goods_skuid , goods_img  FROM yg_goods_imgage where goods_skuid = #{id}

</select>

~~~

## 扩展

### sql

sql 元素用来定义一个**可以复用的 SQL 语句段**,供其它语句调用。比如:

~~~ xml

<sql id="User_columns">userId, userName, password</sql>

<!--用include 引用-->

<select id="findUserById" resultMap="RM_User" >   

    select <include refid="User_columns"/>

    from user where userId = #{userId}

</select>

~~~

/sql>

<!--用include 引用-->

<select id="findUserById" resultMap="RM_User" >   

    select <include refid="User_columns"/>

    from user where userId = #{userId}

</select>

~~~

###

需要视频配套文档或更多资料+我们程序员小姐姐v:lezijie007(加好友时备注:b站-LT,不备注拒绝添加哟)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342