<association></association>

<association></association>

之前做的项目里都是使用老师说的那种会有错误的方法进行多表查询,没有出现问题。

<association column="department_sn" property="department" javaType="Department" select="com.imooc.oa.dao.DepartmentDao.select"/>

而且这个老师在本门课程中  步骤一:Spring从入门到进阶中的《人员管理系统开发》课程中也是采用了相同的办法,其中的部门编号和名称表字段为id、name,与员工的编号和名称表字段相同,课程截图如下

这里老师有说这种做法不行,有些懵了。

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

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


正在回答

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

6回答

同学你好。同学提供的查询中,没有为select语句指定resultMap,以及association的闭合方式有误,应该改为下面这样:

<resultMap id="employee" type="Employee">
    <id column="sn" property="sn" javaType="String"/>
    <result column="password" property="password" javaType="String"/>
    <result column="name" property="name" javaType="String"/>
    <result column="department_sn" property="departmentSn" javaType="String"/>
    <result column="post" property="post" javaType="String"/>
    <association column="department_sn" property="department" javaType="Department" select="com.imooc.oa.dao.DepartmentDao.select"/>
</resultMap>
<select id="select" parameterType="String" resultMap="employee">
    select * from employee where sn=#{sn}
</select>

修改之后,是可以正常执行查询的,没有问题。不知同学疑惑的地方在哪里?

无论是当前的oa项目还是步骤一的sm项目,都是会给select语句指定resultMap的。然后同学实现的这种方式和老师视频中使用的方式,只是association使用的两种方式而已呢~没有谁对谁错,都可以将数据组装。

如果解答了同学的疑问,望采纳~

祝学习愉快~

提问者 懒人13 2019-12-02 19:27:59

这么问吧老师,若果使用下面这种方式查询会有什么错误

<resultMap id="employee" type="Employee">
        <id column="sn" property="sn" javaType="String"/>
        <result column="password" property="password" javaType="String"/>
        <result column="name" property="name" javaType="String"/>
        <result column="department_sn" property="departmentSn" javaType="String"/>
        <result column="post" property="post" javaType="String"/>
        <association column="department_sn" property="department" javaType="Department" select="com.imooc.oa.dao.DepartmentDao.select/">                
</resultMap>

<select id="select" parameterType="String">
    select * from employee where sn=#{sn}
</select>


芝芝兰兰 2019-12-02 19:07:35

同学你好。老师在这里说的association中必须使用dsn而不是sn不是指之前使用did就是错误了。

本质上来说column就是结果集中的字段。

1、步骤一中,我们查询使用的是都是saff表,结果集中也只有一个did,这个结果集中的字段相当于被绑定了两次,一次作为Staff对象的did属性,一次作为查询department所需要传入的值。

2、而在这个章节里,sn和dsn是来源于两张表,这里存的值也不是意义等同的值。

在查询时,就必须要区分,在这种情况下,再将association里代表Department的编号的id标签绑定到column=sn代表的Employee的编号上,当然是错误的。老师在视频中想表达的是这个意思。

如果解答了同学的疑问,望采纳~

祝学习愉快~

  • 提问者 懒人13 #1
    还是没有明白老师说的什么意思,具体问题在新回答中阐述
    2019-12-02 19:23:30
提问者 懒人13 2019-12-02 18:16:50

我能理解本次课程中老师的做法,也明白这是可行的。只是他说之前的那种做法存在错误我不是很理解,因为他曾经就是这样做的,而我在做课后题时也是这样做的都没有问题

提问者 懒人13 2019-12-02 18:12:41

老师有没有看我给出第二张图片?很明显当时老师要做的就是查询一个员工和他对应部门的信息,而你给我的截图却是查询部门的xml语句。

芝芝兰兰 2019-12-02 18:03:18

同学你好。

1、首先这次我们组装这个resultMap是为了一次性将Employee对象的属性,包括关联的Department属性,通过一次关联查询映射到位,我们需要将关联查询的结果集映射到不同的对象上:

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

而步骤一中的查询则只涉及一个表,所以只用考虑列名和属性的关联

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


2、column实际上并不是某个确定表中的列名,而是查询出的结果集的列名。

在只查一张表,并且没有给字段取别名的时候,就是当前表的字段名。这是步骤一中的用法。

而这一次关联查询的sql中有“d.sn dsn, d.name dname”这是因为department表和employee表都有sn和name字段,但他们实际上不是相同的。

我们期望使用<association>将Department类关联过来,关联的部分有二,一是Department的主键对应的属性sn,在结果集中对应的列名为dsn。二是Department的属性name对应的结果集中的列名dname。

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


如果解答了同学的疑问,望采纳~

祝学习愉快~

  • 提问者 懒人13 #1
    老师有没有看我给出第二张图片?很明显当时老师要做的就是查询一个员工和他对应部门的信息,而你给我的截图却是查询部门的xml语句。
    2019-12-02 18:12:56
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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