MyBatis学习笔记(五)一对多关系

有了之前的student表,address表后,再加上一张表,grade年级表,一个年级对应多个学生,在查询grade表的时候,一并查询学生表.

一条grade数据对就多条学生数据,一对多关系.

一.首先完成从grade----> student的单向联结.

1.建表mybatis_grade.

[html] view plain copy

  1. package com.skymr.mybatis.model;
  2. import java.util.List;
  3. public class Grade {
  4. private int id;
  5. private String gradeName;
  6. private List<Student> students;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getGradeName() {
  14. return gradeName;
  15. }
  16. public void setGradeName(String gradeName) {
  17. this.gradeName = gradeName;
  18. }
  19. public List<Student> getStudents() {
  20. return students;
  21. }
  22. public void setStudents(List<Student> students) {
  23. this.students = students;
  24. }
  25. public String toString(){
  26. return "["+id+","+gradeName+","+students+"]";
  27. }
  28. }

2.GradeMapper接口

[html] view plain copy

  1. package com.skymr.mybatis.mappers;
  2. import com.skymr.mybatis.model.Grade;
  3. public interface GradeMapper {
  4. public Grade getGrade(int id);
  5. }

3.GradeMapper.xml映射

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.skymr.mybatis.mappers.GradeMapper">
  4. <select id="getGrade" resultMap="gradeMap" parameterType="int">
  5. select * from mybatis_grade where id=#{id}
  6. </select>
  7. <resultMap type="Grade" id="gradeMap">
  8. <id property="id" column="id"/>
  9. <result property="gradeName" column="grade_name"/>
  10. <!-- 根据id查询student getStudentsByGradeId -->
  11. <!-- column传入grade主键 -->
  12. <collection property="students" column="id" select="com.skymr.mybatis.mappers.StudentMapper.getStudentsByGradeId"></collection>
  13. </resultMap>
  14. </mapper>

4.为StudentMapper添加getStudentsByGradeId方法

[html] view plain copy

  1. public List<Student> getStudentsByGradeId(int gradeId);

[html] view plain copy

  1. <select id="getStudentsByGradeId" resultMap="stuMapWithAddr" parameterType="int">
  2. select * from mybatis_Student where grade_id=#{gradeId}
  3. </select>

[html] view plain copy

  1. <resultMap type="Student" id="stuMapWithAddr">
  2. <id property="id" column="id"/>
  3. <result property="name" column="name"/>
  4. <result property="age" column="age"/>
  5. <association property="address" column="address_id" select="com.skymr.mybatis.mappers.AddressMapper.getAddress">
  6. </association>
  7. </resultMap>

5.测试.

[html] view plain copy

  1. package com.skymr.mybatis.service;
  2. import org.apache.ibatis.session.SqlSession;
  3. import org.junit.After;
  4. import org.junit.Before;
  5. import org.junit.Test;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import com.skymr.mybatis.mappers.GradeMapper;
  9. import com.skymr.mybatis.model.Grade;
  10. import com.skymr.mybatis.util.MybatisUtil;
  11. public class GradeTest {
  12. private Logger logger = LoggerFactory.getLogger(GradeTest.class);
  13. private SqlSession session;
  14. @Before
  15. public void beforeTest(){
  16. session = MybatisUtil.openSession();
  17. }
  18. @After
  19. public void afterTest(){
  20. session.close();
  21. }
  22. @Test
  23. public void testGetGrade(){
  24. logger.info("测试取得年级(带学生)");
  25. GradeMapper mapper = session.getMapper(GradeMapper.class);
  26. Grade grade = mapper.getGrade(1);
  27. logger.info(grade.toString());
  28. }
  29. }

二.再完成student--> Grade的单向连接.

这就和上一节学习的差不多了,

1.Student类中加入Grade属性

[html] view plain copy

  1. private Grade grade;
  2. public Grade getGrade() {
  3. return grade;
  4. }
  5. public void setGrade(Grade grade) {
  6. this.grade = grade;
  7. }

2.StudentMapper.xml修改

[html] view plain copy

  1. <resultMap type="Student" id="stuMapWithAddr">
  2. <id property="id" column="id"/>
  3. <result property="name" column="name"/>
  4. <result property="age" column="age"/>
  5. <association property="address" column="address_id" select="com.skymr.mybatis.mappers.AddressMapper.getAddress">
  6. </association>
  7. <association property="grade" column="grade_id" select="com.skymr.mybatis.mappers.GradeMapper.getGrade"></association>
  8. </resultMap>

3.测试

