我是靠谱客的博主 风趣世界,这篇文章主要介绍MyBatis的一对多、多对一的嵌套结果和嵌套查询一、在MyBatis中一对多时使用collection标签;在多对一的时候使用association标签 一对多的查询一对多的嵌套查询多对一的查询多对一的嵌套结果,现在分享给大家,希望可以做个参考。

一、在MyBatis中一对多时使用collection标签;在多对一的时候使用association标签

二、数据库表

t_play_Tyoe
t_play

2.1、数据查询结果

 

 使用的maven整合,所以jar不需要自己导入  项目的结构

 

一对多的查询

一对多的嵌套结果

 Play javaBean

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.lzq.oneToMany.domain; import java.util.List; //一对多中的一 public class playType { private Long id; private String type_name; // 将一对多中的多表作为属性封装在一中 List<Play> types; public playType() { } public playType(Long id, String type_name, List<Play> types) { this.id = id; this.type_name = type_name; this.types = types; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getType_name() { return type_name; } public void setType_name(String type_name) { this.type_name = type_name; } public List<Play> getTypes() { return types; } public void setTypes(List<Play> types) { this.types = types; } @Override public String toString() { return "playType{" + "id=" + id + ", type_name='" + type_name + ''' + ", types=" + types + '}'; } }

 PlayType javaBean

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.lzq.oneToMany.domain; public class Play { private Long id; private String play_name; private Long play_type; public Play() { } public Play(Long id, String play_name, Long play_type) { this.id = id; this.play_name = play_name; this.play_type = play_type; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getPlay_name() { return play_name; } public void setPlay_name(String play_name) { this.play_name = play_name; } public Long getPlay_type() { return play_type; } public void setPlay_type(Long play_type) { this.play_type = play_type; } @Override public String toString() { return "Type{" + "id=" + id + ", play_name='" + play_name + ''' + ", play_type=" + play_type + '}'; } }

Mpper层接口

复制代码
1

 对应的Mapper层接口的xml文件

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?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"> <!-- 映射器的要求 两个一致 1、接口类和接口类的xml文件必须要在同一个目录下 2、接口中的抽象方法名和xml文件的id需要相同 --> <!--接口的全路径类名 --> <mapper namespace="com.lzq.oneToMany.mapper.playTypeMapper"> <resultMap id="allPlays" type="playType" > <!-- 对JavaBean中的属性与数据库中的字段进行配对 --> <id property="id" column="id"/> <result property="type_name" column="type_name"/> <!-- ofType="Play" 是从表JavaBean的引用路径--> <collection property="types" ofType="Play"> <id property="id" column="tid"/> <result property="play_name" column="play_name"/> <result property="play_type" column="play_type"/> </collection> </resultMap> <select id="getPlayTypeAll" resultMap="allPlays"> select t1.id,t1.type_name,t2.id tid, t2.play_name,t2.play_type from t_play_type t1 LEFT JOIN t_play t2 on t1.id=t2.play_type </select> </mapper>
复制代码
1
注意:一对多中 <collection property="types" ofType="Play">property="types" 是主表中对从表进行封装是的属性名 ofType="Play" ofType是MyBatis对一对多时规定使用的,值是对应的引用路径在使用resultMap时其主键是用标签id,其余字段使用result标签

三、检测结果

复制代码
1
2
3
4
5
6
7
@Test public void getPlayTypeAll() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); playTypeMapper mapper = sqlSession.getMapper(playTypeMapper.class); List<playType> list = mapper.getPlayTypeAll(); list.forEach(System.out::println); }

使用工具类MyBatisUtils来获取SQLSession对象

复制代码
1
2
3
4
playType{id=1, type_name='游戏', types=[Type{id=1, play_name='英雄联盟', play_type=1}, Type{id=2, play_name='地下城与勇士', play_type=1}, Type{id=3, play_name='冒险岛', play_type=1}]} playType{id=2, type_name='运动', types=[Type{id=4, play_name='跑步', play_type=2}, Type{id=5, play_name='踢足球', play_type=2}, Type{id=6, play_name='游泳', play_type=2}]} playType{id=3, type_name='艺术', types=[Type{id=7, play_name='唱歌', play_type=3}, Type{id=8, play_name='跳舞', play_type=3}, Type{id=9, play_name='弹吉他', play_type=3}]}

一对多的嵌套查询

对多嵌套查询的Mapper层接口

 

一对多的嵌套查询Mapper.xml

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?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"> <!-- 映射器的要求 两个一致 1、接口类和接口类的xml文件必须要在同一个目录下 2、接口中的抽象方法名和xml文件的id需要相同 --> <!--接口的全路径类名 --> <mapper namespace="com.lzq.oneToMany.mapper.NestedQueryPlayTypeMapper"> <resultMap id="getPlayType" type="playType"> <id property="id" column="id"/> <result property="type_name" column="type_name"/> <!--在myBatis规定中一对多嵌套查询和嵌套查询的时候使用的是collection--> <collection property="types" column="id" ofType="Play" select="com.lzq.oneToMany.mapper.NestedQueryPlayTypeMapper.getPaly"> </collection> </resultMap> <select id="getAll" resultMap="getPlayType"> select * from t_play_type; </select> <select id="getPaly" resultType="Play"> select * from t_play where play_type=#{id} </select> </mapper>

注意:嵌套查询是首先查询出t_play_type的所有数据,然后在根据查询出来的外键id和t-play表的id进行查询。从而查询出全部数据。

检查结果:

复制代码
1
2
3
4
playType{id=1, type_name='游戏', types=[Type{id=1, play_name='英雄联盟', play_type=1}, Type{id=2, play_name='地下城与勇士', play_type=1}, Type{id=3, play_name='冒险岛', play_type=1}]} playType{id=2, type_name='运动', types=[Type{id=4, play_name='跑步', play_type=2}, Type{id=5, play_name='踢足球', play_type=2}, Type{id=6, play_name='游泳', play_type=2}]} playType{id=3, type_name='艺术', types=[Type{id=7, play_name='唱歌', play_type=3}, Type{id=8, play_name='跳舞', play_type=3}, Type{id=9, play_name='弹吉他', play_type=3}]}

多对一的查询

多对一的嵌套结果

数据库表及结构

    

数据库的查询结果

 多对一的嵌套结果

 domain层:

User实例

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.lzq.manyToOne.domain; import com.lzq.manyToOne.domain.Dept; public class User { private Long id; private String name; private Long dept_id; private Dept depts; public User() { } public User(Long id, String name, Long dept_id, Dept dept) { this.id = id; this.name = name; this.dept_id = dept_id; this.depts = dept; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getDept_id() { return dept_id; } public void setDept_id(Long dept_id) { this.dept_id = dept_id; } public Dept getDepts() { return depts; } public void setDepts(Dept depts) { this.depts = depts; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + ''' + ", dept_id=" + dept_id + ", dept=" + depts + '}'; } }

Dept实例:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.lzq.manyToOne.domain; /** * 多对一的一 */ public class Dept { private Long id; private String dept_name; public Dept() { } public Dept(Long id, String dept_name) { this.id = id; this.dept_name = dept_name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDept_name() { return dept_name; } public void setDept_name(String dept_name) { this.dept_name = dept_name; } @Override public String toString() { return "Dept{" + "id=" + id + ", dept_name='" + dept_name + ''' + '}'; } }

Mapper层接口

Mapper层接口的xml

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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"> <!-- 映射器的要求 两个一致 1、接口类和接口类的xml文件必须要在同一个目录下 2、接口中的抽象方法名和xml文件的id需要相同 --> <!--接口的全路径类名 --> <mapper namespace="com.lzq.manyToOne.mapper.UserMapper"> <resultMap id="UserAndDept" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="dept_id" column="dept_id"/> <association property="depts" javaType="Dept"> <id property="id" column="tid"/> <result property="dept_name" column="dept_name"/> </association> </resultMap> <select id="getUserAndDeptAll" resultMap="UserAndDept"> select t1.id,t1.name,t1.dept_id,t2.id tid, t2.dept_name from t_user t1 left join t_user_dept t2 on t1.dept_id =t2.id </select> </mapper>

测试结果:

复制代码
1
2
3
4
5
6
User{id=1, name='高昂', dept_id=1, dept=Dept{id=1, dept_name='教学部'}} User{id=2, name='曹杰', dept_id=1, dept=Dept{id=1, dept_name='教学部'}} User{id=3, name='奇异博士', dept_id=2, dept=Dept{id=2, dept_name='产品部'}} User{id=4, name='钢铁侠', dept_id=2, dept=Dept{id=2, dept_name='产品部'}} User{id=5, name='张三', dept_id=3, dept=Dept{id=3, dept_name='就业部'}} User{id=6, name='李四', dept_id=3, dept=Dept{id=3, dept_name='就业部'}}

多对一的嵌套查询

Mapper层接口

Mapper层接口的xml

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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"> <!-- 映射器的要求 两个一致 1、接口类和接口类的xml文件必须要在同一个目录下 2、接口中的抽象方法名和xml文件的id需要相同 --> <!--接口的全路径类名 --> <mapper namespace="com.lzq.manyToOne.mapper.NestedQueryUserMapper"> <resultMap id="NestQuery" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="dept_id" column="dept_id"/> <!--在Mybatis规定中多对一的嵌套查询和嵌套结果中使用的是association--> <association property="depts" column="dept_id" select="com.lzq.manyToOne.mapper.NestedQueryUserMapper.getDeptById"> </association> </resultMap> <select id="getUserAll" resultMap="NestQuery"> select * from t_user; </select> <select id="getDeptById" resultType="Dept"> select * from t_user_dept where id=#{id} </select> </mapper>

多对一的嵌套查询时,resultMap标签里面使用 assocation标签,其中有属性select 、column.            conlumn的值是多方表的外键

测试查询结果

复制代码
1
2
3
4
5
6
User{id=1, name='高昂', dept_id=1, dept=Dept{id=1, dept_name='教学部'}} User{id=2, name='曹杰', dept_id=1, dept=Dept{id=1, dept_name='教学部'}} User{id=3, name='奇异博士', dept_id=2, dept=Dept{id=2, dept_name='产品部'}} User{id=4, name='钢铁侠', dept_id=2, dept=Dept{id=2, dept_name='产品部'}} User{id=5, name='张三', dept_id=3, dept=Dept{id=3, dept_name='就业部'}} User{id=6, name='李四', dept_id=3, dept=Dept{id=3, dept_name='就业部'}}

最后

以上就是风趣世界最近收集整理的关于MyBatis的一对多、多对一的嵌套结果和嵌套查询一、在MyBatis中一对多时使用collection标签;在多对一的时候使用association标签 一对多的查询一对多的嵌套查询多对一的查询多对一的嵌套结果的全部内容,更多相关MyBatis内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(126)

评论列表共有 0 条评论

立即
投稿
返回
顶部