springboot整合mybatis实现多表查询的实战记录
作者:BBZLOVEWJ
什么是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多表查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!