你怎么看这MyBatis-flex框架 ?

决赛世界杯直播

1、简介

在国内目前使用最多的ORM框架就是Mybatis-Plus,也不得不承认,Mybatis-Plus相对于JPA而言,也确实好用一些(就个人而言),但是在国外JPA框架还是挺火的,因为JPA是一个完全的ORM框架,而Mybatis-Plus是一个半ORM框架。 但是,在这段时间Apache推出的Mybatis-Flex框架,我个人认为也是Mybatis框架从半ORM转向完整的ORM框架的补充。

既然说MyBatis-Flex是迈向完整的ORM框架,强大的地方肯定不是一星半点,一起来看看吧。

1.1、官方介绍:

MyBatis-Flex一个优雅的 MyBatis 增强框架,更轻量、更灵活、以及更高的性能。

1、更轻量

MyBatis-Flex 除了 MyBatis 本身,再无任何第三方依赖,因此会带来更高的自主性、把控性和稳定性。在任何一个系统中,依赖越多,稳定性越差。

2、更灵活

MyBatis-Flex 提供了非常灵活的 QueryWrapper,支持关联查询、多表查询、多主键、逻辑删除、乐观锁更新、数据填充、数据脱敏等等。

3、更高的性能

MyBatis-Flex 通过独特的架构,没有任何 MyBatis 拦截器、在 SQL 执行的过程中,没有任何的 SQL Parse,因此会带来指数级的性能增长。

1.2、支持的数据库

数据库描述mysqlMySql 数据库vmariadbMariaDB 数据库oracleOracle11g 及以下数据库db2DB2 数据库hsqlHSQL 数据库sqliteSQLite 数据库postgresqlPostgreSQL 数据库sqlserver2005SQLServer2005 数据库sqlserverSQLServer 数据库dm达梦数据库xugu虚谷数据库kingbasees人大金仓数据库phoenixPhoenix HBase 数据库gaussGauss 数据库2、快速开始

使用的工具:

IDEA 2023.2navicat 16 + Mysql 8.0springBoot 3.0

2.1、数据库准备

user表:

CREATE TABLE `user` (

`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',

`user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '用户名',

`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '邮箱',

`phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '手机号',

`type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色',

)

user_address表:

CREATE TABLE `user_address` (

`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',

`create_user` bigint NOT NULL DEFAULT 0 COMMENT '创建人',

`receive_name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '收货人',

`receive_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '联系号码',

`province` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '省份',

`city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '城市',

`area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '区',

PRIMARY KEY (`id`) USING BTREE

)

2.2、环境准备

2.2.1、导入依赖

com.mybatis-flex

mybatis-flex-spring-boot-starter

1.5.6

com.mysql

mysql-connector-j

org.mybatis.spring.boot

mybatis-spring-boot-starter

3.0.2

mybatis-spring-boot-starter这个依赖一定要导入,不然就会报错:

caused by: java.lang.illegalargumentexception: property ‘sqlsessionfactory’ or ‘sqlsessiontemplate’ …

2.2.2、创建好相应的接口和类。

Mybatis-flex在数据访问类上做了修改:

@Data

@AllArgsConstructor

@NoArgsConstructor

@Table(value = "user_address")

public class UserAddress {

@Id(keyType = KeyType.Auto) // 相当于 @TableId(type = IdType.AUTO)

private int id;

@Column(value = "receive_name")

private String receiveName;

private String receivePhone;

private String province;

private String city;

private String area;

private int createUser;

}

@Id注解重新设计了KeyType,一共有四个KeyType:

public enum KeyType {

Auto,

Sequence,

Generator,

None;

}

@TableId改成了@Id,@TableFiled改成了@Column,逐步向JPA靠拢。

2.2.3、相关配置

yaml文件:

spring:

datasource:

url: jdbc:mysql://localhost:3306/e-shop

username: root

password: 123456

mybatis-flex:

configuration:

## 显示执行的SQL信息

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

启动类:

@SpringBootApplication

@MapperScan("com.t_time.flex.dao") // 开启Mapper层的Bean扫码

public class MybatisFlexTestApplication {

public static void main(String[] args) {

SpringApplication.run(MybatisFlexTestApplication.class, args);

}

}

2.3、测试

查询所有用户信息:

@RestController

@RequiredArgsConstructor

@RequestMapping(value = "/user")

public class UserController {

private final UserService userService;

@GetMapping(value = "/all")

public Object all(){

return userService.list();

}

}

结果:

3、与同类框架比较

因为Mybatis-plus在国内比较火,所以就拿MyBatis-plus与之比较。

