[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;
}
- entity上面的注解和mybatis、mybatis-plus 大同小异详情可参看:https://mybatis-flex.com/zh/core/table.html
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> {
}
- repository(mapper)层写法和mybatis-plus 非常相似,只不过提供的默认实现方法略有差异,详情可参看:https://mybatis-flex.com/zh/base/add-delete-update.html
- 总体而言,比mp提供的功能更多、更好理解,写起来效率更高
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发布的,可以说非常非常的年轻了,在稳定性、安全性、可扩展性方面还需要市场的验证,是否如官方宣称的那样美好有待考究。