resultMap标签中里的collection标签详解
程序员文章站
2022-06-15 14:17:43
目录resultmap标签中的collection标签collection(一对多)collection标签中各属性的说明resultmap标签中的collection标签collection(一对多...
resultmap标签中的collection标签
collection(一对多)
元素的作用和association元素的作用差不多一样,事实上,它们非常类似,也是映射到javabean的某个“复杂类型” 属性,只不过这个属性是一个集合列表,即javabean内部嵌套一个复杂数据类型(集合)。和使用association元素一样,我们使用嵌套查询, 或者从连接中嵌套结果集。
下面通过一个示例来演示coeltien 的具体应用,示例需求获取指定用户的相关的信息和地址列表。
我们有实体类employee如下:
package com.xyj.entity; import java.util.list; import lombok.allargsconstructor; import lombok.data; import lombok.noargsconstructor; @data @noargsconstructor @allargsconstructor public class employee { private int eid; private string ename; private string epwd; private string address; private string tel; private list<sport> sports;//职员所参加的所有运动项目 }
员工间举行了一个小型运动会,又有sport实体类如下:
package com.xyj.entity; import lombok.allargsconstructor; import lombok.data; import lombok.noargsconstructor; @data @noargsconstructor @allargsconstructor public class sport { private int sportid; private string sportname; private string sportscore; }
可知一个员工可以参加多个运动项目,所以我们的employee对象内部嵌套了一个复杂数据类型的属性,sports,接下来在empdao接口中添加根据职员id获取职员参加的项目列表的方法,代码如下:
list<employee> findsportsinfobyempid(@param("eid")integer id);
修改对应的映射文件,由于employee内部嵌套了集合对象,因此需要使用collection来实现结果映射,实例代码如下:
<select id="findsportsinfobyempid" resultmap="empmap"> select e.*,s.* from employee as e,sport as s where e.eid=s.eid and e.eid=#{eid} </select> <resultmap type="employee" id="empmap"> <id property="eid" column="eid"/> <result property="ename" column="ename"/> <result property="epwd" column="epwd"/> <result property="address" column="address"/> <result property="tel" column="tel"/> <!-- collection描述一对多的关系,oftype是集合所包含的类型,可以写完整java类名或别名 --> <collection property="sports" oftype="sport"> <id property="sportid" column="sportid"/> <result property="sportname" column="sportname"/> <result property="sportscore" column="sportscore"/> </collection> </resultmap>
最后进行测试,查看结果是否正确:
@org.junit.test public void test() { sqlsession session = mybatisutils.getsqlsession(); empdao ed = session.getmapper(empdao.class); list<employee> list = ed.findsportsinfobyempid(1); for (employee emp : list) { for (sport e : emp.getsports()) { system.out.println(e); } } }
运行结果:
查询成功,但是我们的collection标签写在resultmap标签的内部,不能达到复用,当然是可以复用的,只需修改代码如下:
<select id="findsportsinfobyempid" resultmap="empmap"> select e.*,s.* from employee as e,sport as s where e.eid=s.eid and e.eid=#{eid} </select> <resultmap type="employee" id="empmap"> <id property="eid" column="eid"/> <result property="ename" column="ename"/> <result property="epwd" column="epwd"/> <result property="address" column="address"/> <result property="tel" column="tel"/> <collection property="sports" oftype="sport" resultmap="sportmap"></collection> </resultmap> <resultmap type="sport" id="sportmap"> <id property="sportid" column="sportid"/> <result property="sportname" column="sportname"/> <result property="sportscore" column="sportscore"/> </resultmap>
collection标签中各属性的说明
<result column="name" property="name"/> <!-- collection定义一个子集合对象返回 oftype:指定集合里面元素的类型 property属性设置集合的属性名 --> <collection property="passengers" oftype="passenger"> <!-- id指的是主键, column是数据库中的列,可以是别名 property映射的是实体类中的属性 result是普通列(非主键) --> <id column="pid" property="id"/> <result column="pname" property="name"/> </collection> </resultmap>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。