目录
介绍
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![](https://i-blog.csdnimg.cn/blog_migrate/33e16e225331a306bb2a27fb27bf390b.png)
查看下源码 根据主键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;
}
}