Mybatis实现多表联查
发布日期:2021-05-14 13:45:04 浏览次数:18 分类:精选文章

本文共 1758 字,大约阅读时间需要 5 分钟。

Mybatis 实现多表联查询

一、Mybatis 实现多表联查询方式

Mybatis 提供了几种方式来实现多表联查询,以下是常用的两种方法:

  • 业务装配对两个表写单独的 SQL 语句,在业务 (service) 中将查询结果进行联合

    这种方法适用于对两个表的查询较为复杂的情况。在每个表中写一个单独的 SQL 语句,通过业务逻辑将两者结合。这种方式的优点是灵活性高,但代码冗余较多。

  • 使用 Auto Mapping 特性,在实现两个表联合查询时通过别名完成自动映射

    Mybatis 提供了 Auto Mapping 功能,可以通过在 SQL 语句中使用字段别名来实现自动映射到目标对象的属性。这种方法适用于字段名与属性名一致的情况,简化了代码配置。

  • 使用 Mybatis 的 <resultMap> 标签进行实现

    <resultMap> 标签允许开发者自定义如何将数据库查询结果映射到目标对象。这种方法适用于字段名与属性名不一致,或需要自定义映射规则的情况。


  • 二、多表查询时类中包含另一个对象的分类

    在进行多表查询时,类中的对象可能包含另一个对象。以下是两种常见情况:

  • 单个对象

    类中包含单个对象属性,例如:

    public class Student {
    private Teacher teacher;
    }

    这种情况下,需要通过查询一个表的主键值,进而查询另一个表的详细信息。

  • 集合对象

    类中包含集合属性,例如:

    public class Teacher {
    private List
    students;
    }

    这种情况下,需要通过查询主键值,进而获取多个相关对象。


  • 三、<resultMap> 标签

    <resultMap> 标签是 Mybatis 用于自定义结果集映射的重要工具。以下是其常见用法:

  • 单表中的映射

    在单表查询中,可以使用 <resultMap> 标签将数据库字段与 Java 属性进行映射。例如:

    这种方式适用于字段名与属性名一致的情况。

  • 在两个表中关联单个对象 (N+1 方式)

    这种方式通过先查询一个表的主键值,再通过该主键值查询另一个表的详细信息。例如:

    Teacher 类中,需要包含一个 teacher 属性来存储关联对象。

  • 使用 <collection> 标签映射集合对象

    当需要关联多个对象时,可以使用 <collection> 标签。例如:

    Teacher 类中,需要定义一个 list 属性来存储集合对象。


  • 四、Mybatis 注解

    Mybatis 提供了注解功能,能够简化配置文件管理。以下是常用的注解方式:

  • 定义接口方法

    使用 @Select 注解定义查询方法:

    @Select("select * from teacher")
    List
    selAll();

    使用 @Insert 注解定义插入方法:

    @Insert("insert into teacher values(default,#{name})")
    int insTeacher(Teacher teacher);
  • 主键生成

    使用 @Options 注解配置主键生成:

    @Insert("insert into log values(default,#{accOut},#{accIn},#{money})")
    @Options(useGeneratedKeys=true, keyProperty="id")
    int insLog(Log log);
  • 删除操作

    使用 @Delete 注解定义删除方法:

    @Delete("delete from teacher where id=#{0}")
    int delById(int id);

  • 以上是关于 Mybatis 实现多表联查询的详细说明,涵盖了多种查询方式以及如何利用 Mybatis 的特性来高效完成多表关联操作。

    上一篇:SpringMvc组件与注解配置
    下一篇:Mybatis接口绑定与动态SQL

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年05月04日 11时55分26秒