关于MyBatis关联查询

关于MyBatis关联查询

为什么在此处OA项目中,

  1. 老师需要(左外)连接部门表?不可以直接select * from employee吗,自动完成关联对象的属性填充?那什么时候需要用(内/外)连接?

  2. 我不是很理解为什么如果多表如果有相同字段名,就需要手动配置<association>标签体内的字段映射关系

-----------------------------------------

之前有一个管理系统的项目,有如下实体类:部门;员工(员工中包含部门)

在员工查询语句中并没有(内/外)连接部门表;jsp页面中可以直接用表达式${staff.department.name}直接得到所属部门信息。

下面是DepartmentDao和StaffDao的MyBatis配置文件

<mapper namespace="com.mike.service.dao.DepartmentDao">
    <resultMap id="resultMap" type="Department">
        <!--主键-->
        <id property="id" column="id" javaType="Integer"/>
        <result property="name" column="name" javaType="String"/>
        <result property="address" column="address" javaType="String"/>
    </resultMap>
    <select id="selectAll" resultMap="resultMap">
        select * from department
    </select>
</mapper>
<mapper namespace="com.mike.service.dao.StaffDao">
    <resultMap id="resultMap" type="Staff">
        <!--主键-->
        <id property="id" column="id" javaType="Integer"/>
        <result property="account" column="account" javaType="String"/>
        <result property="did" column="did" javaType="Integer"/>
        <association property="department" column="did" javaType="Department" select="com.mike.service.dao.DepartmentDao.selectById"/>
    </resultMap>
    <select id="selectAll" resultMap="resultMap">
        select * from staff
    </select>
</mapper>

正在回答 回答被采纳积分+1

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

3回答
好帮手慕珊 2020-02-01 17:46:54

同学,你好!使用select的方式,在执行select * from staff;的时候会通过select属性设置的方法,将对应的部门Department的信息查询出来,这是之前的使用方式。

在本次课程中,没有使用到select,在<association>中只配置了属性的对应关系,注意下面的coloum值是dsn和dname

http://img1.sycdn.imooc.com//climg/5e35486e09fb319516800154.jpg

再来看一下查询语句,不是一个简单的select语句,而是一个连接查询语句,这里用到了前面的dsn和dname。所以这种方式其实是通过连接查询实现的。http://img1.sycdn.imooc.com//climg/5e3548c10965acd116060154.jpg

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

不停奔跑的小恐龙 2020-01-31 21:22:11

老师您好,关于这个问题我看到有好些人问,在这里我想补充问一点,这位同学举的例子中有这么一个细节

http://img1.sycdn.imooc.com//climg/5e34291f09023c1a07730090.jpg

这个association中有一个select,column中的did可以带入里面,然后查询到的就填入association里面的property,但是本节课的是没有select的

http://img1.sycdn.imooc.com//climg/5e34299e092b974b11170191.jpg

所以不止一个同学问到association里面的是怎么完成封装的,这一点老师解释的不是很清楚,我也不是很清楚,所以麻烦老师解答一下这个问题谢谢!

  • 你好!请看上面的回答。祝学习愉快!
    2020-02-01 17:47:19
好帮手慕小班 2020-01-08 15:34:39

同学你好,

老师需要(左外)连接部门表?不可以直接select * from employee吗,自动完成关联对象的属性填充?那什么时候需要用(内/外)连接?

    1、我们组装这个resultMap是为了一次性将Employee对象的属性,包括关联的Department属性,通过一次关联查询映射到位,例如:

http://img1.sycdn.imooc.com//climg/5e15830709071cd811070438.jpg

http://img1.sycdn.imooc.com//climg/5e15833e0909934c12530195.jpg

如上所示,在resultMap中关联了Department,对应就需要使用关联查询,来连接查询部门表。

内/外连接:

    内连接:返回的是表中存在至少一个匹配的数据,那么不匹配的数据肯定就不返回了,所以一般使用内连接是使用内链接可以去除重复记录。

    外链接:显示全部数据的是主查询表, 显示部分数据的是关联查询表,对应的左外链接和右外链接,就是主查询表的位置不同。

我不是很理解为什么如果多表如果有相同字段名,就需要手动配置<association>标签体内的字段映射关系

    2、因为我们要做联表查询,比如:在同一个结果集中展现e表的sn和d表的sn,为了区分,才将它设置为不同。 (column对应的是结果集的列名,不是原表的。property是对应实体的属性名)

http://img1.sycdn.imooc.com//climg/5e1581ca0911f37b11380411.jpg

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

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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