Mybatis实现多表联查

目录

一、使用sqlmapper配置文件

1、一对一关系

2、一对多关系

二、使用注解

1、一对一关系

2、一对多关系


一、使用sqlmapper配置文件

1、一对一关系

我们这里有学生表和班级表,学生和班级就是一对一关系(一个学生只有一个班级)

当我们需要查找学生和对应班级时就需要多表联查

 首先我们来看学生实体类该怎么写(这里重写toString是为了后面测试结果明显)

public class Student {
	private int sid;
	private String sname;
	private Date birthday;
	private String ssex;
	private int classid;
	private BanJi bj;
	public Student(int sid, String sname, Date birthday, String ssex, int classid, BanJi bj) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.birthday = birthday;
		this.ssex = ssex;
		this.classid = classid;
		this.bj = bj;
	}
	public Student() {
		super();
	}
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getSsex() {
		return ssex;
	}
	public void setSsex(String ssex) {
		this.ssex = ssex;
	}
	public int getClassid() {
		return classid;
	}
	public void setClassid(int classid) {
		this.classid = classid;
	}
	public BanJi getBj() {
		return bj;
	}
	public void setBj(BanJi bj) {
		this.bj = bj;
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", birthday=" + birthday + ", ssex=" + ssex + ", classid="
				+ classid + ", bj=" + bj + "]";
	}
}

然后是StudentMapper.xml

<resultMap type="Student" id="stu_class_Map">
  <result column="sid"  property="sid" />
  <result column="sname"  property="sname" />
  <result column="birthday"  property="birthday" />
  <result column="ssex"  property="ssex" />
  <result column="classid"  property="classid"  />
  
  <association property="bj">
  <result column="classid" property="classid"/>
  <result column="classname" property="classname"  />
  </association>
  
  </resultMap>
   <select id="findStudentAndClass"  resultMap="stu_class_Map" >
  select * from student inner join class on student.classid= class.classid
  </select>

这里在ResultMap标签中使用association标签来建立一对一的映射关系

结果:

2、一对多关系

同样还是学生表和班级表,班级和学生就是一对多的关系(一个班级可以有多个学生)

当我们查询每个或某个班级所对应的班级名和学生时

先建立实体类(这里重写toString是为了后面测试结果明显)

public class BanJi {
	private int classid;
	private String classname;
	private List<Student> list;
	public BanJi() {
		super();
	}
	public BanJi(int classid, String classname, List<Student> list) {
		super();
		this.classid = classid;
		this.classname = classname;
		this.list = list;
	}
	public int getClassid() {
		return classid;
	}
	public void setClassid(int classid) {
		this.classid = classid;
	}
	public String getClassname() {
		return classname;
	}
	public void setClassname(String classname) {
		this.classname = classname;
	}
	public List<Student> getList() {
		return list;
	}
	public void setList(List<Student> list) {
		this.list = list;
	}
	@Override
	public String toString() {
		return "Banji [classid=" + classid + ", classname=" + classname + ", list=" + list + "]";
	}
	
}

然后是Banji的xml文件

<resultMap type="BanJi" id="class_stu">
	<result column="classid"  property="classid"/>
	<result column="classname"  property="classname"/>
	
	<collection property="list" ofType="Student">
		<result column="sid" property="sid"/>
		<result column="birthday" property="birthday"/>
		<result column="sname" property="sname"/>
		<result column="ssex" property="ssex"/>
		<result column="classid" property="classid"/>
	</collection>
	
</resultMap>
 <select id="findClassOfStudent" resultMap="class_stu">
 select * from  class left join student on class.classid= student.classid
 </select>

这里在ResultMap标签中使用collection标签来建立一对多的映射关系

结果:

二、使用注解

 

1、一对一关系

查看所有的学生和对应班级信息(学生和班级就是一对一关系)

实体类与上面相同

@Results(
		{@Result(column="classid", property="classid"),	
		@Result(column="classid", property="bj",
		    one=@One(select="com.ape.mapper.BanJiMapper.findBanjiByid"))	
		})
	@Select("select * from  student")
	public List<Student> findAllStudnetAndC();

这里我们使用@One注解,我们通过@One里的select属性去调用BanjiMapper(接口)的findBanjiByid方法,入口参数为字段classid,将返回值赋给bj。

2、一对多关系

查看班级对应的学生

@Results({
		@Result(column="classid",property="classid"),
		@Result(column="classid",property="list",
		many=@Many(select="com.ape.mapper.StudentMapper.findAllStudentBycid"))
	     })
	@Select("select * from class where classid=#{v}")
	public BanJi findBanjiByCid(int classid);

这里我们使用@Many标签,通过select属性调用StudentMapper下的findAllStudentByid方法
入口参数为字段classid,并将返回值赋给list。

总结一下:使用xml文件确实是进行了多表联查,但使用注解其实是分多次的单表查询。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis Plus是一款针对MyBatis框架的增强工具, 它提供了很多方便的方法来实现联查. 你可以使用MyBatis Plus的`selectPage`方法来实现联查, 该方法接收一个`QueryWrapper`参数, 你可以在`QueryWrapper`中指定你要连接的, 以及连接条件. 例如, 假设你有两张: `t_user`和`t_order`, 并且你希望查询出每个用户的订单信息, 那么你可以使用如下代码来实现: ```java QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("u.status", 1) .leftJoin("t_order o", "u.id = o.user_id"); IPage<User> page = new Page<>(1, 10); IPage<User> result = userMapper.selectPage(page, queryWrapper); ``` 在这段代码中, `leftJoin`方法示进行左连接, 你也可以使用`rightJoin`方法进行右连接, 或者不使用连接方法直接写连接条件. 另外, MyBatis Plus还提供了很多其他方法来实现联查, 例如`selectList`, `selectMaps`, `selectObjs`等, 这些方法的使用方法与`selectPage`类似. 希望这能帮到你! 如果你有其他问题, 请随时联系我. ### 回答2: MyBatis Plus提供了多种方法实现联查。以下是其中几种常见的方法: 1. 使用@TableName注解和实体类中的关联注解,例如@OneToOne、@OneToMany、@ManyToOne等注解来定义之间的关系,然后使用Mapper的selectList方法进行联查。这种方式比较灵活,可以自定义查询条件。 2. 使用Wrapper进行多联查。Wrapper是MyBatis Plus提供的一个查询条件构造器,可以通过指定条件来进行多联查。例如,可以使用Wrapper的join方法来关联不同的,然后使用selectList方法进行查询。 3. 使用自定义的SQL语句进行多联查。可以编写自定义的SQL语句来实现联查,然后通过MyBatis Plus提供的方法进行查询。可以使用@Select注解或者XML文件配置进行SQL语句编写。 4. 使用MyBatis Plus提供的关联查询方法。MyBatis Plus提供了一些特定的关联查询方法,例如selectJoinPage、selectJoinList等方法,可以直接进行多联查,省去了手动编写SQL语句的步骤。 总之,无论是通过注解还是通过Wrapper或者自定义SQL语句,MyBatis Plus都提供了多种方法来实现联查,开发者可以根据自己的需求和习惯进行选择和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值