模拟情景:

  对象:学生,课程

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

一、保存

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. 第5模块闯关Bootstrap

    “行(row)”必须包含在 .container (固定宽度)或 .container-fluid (100% 宽度)中,以便为其赋予合适的排列(aligment)和内补(padding). 通过“行 ...

  2. Excel拼接字符串

             有时候,需要把一些Excel表格中的内容进行拼接,比如A4行的值是前面三行值的加起来.在Excel中可以使用&来进行这种操作.如果数据非常多,就可以使用这个来进行批量操作.

  3. 关于C#数据类型自己的理解

    电脑CUP处理程序的运行.cpu里分为一级缓存,二级缓存,还有三级缓存,之后是内存里的东西. 栈存放在一级缓存里,所以cup调用速度最快,处理起来也效率也最高,但是大小很小,能存放的东西很少. 堆存放 ...

  4. 「日常训练」 不容易系列之(3)—— LELE的RPG难题 (HDU 2045)

    题目简述 有排成一行的n" role="presentation">nn个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何 ...

  5. Qt 飞机仪表显示

    使用Qt简单谢了一个飞机的一小部分仪表,还没有写完,目前只写了一个界面,不过思想应该是一样的. 效果图如下 其中主要由转速表,和下面的部分数字显示构成 转速表代码 .h文件 #ifndef CONTR ...

  6. ubuntu安装显卡驱动和cuda

    NVIDIA-linux.run安装后,会出现登录页面循环,解决办法是在运行命令后加入-no-opengl-files 打开nvidia x server Settings软件,显示:You do n ...

  7. Spark实战练习01--XML数据处理

    一.要求 将XML中的account_number.model数据提取出来,并以account_number:model格式存储 1.XML文件数据格式 <activations> < ...

  8. Java 中的异常和处理详解(转载)

    原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函 ...

  9. 《Effective STL》学习笔记

    http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...

  10. qemu的device参数解释 包括socket的一些知识

    前面一片是driver,是把这个新的设备“插入到虚机中”,device 是准备驱动了.device 都是和设备配合使用的.要怎么去驱动一个设备,包括使用的驱动函数是啥,device后面的函数根据驱动的 ...