О многотабличном запросе Spring (многие к одному, один ко многим)

多对一:
多个学生对应一个老师
对于学生这边而言:(关联)多个学生关联一个老师【多对一】


建表:CREATE DATABASE mybatis;
use mybatis;
CREATE TABLE teacher(
	id int(10) not null,
	name VARCHAR(30) DEFAULT NULL,
	PRIMARY KEY(id)
)DEFAULT CHARSET=utf8

INSERT INTO teacher(id ,name) VALUES(1,"小鑫老师");

CREATE TABLE student(
	id int(10) not null,
	name VARCHAR(30) DEFAULT NULL,
	tid int(10) DEFAULT null,
	PRIMARY KEY(id),
	KEY fktid (tid),
	CONSTRAINT fktid FOREIGN KEY (tid)	REFERENCES teacher (id)
)DEFAULT CHARSET=utf8

INSERT INTO student(id ,name,tid) VALUES(1,"小顾",1);
INSERT INTO student(id ,name,tid) VALUES(2,"小鑫",1);
INSERT INTO student(id ,name,tid) VALUES(3,"小孟",1);
INSERT INTO student(id ,name,tid) VALUES(4,"小董",1);

步骤:
1.导入lombok
2.新建实体类Teacher,Student
3.建立Mapper接口
4.建立Mapper.xml文件
5.在核心配置文件中绑定注册Mapper的接口或者文件
6.测试查询是否成功

第一种:按照查询结果嵌套处理

<!--    思路:
            1.先查出全体学生
            2.根据查询出来的学生的tid寻找对应的老师(类似于子查询)
            -->
public List<Student> getstudent();
Teacher getTeacher(@Param("tid") int id);

    <select id="getstudent" resultMap="StudentTeacher">
        select * from mybatis.student ;
    </select>
    <resultMap id="StudentTeacher" type="student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
<!--        复杂的属性需要单独处理
            对象:association
            集合:collection
-->
        <association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
    </resultMap>

    <select id="getTeacher" resultType="teacher">
        select *from mybatis.teacher where id=#{id}
    </select>
</mapper>


@Test
    public void testStudent(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList = mapper.getstudent();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();
    }
第二种:按照结果嵌套处理
public List<Student> getstudent1();
Teacher getTeacher1(@Param("tid") int id);

    <select id="getstudent1" resultMap="StudentTeacher1">
        select s.id sid, s.name sname, t.id tid,t.name tname
        from mybatis.student s,
             mybatis.teacher t
        where s.tid = t.id;
    </select>
    <resultMap id="StudentTeacher1" type="student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
        </association>
    </resultMap>

@Test
    public void testStudent1(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList = mapper.getstudent1();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();
    }


一对多
      一个老师拥有多个学生
      对于老师而言:(集合)一个老师,有很多个学生【一对多】
第一种:
<!--按照结果嵌套查询-->
private List<Student> students;


Teacher getteacher(@Param("tid") int id);

 <select id="getteacher" resultMap="TeacherStudent">
        select s.id sid, s.name sname, t.id tid, t.name tname
        from mybatis.student s,
             mybatis.teacher t
        where s.tid = t.id and t.id = #{tid};
    </select>
    <resultMap id="TeacherStudent" type="teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
<!--        集合用collection
            javaType="" 指定属性的类型
            ofType用来映射到List(或制定集合中)的泛型(pojo)信息
    -->
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="id" column="tid"/>
        </collection>
    </resultMap>

@Test
    public void test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher getteacher = mapper.getteacher(1);
        System.out.println(getteacher);
        sqlSession.close();
    }

第二种:子查询(没有教师tid,建议第一种)
Teacher getteacher2(@Param("tid") int id);
<select id="getteacher2" resultMap="TeacherStudent2">
        select *from mybatis.teacher where id = #{tid};
    </select>
    <resultMap id="TeacherStudent2" type="teacher">
       <collection property="students" javaType="ArrayList" ofType="student" select="getStudentByTeacherId" column="id"/>
    </resultMap>
    
    <select id="getStudentByTeacherId" resultType="student">
        select *from mybatis.student where tid = #{tid}
    </select>

 	@Test
    public void test1(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher getteacher = mapper.getteacher2(1);
        System.out.println(getteacher);
        sqlSession.close();
    }

Supongo que te gusta

Origin blog.csdn.net/m0_74135466/article/details/127991169
Recomendado
Clasificación