• Mybatis框架学习总结-表的关联查询


    一对一关联

    创建表和数据:创建一张教师表和班级表,这里假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系。

    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 VARCHAR(20), 
        teacher_id INT
    );
    ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);    
    
    INSERT INTO teacher(t_name) VALUES('teacher1');
    INSERT INTO teacher(t_name) VALUES('teacher2');
    
    INSERT INTO class(c_name, teacher_id) VALUES('class_a', 1);
    INSERT INTO class(c_name, teacher_id) VALUES('class_b', 2);

    定义实体类:

    1.Teacher类,Teacher类时teacher表对应的实体类。

    package com.fpc.Entity;
    
    public class Teacher {
        private int t_id;
        private String t_name;
        public int getT_id() {
            return t_id;
        }
        public void setT_id(int t_id) {
            this.t_id = t_id;
        }
        public String getT_name() {
            return t_name;
        }
        public void setT_name(String t_name) {
            this.t_name = t_name;
        }
        
        @Override
        public String toString() {
            return "Teacher [t_id:" + t_id + ", t_name:" + t_name + "]";
        }
    }

    2.Classes类,Classes类是class表对应的实体类

    package com.fpc.Entity;
    
    public class Classes {
        private int c_id;
        private String c_name;
        
        private Teacher teacher;
        public int getC_id() {
            return c_id;
        }
        public void setC_id(int c_id) {
            this.c_id = c_id;
        }
        public String getC_name() {
            return c_name;
        }
        public void setC_name(String c_name) {
            this.c_name = c_name;
        }
        
        
        public Teacher getTeacher() {
            return teacher;
        }
        public void setTeacher(Teacher teacher) {
            this.teacher = teacher;
        }
        @Override
        public String toString() {
            return "Class [t_id:" + c_id + ", t_name:" + c_name + ",teacher:"+ teacher + "]";
        }
    }

    3.定义sql映射文件classMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.fpc.Mapping.classMapper">
        
       <resultMap type="com.fpc.Entity.Classes" id="ClassResultMap">
           <id property="c_id" column="t_id"/>
           <id property="c_name" column="c_name"/>
            <association property="teacher" column="teacher_id" javaType="com.fpc.Entity.Teacher">
                <id property="t_id" column="t_id"/>
                <id property="t_name" column="t_name"/>
            </association>
       </resultMap>
       
       <select id="getClass" resultMap="ClassResultMap">
            select * from class c ,teacher t where c_id=#{id} and c.teacher_id=t.t_id
        </select>
    </mapper>

    在conf.xm文件中注册classMapper.xml文件:

     <mapper resource="com/fpc/Mapping/classMapper.xml"/>

    4.编写单元测试代码

    String statement1 = "com.fpc.Mapping.classMapper.getClass";
    Classes class1 = session.selectOne(statement1,2);
    System.out.println(class1);

    运行结果:

    MyBatis一对一关联查询总结

    MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:

    • property:对象属性的名称
    • javaType:对象属性的类型
    • column:所对应的外键字段名称
    • select:使用另一个查询封装的结果

    一对多关联

    根据classId查询对应的班级信息,包括学生,老师

    1.创建表和数据:基于上面一对一关联查询演示中,已经创建了班级表和教师表,因此这里只要再创建一张学生表就可以了:

    CREATE TABLE student(
     s_id INT PRIMARY KEY AUTO_INCREMENT,
     s_name VARCHAR(20),
     class_id INT
    );
    INSERT INTO student(s_name,class_id) VALUES("student_a",1);
    INSERT INTO student(s_name,class_id) VALUES("student_b",1);
    INSERT INTO student(s_name,class_id) VALUES("student_c",2);
    INSERT INTO student(s_name,class_id) VALUES("student_d",2);

    创建的结果:

    2.定义实体类Student:

    package com.fpc.Entity;
    
    public class Student {
        //定义属性,和student表中的字段对应
        private int id; //id ===> s_id;
        private String name; // name ===> s_name
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        @Override
        public String toString() {
            return "Student [id=" + id + " , name= " + name + "]"; 
        }
    }

    2.修改Classes类,添加一个List<Student>属性,使用一个List<Student>集合属性表示班级拥有的学生,如下:

    package com.fpc.Entity;
    import java.util.List;
    
    public class Classes {
        private int c_id;
        private String c_name;
        
        private Teacher teacher;
        
        private List<Student> students;
        public int getC_id() {
            return c_id;
        }
        public void setC_id(int c_id) {
            this.c_id = c_id;
        }
        public String getC_name() {
            return c_name;
        }
        public void setC_name(String c_name) {
            this.c_name = c_name;
        }
        
        
        public Teacher getTeacher() {
            return teacher;
        }
        public void setTeacher(Teacher teacher) {
            this.teacher = teacher;
        }
        
        
        
        public List<Student> getStudents() {
            return students;
        }
        public void setStudents(List<Student> students) {
            this.students = students;
        }
        @Override
        public String toString() {
            return "Class [t_id:" + c_id + ", t_name:" + c_name + ",teacher:"+ teacher + ", students = " + students +"]";
        }
    }

    3.修改sql映射文件classMapper.xml

    添加如下的SQL映射信息:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.fpc.Mapping.classMapper">
        
       <resultMap type="com.fpc.Entity.Classes" id="ClassResultMap">
           <id property="c_id" column="t_id"/>
           <id property="c_name" column="c_name"/>
            <association property="teacher" column="teacher_id" javaType="com.fpc.Entity.Teacher">
                <id property="t_id" column="t_id"/>
                <id property="t_name" column="t_name"/>
            </association>
            
            <!-- ofType指定students集合中的对象类型 -->
            <collection property="students" ofType="com.fpc.Entity.Student">
                <id property="id" column="s_id"/>
                <id property="name" column="s_name"/>
            </collection>
       </resultMap>
       
       <select id="getClass" resultMap="ClassResultMap">
            select * from class c ,teacher t ,student s where c_id=#{id} and c.teacher_id=t.t_id and s.class_id=c.c_id 
        </select>
    </mapper>

    4.编写单元测试代码:

    String resource = "conf.xml";
            
    //        InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
            Reader reader = Resources.getResourceAsReader(resource);
            SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
            String statement = "com.fpc.Mapping.userMapper.getUser";
            SqlSession session = sessionFactory.openSession();
            
            String statement1 = "com.fpc.Mapping.classMapper.getClass";
            Classes class1 = session.selectOne(statement1,1);
            System.out.println(class1);

    运行结果:

    MyBatis一对多关联查询总结

    Mybatis中使用collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型

  • 相关阅读:
    ActiveMQ消息队列的使用及应用
    kafka使用场景
    何时使用MQ ?
    activemq、rabbitmq、kafka原理和比较
    JAVA消息 AMQP
    JAVA消息 JMS 很重要
    ubuntu下如何安装linaro工具链?
    linux下如何将dts转换成dtb?
    linux设备树中如何删除某个节点?
    如何在uboot下列出使用的设备树信息?
  • 原文地址:https://www.cnblogs.com/fangpengchengbupter/p/7839959.html
Copyright © 2020-2023  润新知