05_一对一关联表查询:有二种方式

1 需求

  • 一个老师对应一个班级
  • 一个班级只有一个老师
  • 根据班级id查询班级信息,这个班级信息中有老师的信息

2 创建表和数据

  1. CREATE TABLE teacher(
  2. t_id INT PRIMARY KEY AUTO_INCREMENT,
  3. t_name VARCHAR(20)
  4. );
  5. CREATE TABLE class(
  6. c_id INT PRIMARY KEY AUTO_INCREMENT,
  7. c_name VARCHAR(20),
  8. teacher_id INT
  9. );
  10. //在班级表中加一个外键,指向老师表的主键
  11. ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);
  12. INSERT INTO teacher(t_name) VALUES('LS1');
  13. INSERT INTO teacher(t_name) VALUES('LS2');
  14. INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);
  15. INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);

3 定义实体类

3.1 Teacher

  1. public class Teacher {
  2. private int id;
  3. private String name;
  4. }

3.2 Classes

  1. public class Classes {
  2. private int id;
  3. private String name;
  4. private Teacher teacher;
  5. }

4 定义映射文件 classMapper.xml

4.1方式一:嵌套结果,使用嵌套结果映射来处理重复的联合结果的子集, 封装联表查询的数据(去除重复的数据)

  • xml
  1. <!-- 方式一:嵌套结果 -->
  2. <resultMap type="Classes" id="ClassResultMap">
  3. <id property="id" column="c_id"/>
  4. <result property="name" column="c_name"/>
  5. <association property="teacher" javaType="Teacher">
  6. <id property="id" column="t_id"/>
  7. <result property="name" column="t_name"/>
  8. </association>
  9. </resultMap>
  10. <select id="getClass" parameterType="int" resultMap="ClassResultMap">
  11. select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
  12. </select>
  • 测试
  1. @Test
  2. public void test1(){
  3. SqlSessionFactory factory = MybatisUtils.getFactory();
  4. SqlSession session = factory.openSession();
  5. String statement = "cn.imentors.mybatis.test5.classMapper.getClass";
  6. Classes c = session.selectOne(statement , 2);
  7. System.out.println(c);
  8. session.close();
  9. }

4.2 方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型

  • xml
  1. <!-- 方式:嵌套查询:本质是二次查询 -->
  2. <select id="getClass2" parameterType="int" resultMap="ClassResultMap2">
  3. select * from class where c_id=#{id}
  4. </select>
  5. <resultMap type="Classes" id="ClassResultMap2">
  6. <id property="id" column="c_id"/>
  7. <result property="name" column="c_name"/>
  8. <!-- column:是classes表中外键字段 -->
  9. <association property="teacher" column="teacher_id" select="getTeacher">
  10. </association>
  11. </resultMap>
  12. <select id="getTeacher" parameterType="int" resultType="Teacher">
  13. SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
  14. </select>
测试
  1. @Test
  2. public void test2(){
  3. SqlSessionFactory factory = MybatisUtils.getFactory();
  4. SqlSession session = factory.openSession();
  5. String statement = "cn.imentors.mybatis.test5.classMapper.getClass2";
  6. Classes c = session.selectOne(statement , 2);
  7. System.out.println(c);
  8. session.close();
  9. }

5 属性值说明

  • association:用于一对一的关联查询
  • property:对象属性名称
  • javaType:对象属性的类型
  • column:表的字段名称
  • select:使用另一个查询封闭的结果
捐赠我们
    良师益友工作室一直在致力于帮助编程爱好更加快速方便地学习编程,如果您对我们的成果表示认同并且觉得对你有所帮助,欢迎您对我们捐赠^_^。
    
原文地址:https://www.cnblogs.com/imentors/p/4809622.html