MyBatis-Plus:老牌的 MyBatis 增强框架,开源于 2016 年。

3.1、基础查询

Mybatis-plus

LambdaQueryWrapper wrapper = Wrappers.lambdaQuery()

.like(User::getUsername, "adm")

.or()

.like(User::getEmail, "abc");

userService.list(wrapper);

// 或者

QueryWrapper wrapper = Wrappers.query()

.like(searchWord != null, "last_name", searchWord)

.eq("gender", 1)

.gt("age", 24);

userService.list(wrapper);

Mybatis-Flex

MyBatis-Flex 中的 QueryWrapper 是一个用于构建查询条件的辅助类。它提供了一组方法,可以通过链式调用来添加各种查询条件。

QueryWrapper query = QueryWrapper.create()

.where(USER.USER_NAME.like(searchWord)) //条件为null时自动忽略

.and(USER.GENDER.eq(1))

.and(USER.AGE.gt(24));

List users = userMapper.selectListByQuery(query);

这里使用了Mybatis-flex的一个亮点技术—— APT,这个在之后的文章里会讲。

3.2、查询集合函数

Mybatis-plus

QueryWrapper queryWrapper = Wrappers.query()

.select(

"id",

"user_name",

);

List users = userMapper.selectList(queryWrapper);

这么写的缺点就是存在硬编码问题,因为是字符串做参数,如果参数 没写正确SQL就会执行错误。

Mybatis-Flex

QueryWrapper query = QueryWrapper.create()

.select(

USER.ID,

USER.USER_NAME,

);

List users = userMapper.selectListByQuery(query);

这里同样使用了APT技术,我们就可以直接用链的方式点出属性,然后由Mybatis-flex对字段进行映射,这样我们如果SQL没有执行成功,也会是映射出现的问题。

3.3、and(…) 和 or(…)

Mybatis-plus

QueryWrapper query = Wrappers.query()

.ge("id", 100)

.and(i -> i.eq("sex", 1).or(x -> x.eq("sex", 2)))

.or(i -> i.in("age", 18, 19, 20).like("user_name", "michael"));

// 或者

LambdaQueryWrapper query = Wrappers.lambdaQuery()

.ge(USER::getId, 100)

.and(i -> i.eq(USER::getSex, 1).or(x -> x.eq(USER::getSex, 2)))

.or(i -> i.in(User::getAge, 18, 19, 20).like(User::getUserName, "michael"));

Mybatis-Flex

QueryWrapper query = QueryWrapper.create()

.where(USER.ID.ge(100))

.and(USER.SEX.eq(1).or(USER.SEX.eq(2)))

.or(USER.AGE.in(18, 19, 20).and(USER.USER_NAME.like("michael")));

3.4、多表联合

亮点来了,MyBatis-plus是不支持代码层面的多表联合的,但是,MyBatis-flex做到了,它可以实现代码层面的多表联合。

QueryWrapper query = QueryWrapper.create()

.select().from(ACCOUNT)

.leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID))

.where(ACCOUNT.AGE.ge(10));

List accounts = mapper.selectListByQuery(query);

语法:leftJoin(表对象).on(条件)

在SQL中我们有时也不适用leftJoin等其他关键字,就是直接在FROM后面接多个表,用逗号隔开。

SELECT a.id, a.user_name, b.id AS addressId, b.province

FROM user AS a, user_address AS b

WHERE a.id = b.create_id

QueryWrapper query = new QueryWrapper()

.select(

USER.ID

, USER.USER_NAME

, USERADDRESS.ID.as("addressId")

, USERADDRESS.PROVINCE)

.from(ACCOUNT.as("a"), ARTICLE.as("b"))

.where(USER.ID.eq(USERADDRESS.CREATE_ID));

3.5、部分字段的更新

在更新字段上,基本上的逻辑都是相同的。

MyBatis-plus

LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate()

.eq(User::getId, "001")

.set(User::getUsername, "李四");

userService.update(wrapper);

MyBatis-Flex

Account account = UpdateEntity.of(Account.class);

account.setId(100); //设置主键

account.setUserName("michael");

account.setAge(18);

account.setBirthday(null);

accountMapper.update(account);

4、总结

就我个人而言,Mybatis-Flex在使用中确实让开发者脱离的XML文件,但是,也让Java代码变得非常的庞大,在多个表进行连接的时候就会出现一连串很长的Java代码,也让阅读性变差了。

总体初步而言,有好也有差吧。

Copyright © 2088 世界杯女足_足球歌曲世界杯主题曲 - luxiuying.com All Rights Reserved.
友情链接