collection映射
讲了manyToOne和oneToMany,下面来看看get方法。在之前已经说过,如果是映射单对象,直接使用association来映射。而如果关系 是一个集合,则需要使用collection来描述。和association一样,mybatis不会去管关系是many2many还是 one2many。同理要完成collection映射,也应该有两种方式,1,发送另一条sql;2,内联映射。
第一种配置方式
首先在departmentMapper.xml中添加:
<select id="get" resultMap="departmentmapper" parameterType="long"> SELECT * FROM department WHERE id = #{id} </select>
这只是查询出一条Department,接下来配置resultMap:
<resultMap type="Department" id="departmentmapper"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="emps" column="id" ofType="Employee" select="cd.itcast.mybatis.mapper.EmployeeMapper.gets" /> </resultMap>
这里配置了collection,在collection中:
1,property:代表集合对应的属性名称为emps;
2,column:代表one方的id(配合下面的select就清楚了)
3,ofType:注意,这里的ofType代表的是集合里面的对象类型
4,select:非常重要的一条,我们先看看这条select对应的映射:
<select id="gets" resultType="Employee" parameterType="long"> SELECT * FROM EMPLOYEE WHERE DEPT_ID = #{id} </select>
可以看到,这段sql根据外键从employee表中查询所有的匹配给定的department的employee对象。
结合select和column,再联想之前的association中的select方式,我们可以明白,mybatis的存放策略为:首先执行查询得到department结果集,从结果集中得到相关的列,拼装id和name属性。当mybatis运行到emps属性时,会从结果集中把id得到,并作为参数传入cd.itcast.mybatis.mapper.EmployeeMapper.gets,并查询到该department对应的 employees,最后把employees设置到Department的emps属性中。
注意这种方式也遵循延迟加载策略,并且容易产生N+1问题。
第二种配置方式
<select id="get" resultMap="departmentmapper" parameterType="long"> SELECT d.*,e.id as eid,e.name as ename FROM DEPARTMENT d LEFT JOIN EMPLOYEE e ON e.DEPT_ID = d.id WHERE d.id = #{id} </select>
<resultMap type="Department" id="departmentmapper"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="emps" ofType="Employee"> <id property="id" column="eid"/> <result property="name" column="ename"/> </collection> </resultMap>
结合前面的解释,应该很好理解了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-05-29 使用MySQL的SELECT INTO OUTFILE ,Load data file,Mysql 大量数据快速导入导出
2020-05-29 Mysql百万级数据索引重新排序
2020-05-29 Java Jar包压缩、解压使用