你怎么看这MyBatis-flex框架 ?(入门篇)

news2024/9/22 9:44:48

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 数据库v
mariadbMariaDB 数据库
oracleOracle11g 及以下数据库
db2DB2 数据库
hsqlHSQL 数据库
sqliteSQLite 数据库
postgresqlPostgreSQL 数据库
sqlserver2005SQLServer2005 数据库
sqlserverSQLServer 数据库
dm达梦数据库
xugu虚谷数据库
kingbasees人大金仓数据库
phoenixPhoenix HBase 数据库
gaussGauss 数据库

2、快速开始

使用的工具:

  1. IDEA 2023.2
  2. navicat 16 + Mysql 8.0
  3. springBoot 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、导入依赖

<dependency>
    <groupId>com.mybatis-flex</groupId>
    <artifactId>mybatis-flex-spring-boot-starter</artifactId>
    <version>1.5.6</version>
</dependency>

<!--数据库依赖-->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.2</version>
</dependency>

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;

}
  1. @Id注解重新设计了KeyType,一共有四个KeyType:
public enum KeyType {
    Auto, 
    Sequence,
    Generator, 
    None; 
}
  1. @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<User> wrapper = Wrappers.<User>lambdaQuery()
                .like(User::getUsername, "adm")
                .or()
                .like(User::getEmail, "abc");
userService.list(wrapper);
// 或者
QueryWrapper<User> 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<User> users = userMapper.selectListByQuery(query);

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

3.2、查询集合函数

Mybatis-plus

QueryWrapper<User> queryWrapper = Wrappers.query()
    .select(
        "id",
        "user_name",
    );
List<User> users = userMapper.selectList(queryWrapper);

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

Mybatis-Flex

QueryWrapper query = QueryWrapper.create()
    .select(
        USER.ID,
        USER.USER_NAME,
    );
List<User> users = userMapper.selectListByQuery(query);

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

3.3、and(…) 和 or(…)

Mybatis-plus

QueryWrapper<User> 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<User> query = Wrappers.<USER>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<Account> 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<User> wrapper = Wrappers.<User>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代码,也让阅读性变差了。
总体初步而言,有好也有差吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/855601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

等了10年,工信部的APP备案终于来了

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 2005年3月&#xff0c;工信部要求所有境内网站都要进行网站备案、公安备案。 2023年8月&#xff0c;工信部要求所有的APP、小程序进行备案。否则…… 这绝对是一个移动互联网创业分水岭&#xff0…

希尔排序——C语言andPython

前言 步骤 代码 C语言 Python 总结 前言 希尔排序&#xff08;Shell Sort&#xff09;是一种改进的插入排序算法&#xff0c;它通过将数组分成多个子序列进行排序&#xff0c;逐步减小子序列的长度&#xff0c;最终完成整个数组的排序。希尔排序的核心思想是通过排序较远距…

重温HashMap底层原理

目录 1.HashMap概述 2.JDK7与JDK8的HashMap区别 3.HashMap的主要方法分析 4.常见问题分析总结 1.HashMap概述 HashMap是使用频率最高的用于映射键值对(key和value)处理的数据类型。随着JDK版本的跟新&#xff0c;JDK1.8对HashMap底层的实现进行了优化&#xff0c;列入引入…

JTS Self-intersection异常TopologyException: side location conflict解决办法

JTS Self-intersection异常TopologyException: side location conflict解决办法 举例&#xff1a;问题围栏 MULTIPOLYGON (((114.0905685 32.1120567, 114.0905685 32.112957, 114.0905685 32.1138535, 114.0905685 32.1147537, 114.0905685 32.115654, 114.0905685 32.11655…

深入理解Go语言中的并发编程【30】【多路复用】

文章目录 多路复用 多路复用 操作系统级的I/O模型有&#xff1a; 阻塞I/O非阻塞I/O信号驱动I/O异步I/O多路复用I/O   Linux下&#xff0c;一切皆文件。包括普通文件、目录文件、字符设备文件&#xff08;键盘、鼠标&#xff09;、块设备文件&#xff08;硬盘、光驱&#xff…

【LeetCode】按摩师

