MyBatis-Flex学习总结

写在前面的话

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

特征

1、轻量

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

2、灵活

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

3、强大

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

功能对比​

功能或特点MyBatis-FlexMyBatis-PlusFluent-MyBatis
对 entity 的基本增删改查
分页查询
分页查询之总量缓存
分页查询无 SQL 解析设计(更轻量,及更高性能)
多表查询: from 多张表
多表查询: left join、inner join 等等
多表查询: union,union all
单主键配置
多种 id 生成策略
支持多主键、复合主键
字段的 typeHandler 配置
除了 MyBatis,无其他第三方依赖(更轻量)
QueryWrapper 是否支持在微服务项目下进行 RPC 传输未知
逻辑删除
乐观锁
SQL 审计
数据填充
数据脱敏✔️ (收费)
字段权限✔️ (收费)
字段加密✔️ (收费)
字典回写✔️ (收费)
Db + Row
Entity 监听
多数据源支持借助其他框架或收费
多数据源是否支持 Spring 的事务管理,比如 @Transactional 和 TransactionTemplate 等
多数据源是否支持 "非Spring" 项目
多租户
动态表名
动态 Schema

1.快速上手(使用springboot)

1.1 依赖

        pom文件主要添加:mybatis-flex-spring-boot-starter依赖

<dependencies><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.8.2</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></dependency><!-- for test only --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

1.2 配置

           在 application.yml文件中进行如下简单数据源配置:

# DataSource Config
spring:datasource:url: jdbc:mysql://localhost:3306/flex_testusername: rootpassword: 12345678

         在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

@SpringBootApplication
@MapperScan("com.mybatisflex.test.mapper")
public class MybatisFlexTestApplication {public static void main(String[] args) {SpringApplication.run(MybatisFlexTestApplication.class, args);}}

1.3 编写实体类和 Mapper 接口

        使用了 Lombok 来简化代码。

@Data
@Table("tb_account")
public class Account {@Id(keyType = KeyType.Auto)private Long id;private String userName;private Integer age;private Date birthday;}
  • 使用 @Table("tb_account") 设置实体类与表名的映射关系
  • 使用 @Id(keyType = KeyType.Auto) 标识主键为自增

         Mapper 接口继承 BaseMapper 接口:

public interface AccountMapper extends BaseMapper<Account> {}

1.4 启动运行

        添加测试类如下,代码中ACCOUNT 为 MyBatis-Flex 通过 APT 自动生成,只需通过静态导入即可,无需手动编码

import static com.mybatisflex.test.entity.table.AccountTableDef.ACCOUNT;@SpringBootTest
class MybatisFlexTestApplicationTests {@Autowiredprivate AccountMapper accountMapper;@Testvoid contextLoads() {QueryWrapper queryWrapper = QueryWrapper.create().select().where(ACCOUNT.AGE.eq(18));Account account = accountMapper.selectOneByQuery(queryWrapper);System.out.println(account);}}

        有同学会发现,ACCOUNT.AGE.eq(18)这个ACCOUNT类没法导入包,一直报错,是因为你还没有导入进来,你在编译的时候这个位置需要导入进来:

如上操作就行了,还有同学说,我还没有编译,上面的代码也运行不了,怎么办,你可以把这个测试代码换一下:

换成这样的测试代码,就解决了,先运行编译一下就出现了。

 @Autowiredprivate AccountMapper accountMapper;@Testvoid contextLoads() {QueryWrapper queryWrapper = QueryWrapper.create().select().where(ACCOUNT.AGE.eq(18));Account account = accountMapper.selectOneByQuery(queryWrapper);System.out.println(account);}

 还有的同学编译后了,还是没有出现这个辅助类,怎么办?

你可以按照下面的图片进行操作:

没有生成辅助类,你可以开启idea的注解处理器,如下图所示:

然后检查processor这个包是否导入进来了,就是有没有在pom文件添加以下依赖,刷新maven:

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

完成以上内容,肯定会运行成功的,祝你成功!

2.代码生成器实现运行

        在 mybatis-flex 的模块 mybatis-flex-codegen 中,提供了可以通过数据库表,生成 Entity 类和 Mapper 类的功能。当把数据库表设计完成后可以使用其快速生成 Entity、 Mapper、 Service、 Controller 等产物。 除此之外,还可以通过扩展生成更多种类的物料。

2.1 添加依赖

        添加 mybatis-flex-codegen 的 Maven 依赖。


<dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-codegen</artifactId><version>1.8.2</version>
</dependency>
<!--也可添换成druid依赖--->
<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version>
</dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.32</version>
</dependency>

2.2 生成类

        最后,编写一个任意带有 main 方法的类,如下所示:

        运行可以生成以下内容:

  • Entity 实体类
  • Mapper 映射类
  • TableDef 表定义辅助类
  • Service 服务类
  • ServiceImpl 服务实现类
  • Controller 控制类
  • MapperXml 文件
package com.wei.demo1.controller;import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.mybatisflex.core.service.IService;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.zaxxer.hikari.HikariDataSource;/*** @BelongsProject: demo1* @BelongsPackage: com.wei.demo1.demos.web.controller* @ClassName CodeGen* @Author: weiq* @CreateTime: 2024-03-06  18:24* @Description: TODO* @Version: 1.0*/
public class CodeGen {public static void main(String[] args) {//配置数据源HikariDataSource dataSource = new HikariDataSource();
//        DruidDataSource dataSource = new DruidDataSource();dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/flex-test?characterEncoding=utf-8&useInformationSchema=true");dataSource.setUsername("root");dataSource.setPassword("root");//创建配置内容,两种风格都可以。GlobalConfig globalConfig = createGlobalConfigUseStyle1();
//        GlobalConfig globalConfig = createGlobalConfigUseStyle2();//通过 datasource 和 globalConfig 创建代码生成器Generator generator = new Generator(dataSource, globalConfig);//生成代码generator.generate();}public static GlobalConfig createGlobalConfigUseStyle1() {//创建配置内容GlobalConfig globalConfig = new GlobalConfig();//设置根包globalConfig.setBasePackage("com.wei.demo1");//设置表前缀和只生成哪些表globalConfig.setTablePrefix("tb_");globalConfig.setGenerateTable("tb_account");//设置生成 entity 并启用 LombokglobalConfig.setEntityGenerateEnable(true);globalConfig.setEntityWithLombok(true);//设置项目的JDK版本,项目的JDK为14及以上时建议设置该项,小于14则可以不设置
//        globalConfig.setEntityJdkVersion(17);//设置生成 controllerglobalConfig.setControllerGenerateEnable(true);//设置生成 serviceglobalConfig.setServiceGenerateEnable(true);//设置生成 serviceImplglobalConfig.setServiceImplGenerateEnable(true);//设置生成 mapperglobalConfig.setMapperGenerateEnable(true);//设置生成 mapperXmlglobalConfig.setMapperXmlGenerateEnable(true);globalConfig.getControllerConfig().setClassPrefix("").setClassSuffix("Controller").setRestStyle(true);globalConfig.getServiceConfig().setClassPrefix("").setClassSuffix("Service").setSuperClass(IService.class).setOverwriteEnable(true);globalConfig.getServiceImplConfig().setClassPrefix("").setClassSuffix("ServiceImpl").setSuperClass(ServiceImpl.class).setOverwriteEnable(true);globalConfig.getMapperXmlConfig().setFilePrefix("com.wei.demo1").setFileSuffix("Mapper").setOverwriteEnable(true);//可以单独配置某个列
//        ColumnConfig columnConfig = new ColumnConfig();
//        columnConfig.setColumnName("tenant_id");
//        columnConfig.setLarge(true);
//        columnConfig.setVersion(true);
//        globalConfig.setColumnConfig("tb_account", columnConfig);return globalConfig;}public static GlobalConfig createGlobalConfigUseStyle2() {//创建配置内容GlobalConfig globalConfig = new GlobalConfig();//设置根包globalConfig.getPackageConfig().setBasePackage("com.wei.mybatisflex");//设置表前缀和只生成哪些表,setGenerateTable 未配置时,生成所有表globalConfig.getStrategyConfig().setTablePrefix("tb_");
//                .setGenerateTable("tb_account", "tb_account_session");//设置生成 entity 并启用 LombokglobalConfig.enableEntity().setWithLombok(true);
//                .setJdkVersion(17);//设置生成 mapperglobalConfig.enableMapper();//        //可以单独配置某个列
//        ColumnConfig columnConfig = new ColumnConfig();
//        columnConfig.setColumnName("tenant_id");
//        columnConfig.setLarge(true);
//        columnConfig.setVersion(true);
//        globalConfig.getStrategyConfig()
//                .setColumnConfig("tb_account", columnConfig);return globalConfig;}
}

        在 Mybatis-Flex 的代码生成器中,支持如下 8 种类型的的产物生成:

