Mybatis多对一查询

Mybatis多对一的查询主要有两种 第一种是查询嵌套处理,另一种是按照结果嵌套处理 如今一般第二种较为主流

首先创建两个表,以教师表和学生表为例

--教师表
create table teacher(
    id int(15) primary key default null,
    name varchar(30) default null
    )ENGINE=INNODB DEFAULT CHARSET=UTF8;
    
insert into teacher (id,name) values (1,‘刘老师’);
--学生表
create table student(
    id int(15) primary key default null,
    name varchar(30) default null,
    tid int(10) default null,
    key teacher_id (tid),
    constraint teacher_id foreign key(tid) references teacher (id)
)ENGINE=INNODB 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);
INSERT INTO STUDENT (id,name,tid) values (5,‘小王',1);

我们在数据库中使用的语句是

select * from student s,teacher t where s.tid=t.id;

接下来使用嵌套处理——

查询嵌套处理

学生实体类

package com.mos3y.enity;

public class Student {
    private int id;
    private String name;

 //getter setter 无参构造 toString方法

教师实体类

public class Teacher {
    private int id;
    private String name;
    //getter setter 无参构造 toString方法
}

注意:框架主要是通过反射来获取对象,主要通过以下代码,所以必须声明无参构造,否则就会报错

Class class1 = Class.forName(className);
Object o1 = class1.newInstance();//调用无参构造方法生成对象

接下来设计接口,通过一个集合来获取学生的所有信息及对应的教师

public interface StudentMapper {
    List<Student> getStudent();
}

编写配置文件

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mos3y.Mapper.StudentMapper">
    <select id="getStudent" resultMap="studentTeacher">
        select * from student;
    </select>
    <resultMap id="studentTeacher" type="student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="Teacher">
        select * from teacher where id=#{tid}
    </select>
</mapper>

首先创建对应接口的查询 查询学生的所有信息,因为返回值的学生对应一个教师对象 所以这里使用resultMap结果集映射

在resultMap中设置Student实体类对应的属性类型 因为多个学生关联一个老师,老师对象就是用association来表示,column是对应教师的tid 来传给下一个查询,通过声明

select="getTeacher"来引用下一个查询

以上主要通过结果集映射来解决

  • 根据查询所有的学生信息

  • 根据查询出来学生的teacherId,寻找对应的老师

对于结果集映射 对于普通字段可以通过使用result来解决

 

但是对于复杂的属性,就需要单独处理 对象使用 association 集合使用connection

property来表示实体类中的对象,clumn表示数据库中的字段,javaType是表示这个字段的java类型,然后通过查询来获取对象的信息

原文地址:https://www.cnblogs.com/mos3y/p/12514139.html