SpringBoot中怎么整合MyBatisPlus Join使用联表查询

其他教程   发布日期:2023年08月01日   浏览次数:738

这篇文章主要介绍了SpringBoot中怎么整合MyBatisPlus Join使用联表查询的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot中怎么整合MyBatisPlus Join使用联表查询文章都会有所收获,下面我们一起来看看吧。

1、mybatis-plus

相信大家在日常的开发中用的最多的就是 mybatis-plus了吧,作为一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

2、mybatis-plus-join

联表查询一直是 mybatis-plus 的短板之处,当需要联表查询时,还得打开 xml 文件写入长长的 sql 语句。于是有需求就有产出,mybatis-plus-join 出世了,可以以类似 mybatis-plus 中 QueryWrapper 的方式来进行联表查询,下面一起来体验吧!

3、引入依赖

  1. <!-- mybatis-plus-join -->
  2. <dependency>
  3. <groupId>com.github.yulichang</groupId>
  4. <artifactId>mybatis-plus-join</artifactId>
  5. <version>1.2.4</version>
  6. </dependency>
  7. <!-- mybatis-plus -->
  8. <dependency>
  9. <groupId>com.baomidou</groupId>
  10. <artifactId>mybatis-plus-boot-starter</artifactId>
  11. <version>3.5.1</version>
  12. </dependency>
  13. <!-- mysql连接 -->
  14. <dependency>
  15. <groupId>mysql</groupId>
  16. <artifactId>mysql-connector-java</artifactId>
  17. <scope>runtime</scope>
  18. </dependency>

4、mybatis配置信息

配置文件信息

  1. spring:
  2. # 数据源配置
  3. datasource:
  4. # 连接池类型
  5. type: com.zaxxer.hikari.HikariDataSource
  6. driver-class-name: com.mysql.cj.jdbc.Driver
  7. # 数据库名称
  8. database: test
  9. port: 3306
  10. url: jdbc:mysql://127.0.0.1:${spring.datasource.port}/${spring.datasource.database}?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=UTF-8
  11. username: root
  12. password: 123456
  13. # mybatis配置
  14. mybatis-plus:
  15. # xml文件路径
  16. mapper-locations: classpath*:/mapper/*.xml
  17. # 实体类路径
  18. type-aliases-package: com.asurplus.entity
  19. configuration:
  20. # 驼峰转换
  21. map-underscore-to-camel-case: true
  22. # 是否开启缓存
  23. cache-enabled: false
  24. # 打印sql,正式环境关闭
  25. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  26. # 全局配置
  27. global-config:
  28. db-config:
  29. #主键类型 0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)";
  30. id-type: AUTO

配置类信息

  1. import com.baomidou.mybatisplus.annotation.DbType;
  2. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  3. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  4. import org.mybatis.spring.annotation.MapperScan;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. /**
  8. * mybatisplus配置类
  9. *
  10. * @author asurplus
  11. */
  12. @Configuration
  13. @MapperScan("com.asurplus.mapper")
  14. public class MybatisPlusConfigurer {
  15. @Bean
  16. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  17. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  18. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
  19. return interceptor;
  20. }
  21. }

5、建库建表

建库

  1. CREATE DATABASE IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

建表

