• 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:使用另一个查询封闭的结果
    捐赠我们
        良师益友工作室一直在致力于帮助编程爱好更加快速方便地学习编程,如果您对我们的成果表示认同并且觉得对你有所帮助,欢迎您对我们捐赠^_^。
        
  • 相关阅读:
    学PHP应注意的问题与知识点
    php 的生命周期
    Pyhton中汉字的使用方法(转)
    院外培训:GIS数据处理与建模高级培训班学习心得体会 来自
    绕人的python汉字问题
    arcmap导出或者打印时插入的图片和对象绘制失败
    【百度地图API】如何获取行政区域的边界? (转)
    VS2010不能编译.Net3.5项目的解决方法(转)
    ArcGIS中Python汉字使用说明(转)
    ArcGIS10联网无法启动问题解决
  • 原文地址:https://www.cnblogs.com/imentors/p/4809622.html
Copyright © 2020-2023  润新知