SpringBoot集成MybatisFlex

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper 帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。MyBatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于业务上的事情。通俗来说,Mybatis-Flex 就是对Mybatis 这个orm框架的扩展,地位类似与MybatisPlus。

[toc]

Mybatis简介

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来和数据库进行交互。是一款非常热门,应用非常广泛的orm框架。

Mybatis-Flex简介

概述

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

MyBatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于业务上的事情。

通俗来说,Mybatis-Flex 就是对Mybatis 这个orm框架的扩展,地位类似与MybatisPlus。

特征

  • 兼容:兼容所有Mybatis所有功能

  • 轻量:除了 MyBatis,没有任何第三方依赖,轻依赖、没有任何拦截器,其原理是通过 SqlProvider 的方式实现的轻实现。同时,在执行的过程中,没有任何的 Sql 解析(Parse)轻运行。 这带来了几个好处:极高的性能;极易对代码进行跟踪和调试; 把控性更高。

  • 灵活:支持 Entity 的增删改查、以及分页查询的同时,MyBatis-Flex 提供了 Db + Row 工具,可以无需实体类对数据库进行增删改查以及分页查询。 与此同时,MyBatis-Flex 内置的 QueryWrapper 可以轻易的帮助我们实现 多表查询、链接查询、子查询 等等常见的 SQL 场景。

  • 强大:支持任意关系型数据库,还可以通过方言持续扩展,同时支持 多(复合)主键、逻辑删除、乐观锁配置、数据脱敏、数据审计、 数据填充 等等功能。

对比

Mybatis-Flex 和 Mybatis-Plus、Fluent-MyBatis 功能对比,此对比是官方给出的。同时官方发布了一个性能测试对比,各方面测试结果优于mybatix-plus。

实践

以SpringBoot为例

pom



<dependency>
    <groupId>com.mybatis-flex</groupId>
    <artifactId>mybatis-flex-spring-boot-starter</artifactId>
    <version>1.5.4</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.16</version>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.20</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
    <scope>runtime</scope>
</dependency>
  • mybatis-flex-spring-boot-starter:这里面已经引入了mybatis
  • druid:需要显式配置数据库连接池,否则启动报找不到SqlSessionFactory

yml


spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    #driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.1.32:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: 123456
logging:
  level:
    com.ramble: debug
  • 需要显式配置数据库连接池

Entity


package com.ramble.mybatisflex.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serializable;

@Table("user")
@Data
public class UserEntity implements Serializable {
   
   
    @Id
    private String id;
    private String name;
    private Integer state;
}

Repository


package com.ramble.mybatisflex.repository;
import com.mybatisflex.core.BaseMapper;
import com.ramble.mybatisflex.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserRepository extends BaseMapper<UserEntity> {
   
   

}

Service



package com.ramble.mybatisflex.service;
import com.mybatisflex.core.service.IService;
import com.ramble.mybatisflex.entity.UserEntity;

public interface UserService extends IService<UserEntity> {

}


package com.ramble.mybatisflex.service;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.ramble.mybatisflex.entity.UserEntity;
import com.ramble.mybatisflex.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserRepository, UserEntity> implements UserService {

}

CURD



package com.ramble.mybatisflex.controller;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import com.mybatisflex.core.query.QueryCondition;
import com.mybatisflex.core.query.QueryWrapper;
import com.ramble.mybatisflex.entity.UserEntity;
import com.ramble.mybatisflex.repository.UserRepository;
import com.ramble.mybatisflex.service.UserService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("/test")
public class TestController {
   
   

    private UserRepository userRepository;

    private UserService userService;

    @GetMapping("/curd")
    public void curd() {
   
   
        UserEntity user = new UserEntity();
        user.setId(IdUtil.fastSimpleUUID());
        user.setName(RandomUtil.randomString(5));
        user.setState(RandomUtil.randomInt(0, 1));
        userRepository.insert(user);
        userRepository.insertOrUpdate(user);
        userRepository.deleteById("640273451622495db331ebaa94292df6");

        //部分字段更新 UPDATE `user` SET `name` = ? WHERE `id` = ?
        UserEntity user1 = new UserEntity();
        user1.setId("0ffbfcd70b3f4a1a8836d8f723f2b841");
        user1.setName(RandomUtil.randomString(5));
//        user1.setState(RandomUtil.randomInt(0, 1));
        userRepository.update(user1, true);

        // UPDATE `user` SET `name` = ? WHERE state=0 OR name = '漫步科技' OR name like '明'
        UserEntity user2 = new UserEntity();
        user2.setId("0ffbfcd70b3f4a1a8836d8f723f2b841");
        user2.setName(RandomUtil.randomString(10));
        QueryCondition qq = QueryCondition.createEmpty();
        qq.and("state=0");
        qq.or("name = '漫步科技'");
        qq.or("name like '明'");
        userRepository.updateByCondition(user2, true, qq);

        //UPDATE `user` SET `name` = ? WHERE state=0 OR name = '漫步科技' OR name like '明'
        QueryWrapper q = QueryWrapper.create();
        q.where("state=0 OR name = '漫步科技' OR name like '明'");
        userRepository.updateByQuery(user2, true, q);
    }

    @GetMapping("/curd2")
    public void curd2() {
   
   
    }
}
  • 基础的CURD和mp非常相似,详情可参看;https://mybatis-flex.com/zh/base/query.html
  • QueryCondition:条件查询,非常面向对象,这个对象比mp的要强大
  • QueryWrapper:查询包装器,功能非常强大,支持原生sql,用过的都说好

总结

本文演示了Mybatis-Flex的基本使用姿势,更多的功能发掘还是需要在落地项目中结合具体需求来编写。

初体验是不错的,在功能上强于Mybatis-plus。

从官网公布的资料显示,这个框架第一个版本是在20230303发布的,可以说非常非常的年轻了,在稳定性、安全性、可扩展性方面还需要市场的验证,是否如官方宣称的那样美好有待考究。

引用

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
290 6
|
4月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
368 4
|
4月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
319 1
|
5月前
|
消息中间件 Java Kafka
springboot集成kafka
springboot集成kafka
168 2
|
5月前
|
消息中间件 Java Kafka
集成Kafka到Spring Boot项目中的步骤和配置
集成Kafka到Spring Boot项目中的步骤和配置
264 7
|
5月前
|
druid Java 关系型数据库
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
793 5
|
5月前
|
Java 数据库连接 mybatis
在Spring Boot应用中集成MyBatis与MyBatis-Plus
在Spring Boot应用中集成MyBatis与MyBatis-Plus
123 5
|
5月前
|
前端开发 JavaScript 安全
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
86 4
|
5月前
|
监控 前端开发 Java
五分钟后,你将学会在SpringBoot项目中如何集成CAT调用链
五分钟后,你将学会在SpringBoot项目中如何集成CAT调用链
|
4月前
|
消息中间件 Java Kafka
Spring Boot与Apache Kafka Streams的集成
Spring Boot与Apache Kafka Streams的集成