1、user 表

  1. CREATE TABLE `user` (
  2. `id` bigint(20) NOT NULL,
  3. `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  4. `sex` int(1) NULL DEFAULT NULL,
  5. `age` int(4) NULL DEFAULT NULL,
  6. `role_id` bigint(20) NULL DEFAULT NULL,
  7. `del_flag` int(3) NULL DEFAULT NULL,
  8. PRIMARY KEY (`id`) USING BTREE
  9. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

2、role表

  1. CREATE TABLE `role` (
  2. `id` bigint(20) NOT NULL,
  3. `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  4. `del_flag` int(3) NULL DEFAULT 0,
  5. PRIMARY KEY (`id`) USING BTREE
  6. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

3、插入数据

  1. INSERT INTO `role` VALUES (1, '超级管理员', 0);
  2. INSERT INTO `user` VALUES (1, 'Asurplus', 1, 18, 1, 0);

6、代码自动生成

User

  1. import com.baomidou.mybatisplus.annotation.TableField;
  2. import com.baomidou.mybatisplus.annotation.TableId;
  3. import com.baomidou.mybatisplus.annotation.TableLogic;
  4. import com.baomidou.mybatisplus.annotation.TableName;
  5. import com.baomidou.mybatisplus.extension.activerecord.Model;
  6. import io.swagger.annotations.ApiModel;
  7. import io.swagger.annotations.ApiModelProperty;
  8. import lombok.Data;
  9. import lombok.EqualsAndHashCode;
  10. @Data
  11. @EqualsAndHashCode(callSuper = false)
  12. @TableName("user")
  13. @ApiModel(value="User对象", description="")
  14. public class User extends Model<User> {
  15. @TableId("id")
  16. private Long id;
  17. @TableField("name")
  18. private String name;
  19. @TableField("sex")
  20. private Integer sex;
  21. @TableField("age")
  22. private Integer age;
  23. @TableField("role_id")
  24. private Long roleId;
  25. @ApiModelProperty(value = "删除状态(0--未删除1--已删除)")
  26. @TableField("del_flag")
  27. @TableLogic
  28. private Integer delFlag;
  29. }

UserMapper

  1. import com.asurplus.entity.User;
  2. import com.github.yulichang.base.MPJBaseMapper;
  3. public interface UserMapper extends MPJBaseMapper<User> {
  4. }

注意:这里我们继承了 MPJBaseMapper

UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.asurplus.mapper.UserMapper">
  4. </mapper>

UserService

  1. import com.asurplus.entity.User;
  2. import com.github.yulichang.base.MPJBaseService;
  3. public interface UserService extends MPJBaseService<User> {
  4. }

注意:这里我们继承了 MPJBaseService

  1. UserServiceImpl
  2. import com.asurplus.entity.User;
  3. import com.asurplus.mapper.UserMapper;
  4. import com.asurplus.service.UserService;
  5. import com.github.yulichang.base.MPJBaseServiceImpl;
  6. import org.springframework.stereotype.Service;
  7. /**
  8. * <p>
  9. * 服务实现类
  10. * </p>
  11. *
  12. * @author lizhou
  13. * @since 2022-12-14
  14. */
  15. @Service
  16. public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implements UserService {
  17. }

注意:这里我们继承了 MPJBaseServiceImpl

7、联表查询

vo类

  1. import com.asurplus.entity.User;
  2. import lombok.Data;
  3. @Data
  4. public class UserVO extends User {
  5. private String roleName;
  6. }

联表查询

  1. public UserVO getUserVO(Long id) {
  2. UserVO userVO = this.baseMapper.selectJoinOne(
  3. UserVO.class,
  4. new MPJLambdaWrapper<User>()
  5. .selectAll(User.class)
  6. .selectAs(Role::getName, UserVO::getRoleName)
  7. .leftJoin(Role.class, Role::getId, User::getRoleId)
  8. .eq(User::getId, id));
  9. return userVO;
  10. }

生成SQL:

  1. SELECT
  2. t.id,
  3. t.NAME,
  4. t.sex,
  5. t.age,
  6. t.role_id,
  7. t.del_flag,
  8. t1.NAME AS roleName
  9. FROM
  10. USER t
  11. LEFT JOIN role t1 ON ( t1.id = t.role_id )
  12. WHERE
  13. t.del_flag = 0
  14. AND ( t.id = ? )

联表分页查询

  1. public IPage<UserVO> getUserVO(Long id) {
  2. IPage<UserVO> list = this.baseMapper.selectJoinPage(
  3. new Page<UserVO>(1, 10),
  4. UserVO.class,
  5. new MPJLambdaWrapper<User>()
  6. .selectAll(User.class)
  7. .selectAs(Role::getName, UserVO::getRoleName)
  8. .leftJoin(Role.class, Role::getId, User::getRoleId)
  9. .eq(User::getId, id));
  10. return list;
  11. }

生成SQL:

  1. SELECT
  2. t.id,
  3. t.NAME,
  4. t.sex,
  5. t.age,
  6. t.role_id,
  7. t.del_flag,
  8. t1.NAME AS roleName
  9. FROM
  10. USER t
  11. LEFT JOIN role t1 ON ( t1.id = t.role_id )
  12. WHERE
  13. t.del_flag = 0
  14. AND ( t.id = ? )
  15. LIMIT ?

普通写法(QueryWrapper)

  1. public UserVO getUserVO(Long id) {
  2. UserVO userVO = this.baseMapper.selectJoinOne(
  3. UserVO.class,
  4. new MPJQueryWrapper<User>()
  5. .selectAll(User.class)
  6. .select("t1.name as role_name")
  7. .leftJoin("role t1 on (t.role_id = t1.id)")
  8. .eq("t.id", id));
  9. return userVO;
  10. }

生成SQL:

  1. SELECT
  2. t.id,
  3. t.NAME,
  4. t.sex,
  5. t.age,
  6. t.role_id,
  7. t.del_flag,
  8. t1.NAME AS role_name
  9. FROM
  10. USER t
  11. LEFT JOIN role t1 ON ( t.role_id = t1.id )
  12. WHERE
  13. t.del_flag = 0
  14. AND ( t.id = 1 )

运行结果与之前完全相同,需要注意的是,这样写时在引用表名时不要使用数据库中的原表名,主表默认使用 t,其他表使用join语句中我们为它起的别名,如果使用原表名在运行中会出现报错。

以上就是SpringBoot中怎么整合MyBatisPlus Join使用联表查询的详细内容,更多关于SpringBoot中怎么整合MyBatisPlus Join使用联表查询的资料请关注九品源码其它相关文章!