我是靠谱客的博主 风趣世界,最近开发中收集的这篇文章主要介绍MyBatis的一对多、多对一的嵌套结果和嵌套查询一、在MyBatis中一对多时使用collection标签;在多对一的时候使用association标签 一对多的查询一对多的嵌套查询多对一的查询多对一的嵌套结果,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一、在MyBatis中一对多时使用collection标签;在多对一的时候使用association标签
二、数据库表
2.1、数据查询结果
使用的maven整合,所以jar不需要自己导入 项目的结构
一对多的查询
一对多的嵌套结果
Play javaBean
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
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层接口
对应的Mapper层接口的xml文件
<?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>
注意:一对多中 <collection property="types" ofType="Play">property="types" 是主表中对从表进行封装是的属性名 ofType="Play" ofType是MyBatis对一对多时规定使用的,值是对应的引用路径在使用resultMap时其主键是用标签id,其余字段使用result标签
三、检测结果
@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对象
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
<?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进行查询。从而查询出全部数据。
检查结果:
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实例
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实例:
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
<?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>
测试结果:
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
<?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的值是多方表的外键。
测试查询结果
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的一对多、多对一的嵌套结果和嵌套查询一、在MyBatis中一对多时使用collection标签;在多对一的时候使用association标签 一对多的查询一对多的嵌套查询多对一的查询多对一的嵌套结果所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复