按摩师 题目描述算法分析编程代码 链接: 按摩师 题目描述 算法分析 编程代码 class Solution { public:int massage(vector<int>& nums) {int n nums.size();if(n 0) return 0;vector<int> f(n);auto g f;f[0] nums[0];for(int i 1;i<n;i){f[i] g[i…

Winform中DatagridView 表头实现一个加上一个checkBox,实现全选选项功能

实现效果 点击checkBox1或者直接在第一列列表头点击即可实现 代码实现 我的datagridview叫dgv 我在datagridview已经默认添加了一个DataGridViewCheckBoxColumn&#xff0c;勾选时value为1&#xff0c;不勾选时value为0 第一种通过可视化拖动一个checkBox来实现 拖动组…

ElasticSearch单节点部署

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

餐饮管理系统ssm酒店饭店仓库进销存jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 餐饮管理系统ssm 系统有1权限&#xff1a;管理员 二…

使用MethodInterceptor和ResponseBodyAdvice做分页处理

目录 一、需求 二、代码实现 父pom文件 pom文件 配置文件 手动注册SqlSessionFactory&#xff08;MyBatisConfig &#xff09; 对象 实体类Users 抽象类AbstractQuery 查询参数类UsersQuery 三层架构 UsersController UsersServiceImpl UsersMapper UsersMapper.…

C++项目:在线五子棋对战网页版--session管理模块开发

session 在WEB开发中&#xff0c;HTTP协议是⼀种⽆状态短链接的协议&#xff0c;这就导致⼀个客⼾端连接到服务器上之后&#xff0c;服务器不知道当前的连接对应的是哪个用户&#xff0c;也不知道客⼾端是否登录成功&#xff0c;这时候为客⼾端提所有服务是不合理的。因此&am…

微信昵称后面的“小耳朵”,原来有这么多用处,让我带你涨知识

微信昵称后面的“小耳朵”&#xff0c;原来有这么多用处&#xff0c;让我带你涨知识 大家都知道&#xff0c;在微信昵称后面加上一个"小耳朵"符号是一种常见的表达方式&#xff0c;但你知道吗&#xff1f;这个看似简单的符号其实有着丰富的用处和意义。让我带你了解…

java中io流、属性集Properties、缓冲流、转换流、序列化和反序列化、打印流、网络编程(TCP通信程序、文件复制案例、文件上传案例、B/S服务案例)

IO流&#xff1a; io流中i表示input输入&#xff0c;o表示output输出&#xff0c;流表示数据&#xff08;字符&#xff0c;字节&#xff0c;1个字符2个字节8个位&#xff09;&#xff1b;这里的输入输出是以内存为基础&#xff0c;将数据从内存中输出到硬盘的过程称为输出&…

CMSIS—OS(V1/V2)

在RTOS基础上再封装一层API。 更换项目中所使用到的RTOS。 例如将freertos项目替换为ucos RTX liteos等其他RTOS。 只需更改该CMSIS-OS的API所调用的RTOS的API。 更换RTOS的意义何在&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&am…

函数的学习

函数学习 最后附上全部java源码&#xff0c;可自行下载学习 文章目录 函数入门函数重载函数可变个数参数foreach输出传参 基本数据类型传参_引用数据类型文件夹展示所有里面的文件使用递归算法展示文件夹下所有文件1加到100的递归调用下载链接 函数入门 函数重载 public class…

为什么企业一定要走标准化、体系化的道路?

企业实行标准化、体系化道路&#xff0c;有几个重要原因&#xff1a; 1.一致性和质量&#xff1a;标准化流程和系统可确保任务始终如一且高质量地执行。这种一致性对于提供满足客户期望的产品和服务至关重要&#xff0c;从而在客户之间建立信任和忠诚度。 2.效率和生产力&…

强化安全防线:迅软科技助力美容院提升终端安全管理水平

某美容院专注于皮肤抗衰老研究与美容领域服务,业务主要包含轮廊塑型、自体脂肪、五官雕塑等,业务涵盖中国、香港、美国、韩国等多个国家及地区提倡以积极、健康、理智的美学观点,以完善的美容院管理,过硬的技术设备,为消费者提供个性化漂亮服务。 美容院的核心诉求 美容院新产…

【攻防世界】command_execution

题目再现 小宁写了个ping功能,但没有写waf,X老师告诉她这是非常危险的&#xff0c;你知道为什么吗。 题目分析 本题目说没有写WAF&#xff0c;然后可以执行Linux经典代码PING&#xff0c;我猜测到服务器不会校验我所注入的代码&#xff0c;我利用串行执行符&&进行测…

查看CentOS版本及系统位数与设置CentOS 7.9 2009 防火墙配置放开端口的命令与过程

一、查看CentOS版本及系统位数 1.1 命令汇总 //1、安装redhat-lsb yum install -y redhat-lsb//2、查看系统版本信息 lsb_release -a //3、查看系统位数 getconf LONG_BIT1.2 截图 二、设置CentOS7.9 2009 防火墙配置放开端口 2.1 命令汇总 //禁止防火墙开机启动。这种方法方…

侯捷C++高级编程(下)

对于1个类要么像指针要么像函数 主题1:转换函数 转换函数 /** 1. 转换函数没有返回类型* 2. 转换函数一般需要加上const*/ class Fraction { public:Fraction(int num,int den1):m(num),n(den){cout<<"Fraction(int num,int den1): m/n "<< m/n<&…