mybatis关于复杂类型的关系映射

mybatis关于复杂类型的关系映射

老师,项目中有一个关系映射难以理解,如下:

<resultMap id="resultMap" type="Staff">
    <id property="id" column="id" javaType="Integer"/>
    <result property="account" column="account" javaType="String"/>
    <result property="password" column="password" javaType="String"/>
    <result property="status" column="status" javaType="String"/>
    <result property="did" column="did" javaType="Integer"/>
    <result property="name" column="name" javaType="String"/>
    <result property="sex" column="sex" javaType="String"/>
    <result property="idNumber" column="id_number" javaType="String"/>
    <result property="workTime" column="work_time" javaType="java.util.Date"/>
    <result property="leaveTime" column="leave_time" javaType="java.util.Date"/>
    <result property="bornDate" column="born_date" javaType="java.util.Date"/>
    <result property="info" column="info" javaType="String"/>
    <association property="department" column="did" javaType="Department" select="com.imooc.sm.dao.DepartmentDao.selectById" />
</resultMap>

1.在这个映射关系中,Staff类的最后一个成员是Department类对象,这个成员对象映射的是数据表的did字段,它应该是将一条查询SQL的结果当作返回结果映射给Staff类里的department这个对象成员的吧。这里调用了DepartmentDao的selectById方法来返回一个Department类对象,

(1)里面不是要传一个id参数么?

(2)这里参数就难道默认是数据表的did字段(即关联字段)么?

(3)如果是这样的话,那要是调用的查询方法有多个参数怎么办呢?

(4)难道要关联多个数据表字段么?

(5)即便如此,那怎么确定第一第二个参数分别是谁呢?

(6)另外,如果关联的字段少于查询的方法所需的参数,可以自定义多出的参数么?

2.之前学某个商城项目的时候有提到分类总数不确定的情况下,对分类表的创建和查询。它的结构是这样的:

//分类表
public class Sort {
    private int id;//该分类id
    private String name;//该分类名称
    private int pid;//该分类的上一级分类id,如果该分类是一级分类,默认pid=0
    private Sort par_sort;//该分类的父级(上一级)分类,如果该分类是以及分类,默认par_sort=null;
}

也就是说,这个表是关联自身的,不是通过外键关联其他表的,通过自己的某个字段关联到了本表中的另一条记录。那请问老师,在这种情况下,我要查询一个分类的所有信息(包括返回它的父级分类),最后返回一个完整的分类对象,用本项目这种方式如何实现呢?原理又是如何的?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好!

一、

  1. 的确是传入了一个参数

  2. column="did"就是用来传递参数的,由于是一个参数所以会直接对应上

  3. 如果是多个参数,在关联时关联多个即可,比如(如果同学没有给字段起别名这里就是数据库中的字段名):

column="{sourceTarget=id,sourceType=cmdb_type}"

    4. 由以上第三点,可以看出是怎么关联的,是通过数据库的字段名称

    5.关联的字段少于查询的方法所需的参数,同学可以添加多余的字段在查询条件中

二、

同表中的关联,与不同表中的关联是一样的,同学可以给其中一个表起一个别名,这样可以把一个表当做两个表,和两张表的实现方式,原理是一样的,但是同学需要注意分类这里是一对多的关系,并不是一对一的关系。

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

提问者 哆丶哆 2019-07-28 11:52:13

老师,对于多个参数关联时关联多个即可,那传参的时候,应该是这样的吧:

column="{数据表字段1,数据表字段2......}"

这样的话是会把column里面的数据依次当作第一、第二............个参数依次赋值调用方法的吧?

那您所说的:

column="{sourceTarget=id,sourceType=cmdb_type}"

是什么情况用到=号的啊?如果说数据表字段有别名,不是直接给别名就可以那种么?

  • 同学你好!老师的表述有点不是很准确,还望见谅。同学可以这么理解。同学应该还记得多表关联的sql,这里其实就是两个表关联,多个字段时是需要用到等号,也就是条件是这两个字段相等。一个参数时,mybatis会自动识别,所以没有等号。有时会习惯性称其为传参。实际上这里更准确的说法是关联。祝学习愉快~
    2019-07-28 15:22:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师