目录
介绍
基础使用
简单入门
插入数据
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了
为该表添加一个字段性别 ,0:女 ,1:男 默认值:2 不男不女
注意实体类中要添加相对应的字段属性,并重新编译,此时再使用insertSelective和手动设置不忽略null的insert插入数据查看有什么区别
观察sql区别
查看数据库结果
没有主键情况
有主键情况
可以看到直接就是批量插入的sql,不忽略null值
先查看下现在表中有的数据
默认忽略null值
先来看下数据库原有的数据
myabtis-flex在更新中是默认忽略null值的,但是如果有这样一个场景,不让其忽略null,但是只把实体的指定字段入库时设置为null,显然只是设置不忽略null是不可行的,因为只设置不忽略null会把所有字段都不忽略,而这时只想让指定字段不忽略,就需要用到UpdateEntity了
查看当前数据库数据
可以看到虽然account实体中age没有set值,也就是age字段也是null,但是sql打印中并没有更新age字段
先查看目前数据库数据
注意前三者都最后都只会返回一条数据, 也就是说如果查询出来是多条符合数据的数据前三个都不会报错,但是最后一个会报错
还是先看下数据库数据
查看下源码 根据主键id进行查询,返回的肯定是一条数据
查看源码可以看到该方法在最后的sql拼接了limit 1从实现只返回一条数据
查看源码可以知晓该方法也是拼接了limit 1
查看源码 后面什么都没有拼接
这里测试下如果返回的是多个符合条件的数据会怎么样
年龄大于20的数据有两条,直接报错
查询多条数据的指定字段
其他方法不再演示,和之前的用法大同小异
先看下数据库数据
新建一个vo实体进行映射
关于QueryWrapper的使用官网提供的也很详细了
这里只做简单演示,具体使用方法可以参看官网
支持所有原sql的格式拼接
还有许多原生mysql的聚合函数,具体使用参考官网
mybatis-Flex对queryWrapper提供了CPI来进行QueryWrapper的set和get
举例使用
查询出QueryWrapper查询的列名 其他具体使用查看官网即可
用户在操作插入h和更新数据时可以指定监听器来进行监听用户的操作,从而自动插入或者更新一些数据,比如创建时间和更改时间等
还是先查看数据库
记得代码中实体属性要与数据库一一对应
新增监听器
调用监听器
测试
可以看到这里只设置了userName,但是打印sql和实体的创建时间和idNumber都有值,插入的监听器将这两个字段进行设值
监听实体的set方法
先查看数据库
实现字典回写
书写set监听器
测试
还有全局监听器不再演示,具体操作参考官网即可
为数据库表添加逻辑删除字段 del_flag 0:flase 1:true
测试逻辑删除查询数据
可以看到默认只查询了delFlag为0的数据
测试删除数据
删除数据也是走的update语句
跳过逻辑删除处理
走的是delete语句
添加版本号字段
数据库添加手机号字段进行测试
查询测试
我们在使用时如果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
使用官网提供模板demo
参考官网介绍
实体属性继承Model
注意使用Record模式时在1.5.9版本时实体字段和数据库字段一定要完全对应不然会报错抛异常