mybatis多对多关联查询
多对多关系
一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系。所谓多对多关系,其实是由两个互反的一对多关系组成。即多对多关系都会通过一个中间表来建立,例如选课表。学生对于选课表来说是一对多,课程对于选课表来说也是一对多。
创建数据库表
学生表我们之前已经创建了t_student,这里就不再重新创建了,下面创建一个课程表
CREATE TABLE `t_course` (
`id` INT NOT NULL,
`name` VARCHAR(20) NULL,
PRIMARY KEY (`id`));
选课表:
CREATE TABLE `learnmybatis`.`t_student_course` (
`id` INT NOT NULL AUTO_INCREMENT,
`sid` INT NULL,
`cid` INT NULL,
PRIMARY KEY (`id`));
初始化数据:
INSERT INTO `learnmybatis`.`t_course` (`id`, `name`) VALUES ('1001', 'SpringMVC');
INSERT INTO `learnmybatis`.`t_course` (`id`, `name`) VALUES ('1002', 'mybatis');
INSERT INTO `learnmybatis`.`t_course` (`id`, `name`) VALUES ('1003', 'Spring');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('1', '1001');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('1', '1002');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('1', '1003');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('3', '1001');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('3', '1002');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('4', '1001');
创建javabean
创建Course类
package com.monkey1024.bean;
import java.util.List;
public class Course {
private int id;
private String name;
private List<Student> students;
//省略getter、setter和toString
}
在之前的Student类中添加List属性表示课程:
private List<Course> courses;
创建mapper
<?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.monkey1024.dao.CourseDao">
<resultMap id="courseMapper" type="Course">
<id property="id" column="cid"/>
<result property="name" column="cname"/>
<collection property="students" ofType="Student">
<id property="id" column="sid"/>
<result property="name" column="sname"/>
</collection>
</resultMap>
<select id="selectCourseStudent" resultMap="courseMapper">
SELECT
c.id cid, c.name cname, s.id sid, s.name sname
FROM
t_course c,
t_student s,
t_student_course sc
WHERE
c.id = #{id}
AND s.id = sc.sid
AND c.id = sc.cid;
</select>
</mapper>
上面sql语句是三张表的关联查询,在collection中表示查询出的学生数据,这里其实可以看做是一对多的查询,因为我们指定了课程编号。
创建Dao
package com.monkey1024.dao;
import com.monkey1024.bean.Course;
public interface CourseDao {
Course selectCourseStudent(int id);
}
创建测试类
package com.monkey1024.test;
import com.monkey1024.bean.Course;
import com.monkey1024.bean.Employee;
import com.monkey1024.dao.CourseDao;
import com.monkey1024.dao.EmployeeDao;
import com.monkey1024.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
public class CourseTest01 {
private SqlSession sqlSession;
private CourseDao courseDao;
/**
* 测试时先执行该方法创建EmployeeDao对象
*/
@Before
public void initStudentDao(){
sqlSession = MyBatisUtil.getSqlSession();
//通过该方法可以获取CourseDao的对象
courseDao = sqlSession.getMapper(CourseDao.class);
}
/**
* 执行完成后需要关闭sqlSession
*/
@After
public void closeSession() {
if (sqlSession != null) {
sqlSession.close();
}
}
@Test
public void selectCourseStudent(){
Course course = courseDao.selectCourseStudent(1001);
System.out.println(course);
}
}
执行结束后可以看到将课程和选择该课程的所有学生全部查询出来了。
mybatis多对多关联查询的更多相关文章
- mybatis多对多关联查询——(十)
1.需求 查询用户及用户购买商品信息. 2 sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.orderdetail. ...
- mybatis多对一关联
mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可, ...
- mybatis实战教程二:多对一关联查询(一对多)
多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...
- mybatis 14: 多对一关联查询
业务背景 根据订单id查询订单的信息,以及该订单所属的客户的基本信息(不包括该客户自己的订单信息) 两张数据表 客户表 订单表 实体类 客户实体类:Customer private Integer i ...
- Java基础-SSM之mybatis多对多关联
Java基础-SSM之mybatis多对多关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建teas,stus,links表 u ...
- 三、mybatis多表关联查询和分布查询
前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...
- NHibernate教程(11)--多对多关联查询
本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...
- MyBatis 多表关联查询
多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...
- mybatis一对多关联查询+pagehelper->分页错误
mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...
随机推荐
- jQuery中的CSS(四)
1. css(name|pro|[,val|fn]), 访问匹配元素的样式属性 jQuery 1.8中,当你使用CSS属性在css()或animate()中,我们将根据浏览器自动加上前缀(在适当的时候 ...
- 工具资源系列之 github 上各式各样的小徽章从何而来?
前言 平时大家在在逛 github 时或多或少都看到过项目首页各式各样的小徽章,不知道你是否和我一样好奇这些小徽章都是哪来的呢? 首先我们先来一睹为快目前前端开发的三大主流框架: var ,看一看他们 ...
- jdk自带监控程序jvisualvm的使用
监控小程序的配置 生产环境tomcat的配置 编辑应用所在的tomcat服务器下的bin目录下的catalina.sh文件,修改如下: 配置如下内容: export JAVA_OPTS="- ...
- C# 原子操作理解
C#内置提供的原子操作 Interlocked.Increment:以原子操作的形式递增指定变量的值并存储结果. Interlocked.Decrement:以原子操作的形式递减指定变量的值并存储结果 ...
- 三、ForkJoin分析
ForkJoin分析 一.ForkJoin ForkJoin是由JDK1.7后提供多线并发处理框架.ForkJoin的框架的基本思想是分而治之.什么是分而治之?分而治之就是将一个复杂的计算,按照设 ...
- Tomcat put上传漏洞_CVE2017-12615( JSP Upload Bypass/Remote Code Execution)
CVE2017-12615漏洞复现( tomcat JSP Upload Bypass /Remote Code Execution) 一.漏洞原理 在windows服务器下,将readonly参数设 ...
- C# 下载泛型数据
public class ExportTByNPOI { [STAThread] public static void ExportTDataByNPOI<T>(List<T> ...
- OfType<string>()
object[] vals = { 1, "Hello", true, "World", 9.1 }; IEnumerable<double> ju ...
- C# 流介绍 (原发布 csdn 2017-09-15 23:37:52)
1.FileStream FileStream 详细介绍参考msdn 写数据: using (FileStream fs = new FileStream("File.FileStream& ...
- C# 改变控制台背景颜色
之前查找静态构造函数相关的问题无意间碰到的一个问题.改变控制台的背景颜色. static void Main(string[] args) { //设置绿色 Console.BackgroundCol ...