新兴崛起的优雅框架Mybatis-Flex

6 篇文章 1 订阅
1 篇文章 0 订阅

目录

介绍

基础使用

简单入门

 插入数据

insertSelective

 insertOrUpdate

insertBatch 

 注意事项

删除数据

​编辑 条件删除

 批量删除

 注意事项

 更新数据

​编辑

条件更新

UpdateEntity使用

 UpdaerWrapper使用

注意事项

 查询数据

查询一条数据

selectOneById​编辑

 selectOneByMap

 selectOneByCondition

 selectOneByQuery

查询多条数据

 查询单列数据

查询Map数据 

 映射查询

​编辑 实体集合映射

 单列数据集合映射

 QueWrapper

原生写法 

lamabada表达式写法 

字符串写法 

三者混用写法

​编辑 CPI

监听器

onInsert和onUpdate

onSet

逻辑删除 

 乐观锁

数据脱敏

flex内置脱敏

自定义数据脱敏 

跳过脱敏 

关联查询

分页查询

 xml文件配置分页

 Active Record 

 代码生成


介绍

MyBatis-Flex是一个Java持久层框架,旨在提供简化和灵活的数据库访问解决方案。它通过巧妙地结合Java对象和关系数据库表,将数据访问过程变得更加优雅。

这个框架通过使用XML配置文件来定义SQL映射,使得数据库操作变得直观且可维护。它为开发人员提供了强大的工具,可以轻松地编写和执行数据库查询,而无需过多关注底层的数据库细节。

MyBatis-Flex还引入了动态SQL的概念,允许根据不同的条件来动态生成SQL语句。这使得查询变得非常灵活和可定制,适应了各种复杂的业务需求。

此外,MyBatis-Flex还提供了缓存机制,可以显著提高查询性能。它还支持批量操作,可以大大减少与数据库的通信次数,提高数据操作的效率。

基础使用

简单入门

MyBatis-Flex - MyBatis-Flex 官方网站

根据官方文档的快速开始步骤操作即可

这里也简单演示下

引入所需依赖

yml文件配置

 

实体类建表和mapper文件 根据创建官网配置即可

添加配置类打印控制台sql

根据官网配置建表查询数据库

编写测试类 

注意target目录下的编译文件

 

这里会对每个实体生成一个Def文件

点击查看

 后面flex封装的api查询基本都会围绕这个Def文件来进行操作,,注意这个文件只有在编译后才会生成在target目录里,在原先源码文件里是不存在的

再查看一个单个查询名字为张三的

注意这里需要事先静态引入前面的Def文件,没有Def文件的先进行编译下再引入

 

如果不引入这里的全拼是:

 

再来看一组插入的方法,在MP中,默认新增和修改的api在实体字段为null时会默认不更新或者插入为null的字段,那如果刚好碰到需要将字段插入或者更新为null的场景时Mp处理起来就比较麻烦些

在flex里面可以手动设置是否忽略null字段的更新

 

 插入数据

 在前面简单使用的时候已经演示过insert的手动设置是否忽略null值的情况了,这里就不再演示insert了

insertSelective

为该表添加一个字段性别 ,0:女 ,1:男  默认值:2 不男不女

 

注意实体类中要添加相对应的字段属性,并重新编译,此时再使用insertSelective和手动设置不忽略null的insert插入数据查看有什么区别

观察sql区别

 查看数据库结果

 insertOrUpdate

没有主键情况

 

 有主键情况

 

insertBatch 

可以看到直接就是批量插入的sql,不忽略null值

 

 注意事项

删除数据

先查看下现在表中有的数据

 条件删除

 

 

 

 批量删除

 

 注意事项

 更新数据

条件更新

默认忽略null值

先来看下数据库原有的数据

 

 

 

 

 指定年龄加3

UpdateEntity使用

myabtis-flex在更新中是默认忽略null值的,但是如果有这样一个场景,不让其忽略null,但是只把实体的指定字段入库时设置为null,显然只是设置不忽略null是不可行的,因为只设置不忽略null会把所有字段都不忽略,而这时只想让指定字段不忽略,就需要用到UpdateEntity了

查看当前数据库数据

 

 

可以看到虽然account实体中age没有set值,也就是age字段也是null,但是sql打印中并没有更新age字段 

 UpdaerWrapper使用

先查看目前数据库数据

 

注意事项

 查询数据

查询一条数据

注意前三者都最后都只会返回一条数据, 也就是说如果查询出来是多条符合数据的数据前三个都不会报错,但是最后一个会报错

 还是先看下数据库数据

selectOneById

查看下源码 根据主键id进行查询,返回的肯定是一条数据

 selectOneByMap

 查看源码可以看到该方法在最后的sql拼接了limit 1从实现只返回一条数据

 selectOneByCondition

 查看源码可以知晓该方法也是拼接了limit 1 

 selectOneByQuery

 查看源码  后面什么都没有拼接

 这里测试下如果返回的是多个符合条件的数据会怎么样

年龄大于20的数据有两条,直接报错

查询多条数据

 

查询多条数据的指定字段

 

其他方法不再演示,和之前的用法大同小异

 查询单列数据

 

查询Map数据 

 

 映射查询

先看下数据库数据

 实体集合映射

 新建一个vo实体进行映射

 

 单列数据集合映射

 QueWrapper

 关于QueryWrapper的使用官网提供的也很详细了

这里只做简单演示,具体使用方法可以参看官网

原生写法 

  

支持所有原sql的格式拼接

还有许多原生mysql的聚合函数,具体使用参考官网 

lamabada表达式写法 

字符串写法 

