模拟情景:

  对象:学生,课程

  关系:一个学生可选多个课程,一门课程可被多个学生选择

一、保存

1.创建数据库表,student,course,student_course,其中student_course用来关联学生表与课程表注意在设计表的字段时,字段名不要相同,尤其是主键的字段名不要相同,不然在查询的时候使用collection集合只出现一条结果。student_course表中的s_id,c_id作为外键关联到student,course表的主键

DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`cid` int(8) NOT NULL AUTO_INCREMENT,
`cnumber` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`cname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(8) NOT NULL AUTO_INCREMENT,
`name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; DROP TABLE IF EXISTS `student_course`;
CREATE TABLE `student_course` (
`sc_id` int(8) NOT NULL AUTO_INCREMENT,
`s_id` int(8) NOT NULL,
`c_id` int(8) NOT NULL,
PRIMARY KEY (`sc_id`),
KEY `10001` (`s_id`),
KEY `10002` (`c_id`),
CONSTRAINT `10002` FOREIGN KEY (`c_id`) REFERENCES `course` (`cid`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `10001` FOREIGN KEY (`s_id`) REFERENCES `student` (`sid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

2.创建实体对象

public class Student {
private int id;
private String name;
private List<Course> course ;//所选课程
//...省略get、set方法
} public class Course {
private int cid;
private String cnumber;
private String cname; private List<Student> student ;//选择该课程的学生
//...省略get、set方法 }

3.编写接口方法

public interface IStudentDao {
public Student getById(int id);
public void saveSelectCourse(@Param("student") Student s,@Param("course") Course c);
public Student getStudentCourse(int id);
}

4.编写sql映射文件student.xml

<mapper namespace="com.mybaits.dao.IStudentDao">
<select id="getById" parameterType="int" resultType="Student">
            select * from student where id=#{id}
        </select>
<insert id="saveSelectCourse" >
insert into student_course(sid,cid) values(#{student.id} ,#{course.id})
</insert> </mapper>

5.在主配置文件中添加mapper,编写测试类

public class StudentTest {
private SqlSessionTemplate sqlSessionTemplate; @Before
public void init(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring.xml"); sqlSessionTemplate=(SqlSessionTemplate) ctx.getBean("sqlSessionTemplate");
}
@Test
public void test(){
IStudentDao student=sqlSessionTemplate.getMapper(IStudentDao.class);
Student s=student.getById(1);
ICourseDao course=sqlSessionTemplate.getMapper(ICourseDao.class);
Course c=course.getById(1);
student.saveSelectCourse(s, c);
System.out.println("save succeed!");
}
}

。。。。。。。。。。。。。运行结束。。。。。。。。。。。

二、查询

1.根据学生id查询学生信息,以及其选课信息,(通过id查询课程信息以及选择该课程的学生信息,两者的方法基本相同)接口方法已在上文保存中给出public Student getStudentCourse(int id);

2.sql映射文件语句

        <resultMap type="com.mybaits.bean.Course" id="courseResult">
<id property="cid" column="cid"/>
<result property="cnumber" column="cnumber"/>
<result property="cname" column="cname"/>
</resultMap>
<resultMap type="com.mybaits.bean.Student" id="studentResult" >
<id property="id" column="sid"/>
<result property="name" column="name"/>
        //使用collection元素来映射course集合,在collection中再嵌套resultMap,将集合中的元素映射成course对象
<collection property="course" ofType="com.mybaits.bean.Course" resultMap="courseResult">
</collection>
</resultMap>
<select id="getStudentCourse" parameterType="int" resultMap="studentResult">
select s.*,c.* from student s left join student_course sc on s.sid=sc.s_id left join course c on c.cid=sc.c_id where s.sid=#{id}
</select>

3.编写测试类

@Test
public void test2(){
IStudentDao student=sqlSessionTemplate.getMapper(IStudentDao.class);
Student s=student.getStudentCourse(1);
System.out.println("学生姓名:"+s.getName()+"\n选择课程:");
for(Course c:s.getCourse()){
System.out.println("课程编号:"+c.getCnumber()+"\t课程名称:"+c.getCname());
} }

运行结果:

  学生姓名:mike
  选择课程:
  课程编号:s001    课程名称:JAVA
  课程编号:s002    课程名称:C Language

MyBatis对象关联关系----多对多的保存与查询的更多相关文章

  1. MyBatis对象关联关系---- association与collection

    Mybatis处理“一对多”的关系时,需要用到associasion元素.处理”多对一“用collection元素来实现(这两个元素在之前mapper文件中提到过). 本例子中,假设一名User可以有 ...

  2. MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载

    一.myBatis对象关系映射(多对一关系.一对多关系) 1.多对一关系: ---例子:多个员工同属于一个部门. (1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部 ...

  3. mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条

    mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条

  4. mybatis之关联关系

    前言:在我们之前的hibernate中我们是学过了关联关系的,所以我们在本章给讲一讲mybatis的关联关系. mybatis的关联关系一对多的测试1.通过逆向工程生成Hbook,HbookCateg ...

  5. mybatis一对一关联关系映射

    mybatis一对一关联关系映射 在关联关系中,有一对一,一对多,多对多三种关联关系. 一对一关系:在操作上,任意一方引入对方的主键作为外键. 一对多关系:在"多"的一方添加&qu ...

  6. Django QuerySet 方法梳理 。model外键 多对多的保存

    引用:https://feifeiyum.github.io/2017/03/28/python-django-queryset/ 说明 Models 层是 Django 框架中最强大的部分之一, 大 ...

  7. Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...

  8. C#开发中使用配置文件对象简化配置的本地保存

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  9. 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

    old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...

随机推荐

  1. Windows 10 下如何彻底关闭 Hyper-V 服务(翻外篇)

    原文:Windows 10 下如何彻底关闭 Hyper-V 服务(翻外篇) windows禁用/启用hyper-V,解决hyper-V与模拟器同时启用时造成冲突 我是这样解决的,以管理员身份运行命令提 ...

  2. 创龙DSP6748的DAC例程研究

    1. 创龙DSP6748开发板驱动TL5724这个DAC,输出指定的电压值,此程序是使用 IO 口模拟 SPI 实现与 TL5724 模块的数据交互. 2. 首先是初始化PSC函数 void PSCI ...

  3. 活动的生命周期 Android

    1.运行程序 onCreate().onStart()和 onResume() 2.跳转到非弹框视图控制器 onPause()和 onStop() 返回上一个视图控制器(没被回收) onRestart ...

  4. 『JavaScript』new关键字

    原文 new关键字做了什么 在JavaScript中,使用new关键字后,意味着做了如下四件事情: 创建一个新的对象,这个对象的类型是object: 设置这个新的对象的内部.可访问性和[[protot ...

  5. JAVA虚拟机(一):内存区域

    根据<java虚拟机规范第二版>规定,现阶段的java内存区域总体如下图 其中,方法区和堆是所有线程共享区域. 虚拟机栈,本地方法栈,程序计数器是各线程独占. 概述一下各个区域 先说说线程 ...

  6. Markdown常用的几种语法

    在VScode上面写的,现将代码粘贴如下:(在VScode里运行下即可) # Markdown语法 # Ctrl + k v 打开侧边预览 ## 一.加粗斜体删除线 **这是要加粗的文字** *这是要 ...

  7. 数据挖掘算法:DBSCAN算法的C++实现

    (期末考试快到了,所以比较粗糙,请各位读者理解..) 一.    概念 DBSCAN是一种产生划分聚类的基于密度的聚类算法,簇的个数由算法自动地确定.低密度区域中的点被视为噪声而忽略,因此DBSCAN ...

  8. maven环境变的配置(复制自己看)

    Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的缺省构建 ...

  9. python 注册表重置ie代理 ss使用后的代理恢复

    每次用完ss客户端,浏览器代理都不会改回来,不想手动改,只能用python脚本处理了. import winreg def disableProxy(): proxy = "" x ...

  10. 详解python 局部变量与全局变量

    本文将详细分析python的全局变量与局部变量,学过php的人都知道,php里面的全局变量是无法在function里面去使用的,只有超全局变量才可以,那么python会怎么处理全局变量与局部变量呢?下 ...