SpringBoot集成MybatisFlex-Spring专区论坛-技术-SpringForAll社区

SpringBoot集成MybatisFlex

[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。

图片[1]-SpringBoot集成MybatisFlex-Spring专区论坛-技术-SpringForAll社区

实践

以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发布的,可以说非常非常的年轻了,在稳定性、安全性、可扩展性方面还需要市场的验证,是否如官方宣称的那样美好有待考究。

引用

请登录后发表评论

    没有回复内容