栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis学习笔记(八)。一对多和多对一的处理,ResultMap高级结果集映射。

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis学习笔记(八)。一对多和多对一的处理,ResultMap高级结果集映射。

文章目录

一对多和多对一的处理1. 多对一的处理

1.1 数据库设计1.2 创建项目1.3 问题1.4 ResultMap高级结果集映射

方式一 按照查询嵌套处理方式二 按照结果嵌套处理 2. 一对多的处理

2.1 数据库设计2.2 创建项目2.3 问题2.4 ResultMap高级结果集映射

方式一 按结果嵌套处理方式二 按查询嵌套处理 3. 总结

一对多和多对一的处理

官方文档:

https://mybatis.net.cn/sqlmap-xml.html

1. 多对一的处理

多对一的理解:

多个学生对应一个老师如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 1.1 数据库设计

CREATE TABLE `teacher` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB 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`)
) 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');

说明:学生表中tid字段作为外键关联老师表中的id字段。

1.2 创建项目

创建实体类

Student.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private int id;
    private String name;
    // 学生需要关联一个老师
    private Teacher teacher;
}

说明:多对一的关系,多个学生关联一个老师,那么我们将Teacher作为Student的一个属性。

Teacher.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    private int id;
    private String name;
}

说明:我这里使用了Lombok插件,可以省略get,set,toString,有参构造和无参构造等。注意加的注解。

编写接口

StudentMapper.java

public interface StudentMapper {
    public List getStudent();
    public List getStudent2();
}

获取所有的学生信息

TeacherMapper.java

public interface TeacherMapper {
    
}

编写xml文件

StudentMapper.xml





    
        select * from student;
    

TeacherMapper.xml






mybatis核心配置文件中配置包扫描的方式。


    
    

说明:注意接口和xml文件所在的目录为同一个目录,可以使用这种方式,我这里都在com.xxc.dao下。

测试

public class MyTest {
    static Logger logger = Logger.getLogger(MyTest.class);
    @Test
    public void getStudent(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List students = mapper.getStudent();
        for (Student student : students) {
            logger.debug(student);
        }
        sqlSession.close();
    }
}

1.3 问题

我们从返回结果可以看出teacher的返回结果为null。那么teacher作为学生的一个属性,要想显示值就需要用到ResultMap高级结果集映射。

1.4 ResultMap高级结果集映射

需求:查询所有学生信息以及对应的老师信息。

方式一 按照查询嵌套处理

我们对StudentMapper.xml进行改造。

思路:查询所有的学生信息。根据查询出来的学生的tid,寻找对应的老师。有点类似于子查询。





    
    
        
        
        
    
    
        select * from teacher where id = #{tid}
    

说明:如果是对象,就使用association,如果是集合,就使用collection。

select * from teacher where id = #{id},这里只有一个参数,#{id}自动匹配上面传过来的参数了,随意写。

方式二 按照结果嵌套处理

我们对StudentMapper.xml进行改造。

思路:查询所有的学生信息。根据查询出来的学生的tid,寻找对应的老师。有点类似于关联查询。





    
        
        
        
            
        
    
    
        select s.id sid,s.name sname,t.name tname
        from student s,teacher t
        where s.tid = t.id;
    

说明:相当于teacher作为student的一个属性,但是属性是对象,对象中又包含了其他属性。

这里注意起别名了,所有column中应当写别名。

注意:我这里老师id为0,是因为我在sql中没有查询,int类型的默认值为0。

小结:

按照查询进行嵌套处理就像SQL中的子查询按照结果进行嵌套处理就像SQL中的联表查询 2. 一对多的处理

一对多的理解:

一个老师拥有多个学生如果对于老师这边,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)! 2.1 数据库设计

同上面的多对一数据库。

2.2 创建项目

创建实体类

Student.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private int id;
    private String name;
    private int tid;
}

Teacher.java

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

编写接口

StudentMapper.java

public interface StudentMapper {
    
}

TeacherMapper.java

public interface TeacherMapper {
    List getTeacher();
    Teacher getTeacher2(@Param("tid") int id);
    Teacher getTeacher3(@Param("tid") int id);
}

编写xml文件

StudentMapper.xml






TeacherMapper.xml





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

说明:集合的话,使用collection!

JavaType和ofType都是用来指定对象类型的

JavaType是用来指定pojo中属性的类型

ofType指定的是映射到list集合属性中pojo的类型

方式二 按查询嵌套处理

我们对StudentMapper.xml进行改造。





    
        
    
    
        select * from student where tid = #{tid}
    

说明:实体类teacher中id和name与数据库字段相同,没必要映射了。

javaType在Teacher中是集合,这里使用了ArrayList,ofType使用了Student

3. 总结

    关联-association

    集合-collection

    所以association是用于一对一和多对一,而collection是用于一对多的关系

    JavaType和ofType都是用来指定对象类型的

    JavaType是用来指定pojo中属性的类型
    ofType指定的是映射到list集合属性中pojo的类型。

注意说明:

    保证SQL的可读性,尽量通俗易懂根据实际要求,尽量编写性能更高的SQL语句注意属性名和字段不一致的问题注意一对多和多对一 中:字段和属性对应的问题尽量使用Log4j,通过日志来查看自己的错误
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/723444.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号