springboot整合mybatis实现多表查询的实战记录

 更新时间:2021年08月12日 15:33:01   作者:BBZLOVEWJ  
SpringBoot对数据库操作有多种方式,下面这篇文章主要给大家介绍了关于springboot整合mybatis实现多表查询的相关资料,文中通过示例代码以及图文介绍的非常详细,需要的朋友可以参考下

什么是mybatis

(1)Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。

(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 @Insert @Repository

(3)通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。(从执行 sql 到返回 result 的过程)。

Mybaits 的优点:

(1)基 于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML标签,支持编写动态 SQL 语句,并可重用。

(2)与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;

(3)很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要JDBC 支持的数据库 MyBatis 都支持)。

(4)能够与 Spring 很好的集成;

Mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

下面将详细springboot整合mybatis多表查询的方法,一起来看看吧

1、一对一查询(例一个用户一个账户)

1.1、实体类

//用户实体
@Data
public class UserInfo {

    private int u_id;
    private String name;
    private Account account;
}    


//账户实体
@Data
public class Account {

    private int a_id;
    private String  aname;
    private double money;
}


1.2、数据库表

用户表

账户表

1.3、持久层接口

  @Select("select * from userInfo where name=#{name} ")
    @Results({

            //@Result(property = "a_id",column = "a_id"),
            @Result(property ="account",column = "a_id",javaType = Account.class,
                    one = @One(select="com.bbz.dao.AccountDao.findById",fetchType = FetchType.LAZY))
    })
    public UserInfo findUserlnfo(String name);
   @Select("select * from account where a_id=#{a_id}")
    public Account findById (int a_id);

2、一对多查询(例一个用户对应多个账户)

2.1、实体类

//用户实体
@Data
public class UserInfo {

    private int u_id;
    private String name;
    private List<Account>accountList;
}

//账户实体
@Data
public class Account {

    private  int id;
    private int a_id;
    private String  aname;
    private double money;  
}

2.2、数据库表

用户表

账户表

2.3、持久层接口

    @Select("select * from userInfo where name=#{name}")
    @Results({
            @Result(property ="accountList",column ="a_id",javaType = List.class,
                    many = @Many(select = "com.bbz.dao.AccountDao.findById",fetchType = FetchType.LAZY)
            )
    })
    public UserInfo findUser(String name);
    
    //fetchType = FetchType.LAZY):提取方式为延迟加载,默认是立即加载
 @Select("select * from account where a_id=#{a_id}")
    public   Account   findById (int a_id);
    

3、总结

共同点:

无论是一对一还是一对多,都是通过附属查询来实现的,我们需要定义这个附属查询方法。

在主查询方法中通过@One、@Many指定附属查询方法的全路径。

都通过column来传递参数给附属方法。

不同点:

一对一,那么附属方法返回的是一个单独的对象

一对多,那么附属方法返回的是一个对象集合

4、多对多的查询(例一个用户多个角色)

4.1、实体类

//用户实体
@Data
public class UserInfo {

    private int u_id;
    private String name;
    private  List<Role>roleList;
}

//角色实体
@Data
public class Role {

    private int r_id;
    private String name;
}

4.2、数据库表

用户表

角色表

中间表

4.3、持久层接口

 @Select("select * from userInfo where u_id=#{u_id}")
    @Results({

            @Result(property = "u_id",column = "u_id"),
            @Result(property ="roleList",column ="u_id",javaType = List.class,
                    many = @Many(select = "com.bbz.dao.RoleDao.findById",fetchType = FetchType.LAZY)
            )

    })
    public UserInfo findUser(int u_id);
 @Select("select * from role r,user_role ur where r.r_id=ur.r_id and ur.u_id=#{u_id}")
    public List<Role> findById(int U_id);

5、多对一(一个用户对应多个老师)

5.1 实体类

//用户实体
@Data
public class UserInfo {

    private int u_id;
    private String name;
    private Teacher teacher;
}

//老师实体
public class Teacher {

    public int t_id;
    public String name;
}

5.2、数据库表

用户表

老师表

5.3、持久层接口

@Select("select * from  userInfo where u_id=#{u_id}")
    @Results({
            @Result(property ="teacher",column ="t_id",javaType = Teacher.class,
                    one= @One(select = "com.bbz.dao.TeacherDao.findById",fetchType = FetchType.LAZY)
            )
    })
    @Select("select * from teacher where t_id=#{t_id}")
    public Teacher findById(int t_id);

总结

到此这篇关于springboot整和mybatis实现多表查询的文章就介绍到这了,更多相关springboot整和mybatis多表查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot Swagger2使用方法过程解析

    Spring Boot Swagger2使用方法过程解析

    这篇文章主要介绍了Spring Boot Swagger2使用方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot集成阿里巴巴Druid监控的示例代码

    SpringBoot集成阿里巴巴Druid监控的示例代码

    这篇文章主要介绍了SpringBoot集成阿里巴巴Druid监控的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • IDEA中已配置阿里镜像但maven无法下载jar包的问题及解决方法

    IDEA中已配置阿里镜像但maven无法下载jar包的问题及解决方法

    这篇文章主要介绍了IDEA中已配置阿里镜像但maven无法下载jar包的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java实现石头剪刀布小游戏

    Java实现石头剪刀布小游戏

    这篇文章主要为大家详细介绍了Java实现石头剪刀布小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Spring中@PropertySource的使用方法和运行原理详解

    Spring中@PropertySource的使用方法和运行原理详解

    这篇文章主要介绍了Spring中@PropertySource的使用方法和运行原理详解,PropertySource注解可以方便和灵活的向Spring的环境容器(org.springframework.core.env.Environment Environment)中注入一些属性,这些属性可以在Bean中使用,需要的朋友可以参考下
    2023-11-11
  • Spring Boot报错:No session repository could be auto-configured, check your configuration的解决方法

    Spring Boot报错:No session repository could be auto-configured

    这篇文章主要给大家介绍了关于Spring Boot报错:No session repository could be auto-configured, check your configuration的解决方法,文中给出了详细的解决方法,对遇到这个问题的朋友们具有一定参考价值,需要的朋友下面来一起看看吧。
    2017-07-07
  • SpringCloud Gateway加载断言predicates与过滤器filters的源码分析

    SpringCloud Gateway加载断言predicates与过滤器filters的源码分析

    这篇文章主要介绍了SpringCloud Gateway加载断言predicates与过滤器filters的详细过程,本文通过源码给大家解析的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Mybatis-Spring连接mysql 8.0配置步骤出错的解决方法

    Mybatis-Spring连接mysql 8.0配置步骤出错的解决方法

    这篇文章主要为大家详细介绍了Mybatis-Spring连接mysql 8.0配置步骤出错的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Spring中的@RestControllerAdvice注解使用方法解析

    Spring中的@RestControllerAdvice注解使用方法解析

    这篇文章主要介绍了Spring中的@RestControllerAdvice注解使用方法解析,@RestControllerAdvice是Controller的增强 常用于全局异常的捕获处理 和请求参数的增强,需要的朋友可以参考下
    2024-01-01
  • SpringCloud Alibaba使用Seata处理分布式事务的技巧

    SpringCloud Alibaba使用Seata处理分布式事务的技巧

    在传统的单体项目中,我们使用@Transactional注解就能实现基本的ACID事务了,随着微服务架构的引入,需要对数据库进行分库分表,每个服务拥有自己的数据库,这样传统的事务就不起作用了,那么我们如何保证多个服务中数据的一致性呢?跟随小编一起通过本文了解下吧
    2021-06-06

最新评论