服务器之家

服务器之家 > 正文

Mybatis中collection和association的使用区别详解

时间:2021-06-17 11:37     来源/作者:生活,一半是回忆、一半是

最近一直把collection和association弄混,所以为了增强自己的记忆,就撸一个关系出来算是总结罢了

1. 关联-association
2. 集合-collection

比如同时有user.java和card.java两个类

user.java如下:

?
1
2
3
4
5
6
7
public class user{
 
private card card_one;
 
private list<card> card_many;
 
}

在映射card_one属性时用association标签, 映射card_many时用collection标签.

所以association是用于一对一和多对一,而collection是用于一对多的关系

下面就用一些例子解释下吧

association-一对一

人和身份证的关系

下面是pojo

?
1
2
3
4
5
public class card implements serializable{
 private integer id;
 private string code;
//省略set和get方法.
}
?
1
2
3
4
5
6
7
8
9
public class person implements serializable{
 private integer id;
 private string name;
 private string sex;
 private integer age;
 //人和身份证是一对一的关系
 private card card;
//省略set/get方法.
}

下面是mapper和实现的接口

?
1
2
3
4
5
6
7
package com.glj.mapper;
 
import com.glj.poji.card;
 
public interface cardmapper {
 card selectcardbyid(integer id);
}
?
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<!doctype mapper
  public "-//mybatis.org//dtd mapper 3.0//en"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.glj.mapper.cardmapper">
 <select id="selectcardbyid" parametertype="int" resulttype="com.glj.poji.card">
 select * from tb_card where id = #{id}
 </select>
</mapper>
?
1
2
3
4
5
6
7
package com.glj.mapper;
 
import com.glj.poji.person;
 
public interface personmapper {
 person selectpersonbyid(integer id);
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<!doctype mapper
  public "-//mybatis.org//dtd mapper 3.0//en"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.glj.mapper.personmapper">
 <resultmap type="com.glj.poji.person" id="personmapper">
 <id property="id" column="id"/>
 <result property="name" column="name"/>
 <result property="sex" column="sex"/>
 <result property="age" column="age"/>
 <association property="card" column="card_id"
  select="com.glj.mapper.cardmapper.selectcardbyid"
  javatype="com.glj.poji.card">
 </association>
 </resultmap>
 <select id="selectpersonbyid" parametertype="int" resultmap="personmapper">
 select * from tb_person where id = #{id}
 </select>
</mapper>

personmapper.xml 还使用association的分步查询。

同理多对一,也是一样

只要那个pojo出现private card card_one;

即使用association

collection 一对多和association的多对一关系

学生和班级的一对多的例子

pojo类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.glj.pojo;
 
import java.io.serializable;
import java.util.list;
 
public class clazz implements serializable{
 private integer id;
 private string code;
 private string name;
    //班级与学生是一对多的关系
 private list<student> students;
//省略set/get方法
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.glj.pojo;
 
import java.io.serializable;
 
public class student implements serializable {
 private integer id;
 private string name;
 private string sex;
 private integer age;
    //学生与班级是多对一的关系
 private clazz clazz;
//省略set/get方法
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<!doctype mapper
  public "-//mybatis.org//dtd mapper 3.0//en"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.glj.mapper.clazzmapper">
 <select id="selectclazzbyid" parametertype="int" resultmap="clazzresultmap">
 select * from tb_clazz where id = #{id}
 </select>
 <resultmap type="com.glj.pojo.clazz" id="clazzresultmap">
 <id property="id" column="id"/>
 <result property="code" column="code"/>
 <result property="name" column="name"/>
 <!-- property: 指的是集合属性的值, oftype:指的是集合中元素的类型 -->
 <collection property="students" oftype="com.glj.pojo.student"
 column="id" javatype="arraylist"
 fetchtype="lazy" select="com.glj.mapper.studentmapper.selectstudentbyclazzid">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <result property="sex" column="sex"/>
  <result property="age" column="age"/>
 </collection>
 </resultmap>
</mapper>
?
1
2
3
4
5
6
7
package com.glj.mapper;
 
import com.glj.pojo.clazz;
 
public interface clazzmapper {
 clazz selectclazzbyid(integer id);
}

clazzmapper使用到了集合-collection 即为一对多,一个班级面对多个学生

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<!doctype mapper
  public "-//mybatis.org//dtd mapper 3.0//en"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.glj.mapper.studentmapper">
 <select id="selectstudentbyid" parametertype="int" resultmap="studentresultmap">
 select * from tb_clazz c,tb_student s where c.id = s.id and s.id = #{id}
 </select>
 <select id="selectstudentbyclazzid" parametertype="int" resultmap="studentresultmap">
 select * from tb_student where clazz_id = #{id}
 </select>
 <resultmap type="com.glj.pojo.student" id="studentresultmap">
 <id property="id" column="id"/>
 <result property="name" column="name"/>
 <result property="sex" column="sex"/>
 <result property="age" column="age"/>
 <association property="clazz" javatype="com.glj.pojo.clazz">
  <id property="id" column="id"/>
  <result property="code" column="code"/>
  <result property="name" column="name"/>
 </association>
 </resultmap>
</mapper>
?
1
2
3
4
5
6
7
package com.glj.mapper;
 
import com.glj.pojo.student;
 
public interface studentmapper {
 student selectstudentbyid(integer id);
}

studentmapper则是与班级为多对一关系,所以使用了关联-association

嗯,希望我以后又不记得二者的关系时,能感谢现在总结的自己

附上一张mybatis的类型别名图

Mybatis中collection和association的使用区别详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://199604.com/709

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部