myBatis处理一对多&多对一查询

本文介绍了如何使用MyBatis进行多对一和一对多的数据查询。在多对一查询中,展示了如何创建表结构、实体类、Mapper接口及XML配置,以查询所有学生及其对应的老师。而在一对多查询中,通过实例解释了如何获取老师和其所有学生的信息。文章详细解析了查询嵌套处理和结果嵌套处理的方法,提供了相应的SQL和XML配置。
摘要由CSDN通过智能技术生成

1、多对一处理
以老师学生为例:

多个学生对应一个老师
对应学生而言:多个学生关联一个老师【多对一】关联
对于老师而言:一个老师,有很多个学生【一对多】集合
对应的 S Q L SQL SQL

CREATE TABLE teacher (
id INT(10) NOT NULL,
name VARCHAr(30) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8

teacher

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)
) 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’);
以上表为例:查询所有学生的信息以及对应的老师

搭建环境
导入 l o m b l o k lomblok lomblok

<dependency>
    <groupid>org.projectlombok</groupid>
    <artifactid>lombok</artifactid>
    <version>1.18.24</version>
</dependency>
建立实体类

// 学生类
@Data@AllArgsConstructor@NoArgsConstructor
public class Student {
private int id;
private String name;
private Teacher teacher;
}
// 老师类
@Data@NoArgsConstructor@AllArgsConstructor
public class Teacher {
private int id;
private String name;

}
建立Mapper接口

public interface StudentMapper {
// 查询所有学生的信息,并且查询出对应的老师
public List getStudent();
}

建立 M a p p e r . x m l Mapper.xml Mapper.xml文件

在核心配置文件中绑定注册的 M a p p e r Mapper Mapper接口,或者绑定文件
<mappers>
    <mapper class="com.fl.dao.StudentMapper">
</mapper></mappers>

按照查询嵌套处理
接口

public List getStudent();

m a p p e r . x m l mapper.xml mapper.xml配置

<select id=“getStudent” resultmap=“StudentTeacher”>
select * from myBatis.student;
</select>

select * from myBatis.teacher where id = #{tid};

注意此处

    i
    
    
    d
    
    
     
     =
     
     
      
      ′
      
      
      ′
      
     
    
    
    g
    
    
    e
    
    
    t
    
    
    T
    
    
    e
    
    
    a
    
    
    c
    
    
    h
    
    
    e
    
    
     
     r
     
     
      
      ′
      
      
      ′
      
     
    
   
   
   id=''getTeacher''
   
  
id=′′getTeacher′′并不是调用
 
  
   
    
    T
    
    
    e
    
    
    a
    
    
    c
    
    
    h
    
    
    e
    
    
    r
    
    
    M
    
    
    a
    
    
    p
    
    
    p
    
    
    e
    
    
    r
    
   
   
   TeacherMapper
   
  
TeacherMapper接口中的
 
  
   
    
    g
    
    
    e
    
    
    t
    
    
    T
    
    
    e
    
    
    a
    
    
    c
    
    
    h
    
    
    e
    
    
    r
    
   
   
   getTeacher
   
  
getTeacher方法,而是取得id名,方便标签中select属性调用

标签:数据库对应的实体类中的属性是一个类时,使用标签,
property属性和colum属性的用法与相同,
javaType属性指定实体类中属性的类型
select属性为调用另一个查询的结果
这种方式相当于SQL中的子查询,将需要的结果,放在另一个select中查询
按照结果嵌套处理
对应的 m a p p e r . x m l mapper.xml mapper.xml文件为

<select id="getStudent2" resultmap="StudentTeacher2">
    select s.id sid, s.name sname, t.name tname
    from myBatis.student s, myBatis.teacher t
    where s.tid=t.id

2、一对多查询
环境搭建
与多对一类似,唯一的区别就是实体类不同
// 学生类
@Data@AllArgsConstructor@NoArgsConstructor
public class Student {
private int id;
private String name;
private int tid;
}

// 老师类
@Data@NoArgsConstructor@AllArgsConstructor
public class Teacher {
private int id;
private String name;
// 一个老师有多个学生
private List students;
}

以/通过

     t
     
     
     i
     
     
     d
     
    
    
    tid
    
   
 tid获取老师和学生对应的所有的学生为例

按查询嵌套处理
对应的配置为

select *
from myBatis.teacher
where id = #{tid}

select * from myBatis.student where tid = #{id}

标签:数据库对应的实体类中的属性是一个集合时,使用标签,
property属性和colum属性的用法与相同,
javaType属性指定实体类中属性的类型,
ofType指定映射到集合中的pojo类型,也就是泛型,
select属性为调用另一个查询的结果
column为传入select所调用的查询的参数
按照结果嵌套查询

select t.id tid, t.name tname, s.id sid, s.name sname
from myBatis.teacher t, myBatis.student s
where t.id = s.tid and t.id = #{tid}

文章转自:[myBatis处理一对多&多对一查询_Java-答学网](http://www.dxzl8.com/it/1086661.html)

作者:答学网,转载请注明原文链接:http://www.dxzl8.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值