三者混用写法

 CPI

 mybatis-Flex对queryWrapper提供了CPI来进行QueryWrapper的set和get

 举例使用

 

 查询出QueryWrapper查询的列名  其他具体使用查看官网即可

监听器

onInsert和onUpdate

用户在操作插入h和更新数据时可以指定监听器来进行监听用户的操作,从而自动插入或者更新一些数据,比如创建时间和更改时间等

还是先查看数据库

记得代码中实体属性要与数据库一一对应

 新增监听器

 调用监听器

 测试

可以看到这里只设置了userName,但是打印sql和实体的创建时间和idNumber都有值,插入的监听器将这两个字段进行设值

 修改监听器

 

onSet

监听实体的set方法

先查看数据库

实现字典回写

 添加性别字典字段

 书写set监听器

 测试

还有全局监听器不再演示,具体操作参考官网即可

逻辑删除 

 为数据库表添加逻辑删除字段 del_flag 0:flase 1:true

 

测试逻辑删除查询数据

 

可以看到默认只查询了delFlag为0的数据

测试删除数据

 

 

删除数据也是走的update语句

跳过逻辑删除处理

 

走的是delete语句

 乐观锁

 添加版本号字段

 

 

数据脱敏

 

flex内置脱敏

数据库添加手机号字段进行测试

 

 

 查询测试

 

自定义数据脱敏 

我们在使用时如果flex提供的脱敏方式不够满足我们的需求时还可以通过自定义脱敏方式来进行脱敏

将数据库中的id_number字段中的小写英文字母全部大写来模拟脱敏处理

 书写自定义脱敏

 配置注册全局脱敏

字段使用

 

测试

 

小写全部脱敏为大写

跳过脱敏 

刚才脱敏的手机号和idNumber字段都明文显示了 

关联查询

再创建两个表

 插入模拟数据

 

主表添加阵营id字段和部门(称号)字段

编造模拟插入两个从表数据 以便进行联表查询

 

创建表对应实体层和持久层 不再截图演示

先查看下联表的sql写法

 配置映射vo对象

 

查询测试

查看sql

SELECT
	`a`.`id`,
	`a`.`age`,
	`a`.`sex`,
	`a`.`phone`,
	`a`.`camp_id`,
	`a`.`dept_id`,
	`a`.`version`,
	`a`.`birthday`,
	`a`.`id_number`,
	`a`.`user_name`,
	`a`.`create_date`,
	`a`.`update_date`,
	`b`.`id` AS `camp$id`,
	`b`.`troops`,
	`b`.`camp_name`,
	`c`.`id` AS `dept$id`,
	`c`.`dept_num`,
	`c`.`dept_name` 
FROM
	`tb_account` AS `a`
	LEFT JOIN `camp` AS `b` ON `a`.`camp_id` = `b`.`id`
	LEFT JOIN `dept` AS `c` ON `a`.`dept_id` = `c`.`id` 
WHERE
	`a`.`del_flag` = 0

分页查询

 

 xml文件配置分页

使用官网提供模板demo

 

 

 Active Record 

参考官网介绍 

实体属性继承Model

 

 

 注意使用Record模式时在1.5.9版本时实体字段和数据库字段一定要完全对应不然会报错抛异常

使用1.6版本以上没有这个问题

输入图片说明

输入图片说明

输入图片说明

 代码生成

myabtis-flex官网的代码生成文档写的很详细 这里简单演示下

首先引入所需依赖

官网提供

建一张学生表用作代码生成测试

 

package com.example.mybatis_flex_study.genercode;

import com.alibaba.druid.pool.DruidDataSource;
import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.ColumnConfig;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.apache.catalina.Service;

public class CodeGener {
    public static void main(String[] args) {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/testmysql2?characterEncoding=utf-8");
        dataSource.setUsername("root");
        dataSource.setPassword("*****");

        //创建配置内容,两种风格都可以。
        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.example.mybatis_flex_study");
        //设置表前缀
        globalConfig.setTablePrefix("tb_");
        //设置生成的表  参数可填多个
        globalConfig.setGenerateTable("tb_student");
        //设置生成 entity 并启用 Lombok
        globalConfig.setEntityGenerateEnable(true);
        globalConfig.setEntityWithLombok(true);
        //设置生成 mapper
        globalConfig.setMapperGenerateEnable(true);
        globalConfig.setMapperSuperClass(BaseMapper.class);
        //设置生成service
        globalConfig.setServiceGenerateEnable(true);
        globalConfig.setServiceSuperClass(Service.class);
        globalConfig.setServiceImplGenerateEnable(true);
        globalConfig.setServiceImplSuperClass(ServiceImpl.class);
        //设置生成xml文件
        //globalConfig.setMapperXmlGenerateEnable(true);
        //可以单独配置某个列
        ColumnConfig columnConfig = new ColumnConfig();
        //columnConfig.setColumnName("tenant_id");
        columnConfig.setLarge(true);
        columnConfig.setVersion(true);
        globalConfig.setColumnConfig("tb_student", columnConfig);
        //设置生成的entity,mapper和service各个生成包的位置
        globalConfig.setEntityPackage(globalConfig.getBasePackage()+".eneity");
        globalConfig.setMapperPackage(globalConfig.getBasePackage()+".mapper");
        globalConfig.setServicePackage(globalConfig.getBasePackage()+".service");
        globalConfig.setServiceImplPackage(globalConfig.getBasePackage()+".service.impl");
        //设置生成的xml文件位置
        //globalConfig.setMapperXmlPath("/src/main/resources/mapper");
        return globalConfig;
    }

}

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值