  • Entity 实体类
  • Mapper 映射类
  • TableDef 表定义辅助类
  • Service 服务类
  • ServiceImpl 服务实现类
  • Controller 控制类
  • MapperXml 文件
  • package-info.java 文件

         启用或关闭某种类型产物的生成,代码如下:

// 开启 Entity 的生成
globalConfig.enableEntity();
// 关闭 Entity 的生成
globalConfig.disableEntity();

        所有方法均支持链式调用配置,代码如下:

// 设置生成 Entity 并启用 Lombok、设置父类
globalConfig.enableEntity().setWithLombok(true).setSuperClass(BaseEntity.class);

注意事项!!!​

        在 MySQL 或者 Oracle 的某些版本中,代码生成器可能无法获取  或者 字段 的注释内容,我们在数据源配置时,注意添加如下的配置信息:

MySQL

JdbcUrl 上注意添加 useInformationSchema=true 配置,如下代码所示:

HikariDataSource dataSource = new HikariDataSource();//注意:url 需添加上 useInformationSchema=true 才能正常获取表的注释
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/db?useInformationSchema=true&characterEncoding=utf-8");
dataSource.setUsername("username");
dataSource.setPassword("password");

3.MyBatis-Flex配置总结

        配置文件可以在yml文件和代码中进行配置

3.1 yml文件配置

server:port: 8080
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/flex-testusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSource
mybatis-flex:mapper-locations: classpath:/mapper/**/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.2 代码中进行配置

@Configuration
public class MybatisFlexConfig implementsConfigurationCustomizer,SqlSessionFactoryBeanCustomizer,MyBatisFlexCustomizer {@Overridepublic void customize(FlexConfiguration flexConfiguration) {System.out.println("Mybatis Configuration 配置!");}@Overridepublic void customize(SqlSessionFactoryBean sqlSessionFactoryBean) {System.out.println("sqlSessionFactoryBean 配置");}@Overridepublic void customize(FlexGlobalConfig flexGlobalConfig) {System.out.println("MyBatis Flex 配置");}
}

配置文件运行顺序如下所示:

后续继续更新!

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

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

相关文章

鸿蒙开发岗成春招最大黑马,“金三银四”应届生如何突围?

一年一度春招时间到&#xff0c;技术岗位已成为众多人才竞相追求的“职业高地”&#xff0c;也是未来职业发展的重要方向之一。鸿蒙人才在春招市场上成为“香饽饽”&#xff0c;与往年不同的是&#xff0c;许多应届生放弃考公执念向程序员进攻&#xff0c;这一现象背后蕴含着深…

腾讯云服务器和阿里云服务器价格测评_2024年费用大PK

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器61元一年&#xff0c;2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

day52(vueJS)json-server模拟数据

json-server介绍&#xff1a;&#xff1a;&#xff1a;JSON Server 是一个用于快速搭建 REST API 的工具&#xff0c;它可以帮助我们在开发过程中快速模拟 一个后端 API 服务器&#xff0c;方便前端开发人员进行接口调试和开发。使用 JSON Server&#xff0c;你可以通过创建一个…

第三百八十七回

文章目录 1. 概念介绍2. 使用方法3. 示例代码 我们在上一章回中介绍了DateRangePickerDialog Widget相关的内容,本章回中将介绍Radio Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的Radio Widget是指单选按钮&#xff0c;没有选中时是圆形…

代码随想录算法训练营第二天|977、有序数组的平方

977. 有序数组的平方 已解答 简单 相关标签 相关企业 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,…

Linux设备模型(七) - Netlink

一&#xff0c;什么是netlink通信机制 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。Netlink 是一种特殊的 socket&#xff0c;它是 Linux 所特有的。 Netlink 是一种在内核与用户应用间进行双向数…

我的创作周年纪念日

机缘 最初成为创作者的初心&#xff1a;整理自己的知识体系&#xff0c;普及前端知识 实战项目中的经验分享日常工作学习过程中的记录通过文章进行技术交流归纳和整理自己的知识体系 收获 创作的过程中收获&#xff1a; 获得了909粉丝的关注获得了很多正向的反馈&#xff0c…

【C语言】终の指针(前篇)

个人主页点这里~ 指针初阶点这里~ 指针初阶2.0点这里~ 指针进阶点这里~ 终の指针 一、回调函数二、qsort函数1、整形比较2、结构数据比较①结构体②-> 的使用③结构数据比较 一、回调函数 回调函数就是⼀个通过函数指针调用的函数。 把一个函数的指针作为参数传递给另一…

dubbo3适配springboot2.7.3

版本详细 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.0.3</version> </dependency><parent><groupId>org.springframework.boot</groupId><artifactId&…

mysql数据库入门到精通-Windows版本mysql安装(1)

文章目录 一、数据库介绍1.1、数据库概念1.2、为什么要使用数据库1.3、关系型数据库与非关系型数据库1.4、数据库术语1.5、mysql下载及地址 二、安装mysql数据库三、mysql的管理工具3.1、mysql command line client使用 四、SQL结构化查询语言4.1、SQL概述4.2、SQL发展4.3、SQL…

水牛社:专为创业者和网赚小白精心打造的助手

近几年来&#xff0c;经济发展快是快&#xff0c;物价也在蹭蹭往上涨&#xff0c;但工资却不见明显提升&#xff0c;随着生活成本的增加&#xff0c;单单靠工资&#xff0c;已经很难维持生活开支&#xff0c;加之疫情的影响&#xff0c;很多行业发展不景气&#xff0c;一些岗位…

医学大数据|统计基础|医学统计学(笔记):开学说明与目录

开始学习统计基础&#xff0c;参考教材&#xff1a;医学统计学第五版 点点关注一切来学习吧 责任编辑&#xff1a;医学大数据刘刘老师&#xff1a;头部医疗大数据公司医学科学部研究员 邮箱&#xff1a;897282268qq.com 久菜盒子工作室 我们是&#xff1a;985硕博/美国全奖…

python 输入和输出

在 Python 中&#xff0c;输入和输出是最基本的操作之一。你可以使用内置函数 input() 来获取用户输入&#xff0c;使用 print() 函数来输出信息到控制台。 输入&#xff08;Input&#xff09; input() 函数用于从用户那里获取输入。这个函数会将用户的输入作为字符串返回。 示…

安装sqlserver2022最新版只能使用.\SQLEXPRESS登录数据库怎么修改成.

.\SQLEXPRESS “服务器名称 localhost\SQLEXPRESS”中的 “SQLEXPRESS”就是数据库的实例名称/数据库名/服务器名&#xff0c; “localhost”即登录本计算机安装的数据库 安装sqlserver2022最新版只能使用.\SQLEXPRESS登录数据库怎么修改成. 2、查看SQL Server数据库的实例名…

2024年腾讯云学生服务器活动详细说明、学生机购买流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

【操作系统概念】 第7章:死锁

文章目录 0.前言7.1 系统模型7.2 死锁特征7.2.1 必要条件7.2.2 资源分配图 7.3 死锁处理方法7.4 死锁预防&#xff08;deadlock prevention&#xff09;7.4.1 互斥7.4.2 占有并等待7.4.3 非抢占7.4.4 循环等待 7.5 死锁避免&#xff08;deadlock-avoidance&#xff09;7.5.1 安…

b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取

文章目录 一、修改1.方法2.代码 二、保存和读取1.方法2.代码&#xff08;1&#xff09;保存&#xff08;2&#xff09;加载 3.陷阱 一、修改 1.方法 add_module(name: str, module: Module) -> None name 是要添加的子模块的名称。 module 是要添加的子模块。 调用 add_m…

练习 6 Web [极客大挑战 2019]HardSQL

[极客大挑战 2019]HardSQL 先尝试登录&#xff0c;查看报错信息 admin 111 password 1111 登录失败admin 111 password 1’or’1 登录成功 这里直接试了万能密码成功&#xff0c;复习一下&#xff0c;第一个 ’ 是为了闭合前面的sql语句&#xff0c;最后的1后面没有 ’ 是因为…

如何学习I2C协议

文章目录 学习I2C协议0 懒人直达1 了解协议开发者2 从恩智浦半导体公司下载官方技术文档3 翻译成中文4 资源下载 学习I2C协议 0 懒人直达 点击直达 1 了解协议开发者 I2C&#xff08;Inter-Integrated Circuit&#xff09;协议是由荷兰皇家飞利浦电子公司&#xff08;现恩智…

008-跨域

跨域 什么是跨域&#xff1f;非同源限制跨域解决方案CORSJSONP服务器进行第三方代理webscoketwindow.postMessage 什么是跨域&#xff1f; 同源策略&#xff1a;协议相同、域名相同、端口号相同 的两个页面被认为是同源。 由一个页面的 js 访问不同源的页面内容&#xff0c;被…