[html] view plain copy

  1. @Test
  2. public void testGetStudent(){
  3. logger.info("测试取得学生(带地址)");
  4. StudentMapper mapper = session.getMapper(StudentMapper.class);
  5. Student stu= mapper.getStudentWithAddr(1);
  6. logger.info(stu.toString());

ps:student与Grade类的toString 方法要注意,千万不要循环打印了.

想到了一个问题,Student中包含了Grade,Grade又包含了Student,数据库中会不会循环查询呢?

进行验证吧,

(1)把Student类,Grade类的toString 方法去掉

(2)修改测试方法

[html] view plain copy

  1. @Test
  2. public void testGetStudent(){
  3. logger.info("测试取得学生(带地址)");
  4. StudentMapper mapper = session.getMapper(StudentMapper.class);
  5. Student stu= mapper.getStudentWithAddr(1);
  6. logger.info(stu.toString());
  7. logger.info(stu.getGrade().toString());
  8. logger.info(stu.getGrade().getStudents().toString());
  9. logger.info(stu.getGrade().getStudents().get(0).getGrade().toString());
  10. logger.info(stu.getGrade().getStudents().get(0).getGrade().getStudents().toString());
  11. }

打印结果

[html] view plain copy

  1. 2015-08-31 12:01:26 564 ->[main]--[INFO ]--[StudentTest3]--测试取得学生(带地址)
  2. 2015-08-31 12:01:27 067 ->[main]--[INFO ]--[StudentTest3][email protected]
  3. 2015-08-31 12:01:27 067 ->[main]--[INFO ]--[StudentTest3][email protected]
  4. 2015-08-31 12:01:27 067 ->[main]--[INFO ]--[StudentTest3]--[[email protected]]
  5. 2015-08-31 12:01:27 067 ->[main]--[INFO ]--[StudentTest3][email protected]
  6. 2015-08-31 12:01:27 067 ->[main]--[INFO ]--[StudentTest3]--[[email protected]]

结果表明,第一行Student实例与第三行实例不等,之后的实例就相互指引了,数据库中没有循环查询.

数据库中查询了3次:

第1次查询student表,

第2次查询Gradent表,

第3次再查询Student表,其实这次是多余的,可以经过配置去掉.

总结:一对多关系与一对一相似,主要的差别是association与connection, association是外键关联主键,一对一,connection是主键关联外键,一对多

时间: 2024-10-11 00:10:25

MyBatis学习笔记(五)一对多关系的相关文章

mybatis学习笔记(11)-一对多查询

mybatis学习笔记(11)-一对多查询 mybatis学习笔记11-一对多查询 示例 小结 本文实现一对多查询,查询订单及订单明细的信息 示例 sql 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders.*, user.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.item

MyBatis学习笔记五——实现关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VA

Hibernate学习笔记(五) — 多对多关系映射

多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多修改关系相当于在第三张表中先删除后增加 多对多谁维护效率都一样.看需求 在实际开发过程中,多对多的映射关系比较常见. 学生选课示例,一个学生可以选多门课,一门课也可以由多个学生去选,这样就形成了多对多的映射关系 public class Student implements Serializable { private static final long serialVersionU

springmvc+mybatis学习笔记(汇总)

springmvc+mybatis学习笔记(汇总) 标签 : springmvc mybaits springmvcmybatis学习笔记汇总 目录 联系作者 笔记分为两大部分:mybatis和springmvc mybatis springmvc 笔记内容主要是mybatis和springmvc的一些基本概念和使用方法,涉及概念介绍.环境搭建.编程细节.运行调试等方面. 这套笔记整体偏入门和应用,适合快速上手,对底层实现和机理并未做过多分析.我后续会研读spring源码,并把学习的收获写成博客

mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文件复制到src/main/webapp下,删掉WebContent 5.修改Deployment Assembly 6.测试 二.mybatis访问mysql 1.数据库准备 2.修改pom.xml 3.创建实体类 4.创建访问接口 5.添加映射文件 6.添加MyBatisCfg.xml配置文件,注

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

MyBatis MapperScannerConfigurer配置――MyBatis学习笔记之八

MyBatis MapperScannerConfigurer配置——MyBatis学习笔记之八 2012-09-02 20:01:42 标签:Spring MyBatis MapperScannerConfigurer bean默认命名 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://legend2011.blog.51cto.com/3018495/980150 在上一篇博文的示例中,我们在beans.xml中配置了stu

mybatis学习笔记(9)-订单商品数据模型分析

mybatis学习笔记(9)-订单商品数据模型分析 mybatis学习笔记9-订单商品数据模型分析 数据模型分析思路 数据模型分析 订单商品数据模型建表sql 本文对接下来几篇博客中用到的数据模型进行分析,并附上建表sql文件和测试数据文件 数据模型分析思路 每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当于你学习系统需求(功能)的过程. 每张表重要的字段设置 非空字段.外键字段 数据库级别表与表之间的关系 外键关系 表与表之间的业务关系 在分析表与表之间的业务关系时一定要建立在某个

mybatis学习笔记(11)-多对多查询

mybatis学习笔记(11)-多对多查询 mybatis学习笔记11-多对多查询 示例 多对多查询总结 resultMap总结 本文实现多对多查询,查询用户及用户购买商品信息. 示例 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:orders.orderdetail.items sql SELECT orders.*, user.username, user.sex, user.address, orderdetail.id orderdeta