Mybatis【19】-- Mybatis自关联多对多查询
注:代码已托管在GitHub
上,地址是:https://github.com/Damaer/Mybatis-Learning
,项目是mybatis-15-oneself-many2many
,需要自取,需要配置maven环境以及mysql
环境(sql
语句在resource
下的test.sql
中),觉得有用可以点个小星星。
docsify
文档地址在:https://damaer.github.io/Mybatis-Learning/#/
所谓多对多查询,就是类似于:一个学生可以选多门课程,一门可能可以有多个学生。
数据表设计如下:
与数据库对应的实体类Course.java
,值得注意的是,toString()
方法里面我们没有加入students
属性,这是因为在Student
的tostring()
方法里面已经加入我们的Course
这个类了,如果这里加入就会死循环,只加一个就可以了。
import java.util.Set;
public class Course {
private Integer cid;
private String cname;
private Set<Student>students;
@Override
public String toString() {
return "Course [cid=" + cid + ", cname=" + cname +"]";
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
Student.java
:
import java.util.Set;
public class Student {
private Integer sid;
private String sname;
private Set<Course>courses;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", courses="
+ courses + "]";
}
}
定义的接口部分:
public interface IStudentDao {
Student selectStudentById(int id);
}
mapper.xml
文件,查询的时候,查的是三张表,通过sid=studentId and cid=courseId and sid=#{xxx}
关联起来。
对结果做了一个映射,除了主键以及sname
,courses
属性做了集合映射,也就是对Course
类型进行映射。
<?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="dao.IStudentDao">
<resultMap type="Student" id="studentMapper">
<id column="sid" property="sid"/>
<result column="sname" property="sname"/>
<collection property="courses" ofType="Course">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
</collection>
</resultMap>
<select id="selectStudentById" resultMap="studentMapper">
select sid,sname,cid,cname
from student,middle,course
where sid=studentId and cid=courseId and sid=#{xxx}
</select>
</mapper>
单元测试类:
public class MyTest {
private IStudentDao dao;
private SqlSession sqlSession;
@Before
public void Before(){
sqlSession=MyBatisUtils.getSqlSession();
dao=sqlSession.getMapper(IStudentDao.class);
}
@Test
public void TestselectMinisterById(){
Student student=dao.selectStudentById(1);
System.out.println(student);
}
@After
public void after(){
if(sqlSession!=null){
sqlSession.close();
}
}
}
结果:
[service] 2018-07-16 20:25:37,846 - dao.IStudentDao.selectStudentById -843 [main] DEBUG dao.IStudentDao.selectStudentById - ==> Preparing: select sid,sname,cid,cname from student,middle,course where sid=studentId and cid=courseId and sid=?
[service] 2018-07-16 20:25:37,894 - dao.IStudentDao.selectStudentById -891 [main] DEBUG dao.IStudentDao.selectStudentById - ==> Parameters: 1(Integer)
[service] 2018-07-16 20:25:37,935 - dao.IStudentDao.selectStudentById -932 [main] DEBUG dao.IStudentDao.selectStudentById - <== Total: 2
Student [sid=1, sname=Jam, courses=[Course [cid=1, cname=JAVA], Course [cid=2, cname=C++]]]
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。
平日时间宝贵,只能使用晚上以及周末时间学习写作,关注我,我们一起成长吧~
Mybatis【19】-- Mybatis自关联多对多查询的更多相关文章
- myBatis系列之四:关联数据的查询
myBatis系列之三:增删改查是基于单表的查询,如果联表查询,返回的是复合对象,需要用association关键字来处理. 如User发表Article,每个用户可以发表多个Article,他们之间 ...
- mybatis 使用resultMap实现关联数据的查询(association 和collection )
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
- mybatis实战教程二:多对一关联查询(一对多)
多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...
- Mybatis 一对多延迟加载,并且子查询中与主表字段不对应 (19)
Mybatis 一对多延迟加载,并且子查询中与主表字段不对应应用说明. 实现一对多关联(懒加载),一个教研组对应多个教师,既:教师的教研编号与教研组的教研编号关联,并且教师关联教研组外键与教研组编号 ...
- mybatis实战教程(mybatis in action)之四:实现关联数据的查询
有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表 ...
- MyBatis 实践 -动态SQL/关联查询
MyBatis 实践 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装. if 对查询条件进行判断,如果输入参数不为空才进行查询条 ...
- mybatis(一、原理,一对多,多对一查询)
MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...
- SpringBoot使用Mybatis注解进行一对多和多对多查询(2)
SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地 ...
- Mybatis表关联多对一
在上章的 一对多 中,我们已经学习如何在 Mybatis 中关联多表,但在实际项目中也是经常使用 多对一 的情况,这些查询是如何处理的呢,在这一节中我们来学习它.多表映射的多对一关系要用到 mybit ...
- 4. mybatis实战教程(mybatis in action)之四:实现关联数据的查询
转自:https://www.cnblogs.com/shanheyongmu/p/5653599.html 有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如 ...
随机推荐
- 为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义?
为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义? 类的静态成员变量需要在源文件中进行定义,以便在链接阶段能够正确地分配内存并为其分配地址. 当你在类的头文件中声明一个静态成员变量时,这只 ...
- 如何使用 Redis 实现后台房间的数据管理?
摘要:利用 Redis 实现房间业务管理的实践与思考. 文|即构业务后台开发团队 在一些互动场景中,比如语音聊天室.电商直播等,成员控制.连麦.献花.发弹幕等互动功能,通常要求后台服务器能够储 ...
- EF Core – 大杂烩
前言 记入一些零零碎碎的知识. Shadow Properties 参考:Docs – Shadow and Indexer Properties Shadow Property 指的是那些在数据库有 ...
- 安全 – CSP (Content Security Policy)
前言 之前讲过 CSRF.防 Cookie hacking 的. 也介绍过防 XSS 的 HtmlSanitizer. 今天再介绍 CSP. 参考 Content Security Policy 介绍 ...
- EF Core – Custom Migrations (高级篇)
前言 会写这篇是因为最近开始大量使用 SQL Server Trigger 来维护冗余 (也不清楚这路对不对). EF Core migrations 没有支持 Trigger Github Issu ...
- Servlet——idea创建Servlet模板
idea创建Servlet模板 以前新建一个Servlet是通过新建一个Class文件 可以直接新建一个idea内的Servlet模板 可以通过设置 更改 ...
- 关于建表字段是否该使用not null这个问题你怎么看?
大家好,我是 V 哥,在数据库设计中,是否使用 NOT NULL 是一个非常重要的决策,直接影响数据完整性.查询性能以及业务逻辑的复杂度.使用 NOT NULL 的关键在于理解业务需求和具体场景. 下 ...
- K8S命名空间处于Terminating状态,如何强制删除
一.现象 当删除命名空间后,发现该空间一直处于Terminating状态 [root@imanager-beta-arm-21756-5g5ap ~]# kubectl get ns NAME STA ...
- string的find()与npos
在 C++ 中,std::string::find() 是一个用于在字符串中查找子字符串或字符的成员函数.查找成功时返回匹配的索引位置,查找失败时返回 std::string::npos,表示未找到. ...
- Go 语言中值接收者和指针接收者方法调用的自动转换规则详解
在 Go 语言中,方法的调用规则对于值接收者和指针接收者有一些特别的行为,这使得代码变得更加简洁和易用.我们来详细解释一下"方法值调用规则"和"方法表达式调用规则&quo ...