Mybatis-Plus 是一款 MyBatis 的增强工具包,简化 CRUD 操作。启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。Mybatis-Plus 启动注入动态 SQL 脚本、性能更优,让你专注业务快速敏捷开发。
演示例子:https://gitee.com/baomidou/mybatis-plus-samples
官方文档:https://baomidou.com/
回应用户关于同类框架对比说明:
MP 不会去做无意义的对比(很多设定一开始就是不公平的,或者说非生产环境的模拟一些简单 SQL 的执行对比毫无意义),也不会片面的夸大自身优势,把自己有的功能别人没有的列出来,别人有的功能自己没有的不列出来(当然也不排斥客观公正的对比,好坏让用户自己去感受)。
MP 相关特性是完全支持 XML 动态 SQL 执行的,理论上性能会低于那些静态硬编码框架的执行速度(但是差距也是 ms 毫秒之间的,对于实际生产无任何意义真正的性能瓶颈在 DB IO 上面),因为 MP 存在动态 OGNL 判断以及复杂 SQL 智能优化存在耗时(这部分耗时是值得的,优化后的 SQL 会在 DB 执行上面取得更加优秀的执行速度)。
当前版本亮点
1,动态 SQL 智能优化支持本地缓存加速解析,更完善的租户复杂 XML 动态 SQL 支持,静态注入缓存如下:
static {
// 默认支持序列化 FstSerialCaffeineJsqlParseCache,JdkSerialCaffeineJsqlParseCache
JsqlParserGlobal.setJsqlParseCache(new JdkSerialCaffeineJsqlParseCache(
(cache) -> cache.maximumSize(1024)
.expireAfterWrite(5, TimeUnit.SECONDS))
);
}
2,代码生成器支持更多的自定义特性,查看测试用例
com.baomidou.mybatisplus.generator.samples.H2CodeGeneratorTest;
3,大幅度减少堆内存占用加速启动速度,优化动态 SQL 解析注入方法精简,实测近500张表的超级单体减少40%+的堆内存占用。
4,完善 Spring Boot3 + JDK 17 本地 Native 的构建,暂不支持 Lambda 方法的使用。
5,增星瑞格数据库支持( 其它国产数据库需要支持欢迎 PR )
6,mybatis 升级 3.5.13 版本
7,乐观锁支持 java.time.Instant 内置执行 SQL 做了查询提前优化
8,完善 Wrapper 支持 TypeHandler 类型转换查询及其它 SQL 参数的动态映射配置
Wrappers.<H2User>lambdaQuery().apply("name={0,typeHandler="
+ H2userNameJsonTypeHandler.class.getCanonicalName()
+ "}", "{\"id\":101,\"name\":\"Tomcat\"}"))
9,脚本维护 DDL 功能支持存储过程脚本执行、支持自定义分隔符
@Component
public class MysqlDdl implements IDdl {
/**
* 执行 SQL 脚本方式
*/
@Override
public List<String> getSqlFiles() {
return Arrays.asList(
"db/tag-schema.sql",
// `3.5.3.2` + 版本,支持执行存储过程,如下文件追加 `#$$` 其中 `$$` 为自定义执行完整 SQL 分隔符,
// 存储过程执行脚本 `END` 结尾追加分隔符 `END;$$` 表示脚本结束
"db/procedure.sql#$$",
"D:\\db\\tag-data.sql"
);
}
}
// 切换到 mysql 从库,执行 SQL 脚本
ShardingKey.change("mysqlt2");
ddlScript.run(new StringReader("DELETE FROM user;\n" +
"INSERT INTO user (id, username, password, sex, email) VALUES\n" +
"(20, 'Duo', '123456', 0, '[email protected]');"));
10,参数填充器支持多参数填充
11,更加完善的注入脚本检测处理方法
Wrappers.query()
// 开启自动检查 SQL 注入
.checkSqlInjection().orderByDesc("任意前端传入字段")
// 手动校验方式
SqlInjectionUtils.check("任意前端传入字段")
其它亮点看升级日志,感恩一路支持。
升级日志
-
feat: 升级mybatis至3.5.13,mybatis-spring至2.1.1
-
feat: jsqlparser提供统一解析类,可配置解析函数,并加入缓存选项
-
feat: 增加Sequence初始化debug日志
-
feat: 参数填充器支持多参数填充
-
feat: BaseMapper新增selectMaps(page, wrapper)与selectList(page, wrapper)方法
-
feat: 乐观锁字段支持 java.time.Instant
-
feat:
wrapper#apply
支持配置mapping
比如column={0,javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler}
-
feat: 调整 QueryWrapper 需要主动开启检查 SQL 注入过滤(移除掉wrapper的orderby的sql过滤功能)
-
feat: 新增星瑞格数据库支持
-
feat:
updateWrapper#setSql
方法支持动态入参
参考wrapper#apply
方法 -
feat: 自动 SQL 维护 DDL 支持 SQL 执行存储过程
-
perf:
ktWrapper
加强泛型限制 -
fix: 修复在选择springdoc文档注释时entity描述异常
-
fix: 在主键的
IdType
为AUTO
的情况下,Table#getAllInsertSqlColumnMaybeIf("xx.")
所生成sql错误问题 -
fix: 租户插件支持
update set subSelect
的情况 -
fix: 修复高版本Jdk提示非法反射警告(Illegal reflective access by com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction)
-
fix: 修复高版本Jdk插件动态代理反射错误 (Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible)
-
fix: 修复路径替换将原有的“.”替换成了文件分隔符“/”
-
fix: 修复Beetl模板引擎无法生成注释
-
fix: 修复Types.DOUBLE类型无法映射
-
fix: 修复转换父类公共字段报错
-
fix: 修复生成器无法通过cfg.取值
-
fix: 修复单元测试下MockBean时事务回滚失败
-
fix: 修复Warpper类nonEmptyOfWhere方法命名不规范,导致Ognl未正确缓存带来的执行开销
-
fix: ClickHouseQuery类的tableComment()方法返回表注释字段为comment
-
fix: 修复在选择springdoc文档注释时entity描述异常问题
-
fix: Table#getAllInsertSqlColumnMaybeIf("xx.")下的sql生成错误问题
-
fix: Db类增加根据实体不为空的字段条件查询方法重载
-
fix: 生成器对于Kotlin的Entity文件的superEntityClass的错误
-
fix: 修复springdoc freemarker模式下 表注释取值取不到
-
opt: 增强参数填充处理器,防止因参数名称与填充名称一致类型不匹配导致转换错误
-
opt: 优化方法注入,去除SelectPage,SelectMapsPage,SelectByMap,DeleteByMap注入
-
opt: 减少MappedStatement堆内存占用
-
opt: 解决PluginUtils重复获取元数据带来的性能消耗
-
opt: 注入方法去除多余的换行符
-
opt: 去除SqlRunner持有的sqlSessionFactory变量
-
opt: 解决Sequence初始化多次问题(自定义情况下可不创建默认主键生成器)
-
opt: 优化 SqlHelper#getMapper 返回泛型
-
opt: 去除SqlRunner持有的sqlSessionFactory变量
-
docs: 修正DdlHelper注释错误