• 03. Springboot集成Mybatis-flex(一)


    目录

    1、前言

    2、MyBatis-Flex 是什么?

    3、框架功能对比

    4、性能对比

    5、快速使用

    5.1、Maven添加依赖

    5.2、数据源配置

    5.3、创建实体类和表

    5.4、创建Dao

    5.5、创建Service

    5.6、创建Controller接口测试

    5.7、测试结果

    6、小结


    1、前言

    现在主流的Mybatis增强框架有很多,当然项目中最经常使用的还是MybatisPlus为主。但是用过MybatisPlus的小伙伴也知道,对于单表操作,链式的编码方式以及提供的Lambda支持可以简化很多代码量,但是如果多表操作,就显得心有余而力不足了。因此大多数项目中对于多表操作,仍然选择采用XML的编写方式。那么这里介绍一款Mybatis增强框架,号称集成了MybatisPlus等多个框架的优点。那就是Mybatis-Flex。

    2、MyBatis-Flex 是什么?

    官网地址:MyBatis-Flex - MyBatis-Flex 官方网站

    与Mybatis Plus类似,Mybatis Flex也是基于Mybatis的一个增强的ORM框架。但是相比之前更轻量,更灵活,性能更高。

    以下摘抄自官网:

    MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。

    总而言之,MyBatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于自己的事情。

    3、框架功能对比

    MyBatis-Flex 和同类框架「功能」对比 - MyBatis-Flex 官方网站

    功能或特点

    MyBatis-Flex

    MyBatis-Plus

    Fluent-MyBatis

    对 entity 的基本增删改查

    分页查询

    分页查询之总量缓存

    分页查询无 SQL 解析设计(更轻量,及更高性能)

    多表查询: from 多张表

    多表查询: left join、inner join 等等

    多表查询: union,union all

    单主键配置

    多种 id 生成策略

    支持多主键、复合主键

    字段的 typeHandler 配置

    除了 MyBatis,无其他第三方依赖(更轻量)

    QueryWrapper 是否支持在微服务项目下进行 RPC 传输

    未知

    逻辑删除

    乐观锁

    SQL 审计

    数据填充

    数据脱敏

    ✔️(收费)

    字段权限

    ✔️(收费)

    字段加密

    ✔️(收费)

    字典回写

    ✔️(收费)

    Db + Row

    Entity 监听

    多数据源支持

    借助其他框架或收费

    多数据源是否支持 Spring 的事务管理,比如@Transactional和TransactionTemplate等

    多数据源是否支持 "非Spring" 项目

    多租户

    动态表名

    动态 Schema

    4、性能对比

    MyBatis-Flex 和同类框架「性能」对比 - MyBatis-Flex 官方网站

    可以看下具体的性能对比(我这边没有具体测试过),这里直接给出官网的结论:

    5、快速使用

    5.1、Maven添加依赖

    1. <dependencies>
    2. <!-- 这里为mybatis-flex依赖 -->
    3. <dependency>
    4. <groupId>com.mybatis-flex</groupId>
    5. <artifactId>mybatis-flex-spring-boot-starter</artifactId>
    6. <version>1.6.4</version>
    7. </dependency>
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-web</artifactId>
    11. </dependency>
    12. <dependency>
    13. <groupId>org.springframework.boot</groupId>
    14. <artifactId>spring-boot-configuration-processor</artifactId>
    15. <optional>true</optional>
    16. </dependency>
    17. <dependency>
    18. <groupId>com.alibaba</groupId>
    19. <artifactId>druid-spring-boot-starter</artifactId>
    20. <version>1.2.8</version>
    21. </dependency>
    22. <dependency>
    23. <groupId>com.baomidou</groupId>
    24. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    25. <version>3.5.0</version>
    26. </dependency>
    27. <dependency>
    28. <groupId>com.mysql</groupId>
    29. <artifactId>mysql-connector-j</artifactId>
    30. </dependency>
    31. <dependency>
    32. <groupId>org.projectlombok</groupId>
    33. <artifactId>lombok</artifactId>
    34. <version>1.18.24</version>
    35. </dependency>
    36. <dependency>
    37. <groupId>cn.hutool</groupId>
    38. <artifactId>hutool-all</artifactId>
    39. <version>5.8.21</version>
    40. </dependency>
    41. <dependency>
    42. <groupId>org.springframework.boot</groupId>
    43. <artifactId>spring-boot-starter-validation</artifactId>
    44. </dependency>
    45. </dependencies>

    5.2、数据源配置

    这里多数据源使用SpringBoot的多数据源,Mybatis-Flex也支持多数据源配置。

    1. server:
    2. port: 8080
    3. spring:
    4. application:
    5. name: springboot-mybatis-flex
    6. profiles:
    7. active: dev
    8. jackson:
    9. # 不要全局限制,避免字段格式不一致
    10. date-format: "yyyy-MM-dd HH:mm:ss"
    11. locale: zh_CN
    12. time-zone: GMT+8
    13. # druid config
    14. datasource:
    15. dynamic:
    16. primary: primary
    17. datasource:
    18. primary:
    19. driver-class-name: com.mysql.cj.jdbc.Driver
    20. url: jdbc:mysql://localhost:3306/my-game?useUnicode=true&characterEncoding=utf8&useSSL=false
    21. username: root
    22. password: root
    23. type: com.alibaba.druid.pool.DruidDataSource
    24. druid:
    25. validation-query: SELECT 1
    26. initial-size: 10
    27. min-idle: 10
    28. max-active: 20
    29. min-evictable-idle-time-millis: 180000
    30. test-on-borrow: false
    31. test-while-idle: true
    32. remove-abandoned: true
    33. remove-abandoned-timeout-millis: 1800
    34. log-abandoned: true
    35. pool-prepared-statements: true
    36. max-open-prepared-statements: 100
    37. filter:
    38. slf4j:
    39. enabled: false
    40. web-stat-filter:
    41. enabled: false
    42. autoconfigure:
    43. exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

    5.3、创建实体类和表

    实体类User:

    1. package org.shamee.demo.entity;
    2. import com.mybatisflex.annotation.Column;
    3. import com.mybatisflex.annotation.Id;
    4. import com.mybatisflex.annotation.KeyType;
    5. import com.mybatisflex.annotation.Table;
    6. import com.mybatisflex.core.keygen.KeyGenerators;
    7. import lombok.*;
    8. import java.io.Serializable;
    9. import java.util.Date;
    10. /**
    11. * @Table 注解自动映射实体类和表字段
    12. */
    13. @Data
    14. @Builder
    15. @NoArgsConstructor
    16. @AllArgsConstructor
    17. @Table("t_user")
    18. public class User implements Serializable {
    19. /**
    20. * 声明主键ID,并指定生成器为雪花ID
    21. */
    22. @Id(keyType = KeyType.Generator, value = KeyGenerators.snowFlakeId)
    23. private String id;
    24. /**
    25. * Column声明字段名称,onInsertValue 自动填充时间
    26. */
    27. @Column(value = "createdTime", onInsertValue = "now()")
    28. private Date createdTime;
    29. @Column(value = "updatedTime", onInsertValue = "now()", onUpdateValue = "now()")
    30. private Date updatedTime;
    31. /**
    32. * Column声明字段名称,isLogicDelete 逻辑删除
    33. */
    34. @Column(value = "isDeleted", isLogicDelete = true)
    35. private Boolean isDeleted = false;
    36. @Column(value = "userId")
    37. private String userId;
    38. @Column(value = "userName")
    39. private String userName;
    40. @Column(value = "isUse")
    41. private Boolean isUse;
    42. @Column(value = "battleNum")
    43. private Integer battleNum;
    44. @Column(value = "atk")
    45. private Integer atk;
    46. private String extension;
    47. }

    表t_user:

    1. CREATE TABLE `t_user` (
    2. `id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
    3. `userId` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
    4. `userName` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    5. `isUse` tinyint(4) NULL DEFAULT NULL,
    6. `battleNum` int(11) NULL DEFAULT NULL,
    7. `atk` int(11) NULL DEFAULT NULL,
    8. `extension` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
    9. `createdTime` datetime(0) NULL DEFAULT NULL,
    10. `updatedTime` datetime(0) NULL DEFAULT NULL,
    11. `isDeleted` tinyint(4) NULL DEFAULT NULL,
    12. PRIMARY KEY (`id`) USING BTREE
    13. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

    5.4、创建Dao

    1. package org.shamee.demo.dao;
    2. import com.mybatisflex.core.BaseMapper;
    3. import org.shamee.demo.entity.User;
    4. public interface UserDao extends BaseMapper<User> {
    5. }

    5.5、创建Service

    1. package org.shamee.demo.service;
    2. import com.mybatisflex.core.query.QueryWrapper;
    3. import com.mybatisflex.core.update.UpdateChain;
    4. import com.mybatisflex.spring.service.impl.ServiceImpl;
    5. import org.shamee.demo.dao.UserDao;
    6. import org.shamee.demo.entity.User;
    7. import org.shamee.demo.entity.table.UserTableDef;
    8. import org.springframework.stereotype.Service;
    9. import java.util.List;
    10. @Service
    11. public class UserService extends ServiceImpl<UserDao, User> {
    12. /**
    13. * 查询全部
    14. * @return
    15. */
    16. public List<User> selectAll(){
    17. return this.getMapper().selectAll();
    18. }
    19. /**
    20. * 根据userId获取User数据
    21. * @param userId
    22. * @return
    23. */
    24. public User listById(String userId){
    25. QueryWrapper wrapper = QueryWrapper.create()
    26. // 这里可以指定查询字段
    27. .select(UserTableDef.USER.USER_ID, UserTableDef.USER.USER_NAME, UserTableDef.USER.ATK)
    28. // sql from表名
    29. .from(User.class)
    30. // 查询条件,这里的UserTableDef.USER代码自动编译生成,类似lombok
    31. .where(UserTableDef.USER.USER_ID.eq(userId));
    32. return this.getMapper().selectOneByQuery(wrapper);
    33. }
    34. /**
    35. * 新增
    36. * @param user
    37. */
    38. public void insert(User user){
    39. this.getMapper().insert(user);
    40. }
    41. /**
    42. * 更新User
    43. * @param user
    44. */
    45. public void updateEntity(User user){
    46. this.getMapper().update(user);
    47. }
    48. /**
    49. * 局部更新
    50. * @param userId
    51. * @param userName
    52. */
    53. public void updateRow(String userId, String userName){
    54. UpdateChain.of(User.class)
    55. .set(User::getUserName, userName)
    56. .where(User::getUserId).eq(userId).update();
    57. }
    58. /**
    59. * 删除
    60. * @param userName
    61. */
    62. public void deleteByWrapper(String userName){
    63. QueryWrapper queryWrapper = QueryWrapper.create().where(UserTableDef.USER.USER_NAME.eq(userName));
    64. this.getMapper().deleteByQuery(queryWrapper);
    65. }
    66. }

    5.6、创建Controller接口测试

    1. package org.shamee.demo.controller;
    2. import org.shamee.demo.entity.User;
    3. import org.shamee.demo.service.UserService;
    4. import org.springframework.web.bind.annotation.GetMapping;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import javax.annotation.Resource;
    8. import java.util.List;
    9. @RestController
    10. @RequestMapping("/api/demo/user")
    11. public class UserController {
    12. @Resource
    13. private UserService userService;
    14. /**
    15. * 查询全部
    16. * @return
    17. */
    18. @GetMapping("listall")
    19. public List listall(){
    20. return userService.selectAll();
    21. }
    22. /**
    23. * 按userId查询
    24. * @return
    25. */
    26. @GetMapping("listById")
    27. public User listById(){
    28. return userService.listById("zhangsan");
    29. }
    30. /**
    31. * 新增
    32. * @return
    33. */
    34. @GetMapping("insert")
    35. public Boolean insert(){
    36. User user = User.builder().userId("zhangsan").userName("张三").atk(100).battleNum(200).build();
    37. userService.insert(user);
    38. return Boolean.TRUE;
    39. }
    40. /**
    41. * 更新
    42. * @return
    43. */
    44. @GetMapping("update")
    45. public Boolean update(){
    46. userService.updateRow("zhangsan", "张三三");
    47. return Boolean.TRUE;
    48. }
    49. /**
    50. * 删除
    51. * @return
    52. */
    53. @GetMapping("delete")
    54. public Boolean delete(){
    55. userService.deleteByWrapper("张三三");
    56. return Boolean.TRUE;
    57. }
    58. }

    5.7、测试结果

    先执行insert接口插入数据后,调用listall查看数据列表。

    6、小结

    习惯了Mybatis Plus后,Mybatis Flex上手还是很类似的,就是会有一些语法的差异。如声明主键注解,字段映射注解,QueryWrapper使用差异等等。整体来说是Mybatis增强版,官方也提供了很多高级使用配置,感兴趣的可以探索一下。

  • 相关阅读:
    Elasticserach常见问题
    1.R语言介绍
    Python JSON
    Clickhouse表引擎—集成系列引擎
    03贪心:摆动序列
    Wireshark数据包分析——时间盲注/延时注入攻击
    Java练习题第十九期:另类加法
    5位cron 规则解析
    【JVM系列】- 挖掘·JVM堆内存结构
    记录paddlepaddle-gpu安装
  • 原文地址:https://blog.csdn.net/p793049488/article/details/133305066