Mybatis resultMap 中 collection association 的用法
controller--------------------------------------------------------------------- 两个请求
@RequestMapping(value="testResultMap" , method = RequestMethod.GET)
public void testResultMap(){
String id = "1";
List<MyModel2> list=sysService.testRun08(id);
System.out.println("lalala");
}
@RequestMapping(value="testResultMapOne" , method = RequestMethod.GET)
public void testResultMapOne(){
List<Integer> list = new ArrayList<Integer>();
list.add(2);
list.add(3);
List<MyModel> list1=sysService.testRun09(list);
System.out.println("lalala");
}
testResultMap 返回的是 一对多的情况 图1
testResultMapOne 返回的是 一对一的情况 图2
图1
图2
service-----------------------------------------------------------------
public List<MyModel2> testRun08(String id){
List<MyModel2> l = sysUMapper.testresultModel2(id);
return l;
}
public List<MyModel> testRun09(List<Integer> list){
List<MyModel> l = sysUMapper.testresultModel2one(list);
return l;
}
mapper.java-----------------------------------------------------------------------
public List<MyModel2> testresultModel2(@Param("id") String id );
public List<MyModel> testresultModel2one(@Param("list") List<Integer> list );
model(pojo)-------------------------------------------------------------------------------(省略getter setter)用到的三个model类
public class Detail {
private Long id;
private String userId;
private String level;
private String jurisdiction;
public class MyModel2 {
private Long id;
private String username ;
private String sex;
private String birthday;
private String address;
private List<Detail> details;
public class MyModel {
private Long id;
private String username ;
private String sex;
private String birthday;
private String address;
private Detail detail;
mapper.xml------------------------------------------------------
collection 对应指定着 model2中的 类 List<Detail> details
这里特别注意的是:
details 是 一个List<Detail> details ; 这个变量装着 一对多情况中的
多个Detail对象 (我当然说的是 图1中的情况 :一个user 对应多个detail )
这些detail 就应该存在 details这个List中! 这也是我们选择应用<collection>的原因
更需要注意的是 <collection property="details" ofType="com.sly.web.sys.model.Detail">
<id column="did" property="id" /> 这个id 一定要注意 id 名对应 表中的列名 , 并且 id 是唯一标识;
不然会出现一种情况: 返回的list 也就是details 中 只有一条数据,这条数据就是查询的第一条数据!!!!!!!!!!!!!!!!!!
<resultMap type="com.sly.web.sys.model.MyModel2" id="DetailWithinMyModelList">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
<collection property="details" ofType="com.sly.web.sys.model.Detail">
<id column="did" property="id" />
<result column="user_id" property="userId"/>
<result column="level" property="level"/>
<result column="jurisdiction" property="jurisdiction"/>
</collection>
</resultMap>
<select id="testresultModel2" resultMap="DetailWithinMyModelList">
select us.*, ud.id did , ud.user_id, ud.level, ud.Jurisdiction from testuser us ,userdetail ud
<where>
us.id = ud.user_id
and ud.user_id = #{id}
</where>
</select>
这里要分清 你要返回的对象 是一对多关系 还是一对一关系 , 如果是上面这种一对多关系
,如果使用了association 结果是 你只能返回一条记录 ,也就是第一条记录
association 对应着 你model 里面的指定的 类(detail)
<resultMap type="com.sly.web.sys.model.MyModel" id="DetailWithinMyModel">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
<association property="detail" javaType="com.sly.web.sys.model.Detail" >
<id column="did" property="id" />
<result column="user_id" property="userId"/>
<result column="level" property="level"/>
<result column="jurisdiction" property="jurisdiction"/>
</association>
</resultMap>
<select id="testresultModel2one" resultMap="DetailWithinMyModel">
select us.*, ud.id did , ud.user_id, ud.level, ud.Jurisdiction from testuser us ,userdetail ud
<where>
us.id = ud.user_id
and ud.user_id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</where>
</select>