MyBatis-Plus3.5.9使用手册
2025-01-29 13:45:01 3 举报
AI智能生成
MyBatis-Plus3.5.9使用手册
作者其他创作
大纲/内容
简介
基本介绍
框架结构
从这里开始
快速开始
数据库Schema
初始化工程
添加依赖
Spring Boot2
Spring Boot3
配置
yml配置
启动类
编码
实体类
映射Mapper
开始使用
安装
概述
Release
Spring Boot2
Spring Boot3
Spring
Solon
注意事项
引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 mybatis-spring-boot-starter和MyBatis-Spring,以避免因版本差异导致的问题
自3.5.4开始,在没有使用mybatis-plus-boot-starter或mybatis-plus-spring-boot3-starter情况下,请自行根据项目情况引入mybatis-spring
Snapshot
快照
快照
Maven
Gradle
Maven bom
Maven
Gradle
配置
概述
Spring Boot 工程
配置 MapperScan 注解
Spring 工程
配置 MapperScan
调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory
单元测试
添加依赖
编写测试类
指南
代码生成器(新)
概述
安装
Maven
Gradle
模板引擎
生成方式
DefaultQuery (元数据查询)
目前存在的问题
不支持使用 NotLike 的方式反向生成表。
无法读取表注释,有解决方法
MySQL链接增加属性 remarks=true&useInformationSchema=true
Oracle链接增加属性 remarks=true 或者 remarksReporting=true(某些驱动版本)
SqlServer:驱动不支持
部分 PostgreSQL 类型处理不佳(如 json、jsonb、uuid、xml、money 类型),有解决方法
转换成自定义的类型配合自定义 TypeHandler 来处理
扩展 typeConvertHandler 来处理(3.5.3.3 后增加了 typeName 获取)
MySQL 下 tinyint 字段转换问题
当字段长度为 1 时,无法转换成 Boolean 字段,建议在指定数据库连接时添加 &tinyInt1isBit=true
当字段长度大于 1 时,默认转换成 Byte,如果想继续转换成 Integer,可使用如下代码
SQLQuery (SQL查询)
使用
快速生成
在 CodeGenerator 中的 main 方法中直接添加生成器代码,并进行相关配置,然后直接运行即可生成代码
交互式生成
交互式生成在运行之后,会提示您输入相应的内容,等待配置输入完整之后就自动生成相关代码
配置
资源
代码生成器
概述
动画附件
示例
使用教程
添加依赖
添加 代码生成器 依赖
模板引擎
Velocity
Freemarker
Beetl
注意事项
编写配置
配置 GlobalConfig
配置 DataSourceConfig
自定义模板引擎
继承AbstractTemplateEngine
自定义代码模板
自定义属性注入
字段其他信息查询注入
示例代码
持久层接口
概述
Service Interface
Service层接口
Service层接口
save
示例(save)
示例(saveBatch)
示例(saveBatch 指定批次大小)
saveOrUpdate
示例(saveOrUpdate)
示例(saveOrUpdateBatch)
示例(saveOrUpdateBatch 指定批次大小)
remove
示例(remove)
示例(removeById)
示例(removeByMap)
示例(removeByIds)
update
示例(update UpdateWrapper 形式)
示例(update WhereWrapper 形式)
示例(updateById)
示例(updateBatchById)
示例(updateBatchById 指定批次大小)
get
示例(getById)
示例(getOne)
示例(getOne 不抛出异常)
示例(getMap)
示例(getObj)
list
示例(list)
示例(list QueryWrapper 形式)
示例(listByIds)
示例(listByMap)
示例(listMaps)
示例(listMaps QueryWrapper 形式)
示例(listObjs)
示例(listObjs QueryWrapper 形式)
page
示例(page)
示例(page QueryWrapper 形式)
示例(pageMaps)
示例(pageMaps QueryWrapper 形式)
count
示例(count)
示例(count QueryWrapper 形式)
Mapper Interface
Dao/Mapper层接口
Dao/Mapper层接口
insert
示例(insert)
delete
示例(delete)
示例(deleteBatchIds)
示例(deleteById)
示例(deleteByMap)
update
示例(update)
示例(updateById)
select
示例(selectById)
示例(selectOne)
示例(selectBatchIds)
示例(selectList)
示例(selectByMap)
示例(selectMaps)
示例(selectObjs)
示例(selectPage)
示例(selectMapsPage)
示例(selectCount)
Mapper 层选装件
选装件说明
alwaysUpdateSomeColumnById
insertBatchSomeColumn
logicDeleteByIdWithFill
使用提示
Chain
链式风格
链式风格
使用步骤
query
update
使用提示
ActiveRecord
使用步骤
继承 Model 类
调用 CRUD 方法
使用提示
SimpleQuery
简单查询
简单查询
使用步骤
引入 SimpleQuery 工具类
使用 SimpleQuery 进行查询
使用提示
功能详解
keyMap
map
group
list
Db Kit
工具箱
工具箱
使用示例
使用提示
条件构造器
概述
主要的 Wrapper类
AbstractWrapper
QueryWrapper
UpdateWrapper
LambdaQueryWrapper
LambdaUpdateWrapper
功能详解
allEq
使用范围
方法签名
示例
普通 Wrapper (QueryWrapper)
Lambda Wrapper (LambdaQueryWrapper)
带过滤器的普通 Wrapper (QueryWrapper)
带过滤器的 Lambda Wrapper (LambdaQueryWrapper)
生成的SQL
eq
使用范围
方法签名
示例
普通 Wrapper (QueryWrapper)
Lambda Wrapper (LambdaQueryWrapper)
生成的SQL
ne
使用范围
方法签名
示例
普通 Wrapper (QueryWrapper)
Lambda Wrapper (LambdaQueryWrapper)
生成的 SQL
gt
使用范围
方法签名
示例
普通 Wrapper (QueryWrapper)
Lambda Wrapper (LambdaQueryWrapper)
生成的 SQL
ge
lt
le
between
notBetween
like
notLike
likeLeft
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
注意事项
likeRight
notLikeLeft
notLikeRight
isNull
in
notIn
inSql
使用范围
方法签名
示例
普通 Wrapper
生成的 SQL
注意事项
notInSql
eqSql
gtSql
geSql
ltSql
leSql
groupBy
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
orderByAsc
orderByDesc
orderBy
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的SQL
having
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
func
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
or
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
OR 嵌套示例
生成的 SQL
and
nested
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
apply
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
使用参数占位符的示例
生成的 SQL
last
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
exists
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
notExists
select
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
使用 Predicate 过滤字段的示例
生成的 SQL
set
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
使用条件控制的示例
生成的 SQL
setSql
使用范围
方法签名
示例
setIncrBy
使用范围
方法签名
示例
普通 Wrapper
Lambda Wrapper
生成的 SQL
setDecrBy
lambda
使用范围
方法签名
示例
从 QueryWrapper 获取 LambdaQueryWrapper
从 UpdateWrapper 获取 LambdaUpdateWrapper
使用 TypeHandler
formatSqlMaybeWithParam方法
使用提示
Wrappers工具类
示例
线程安全性
Wrapper 实例不是线程安全的,因此建议在每次使用时创建新的 Wrapper 实例。
这样可以避免多线程环境下的数据竞争和潜在的错误。
这样可以避免多线程环境下的数据竞争和潜在的错误。
示例
使用 Wrapper 自定义 SQL
注意事项
示例
使用方法
Kotlin持久化对象定义最佳实践
流式查询
概述
常用方法
示例
批量操作
概述
功能概览
类结构说明
MybatisBatch<?>
MybatisBatch.Method<?>
BatchMethod<?>
使用步骤
返回值说明
使用示例
execute方法
示例一:实体类型数据
示例二:非实体类型数据
示例三:自定义方法插入(无注解)
示例四:自定义方法插入(带注解)
saveOrUpdate方法
跨sqlSession示例
共用sqlSession示例
事务处理示例
Spring事务处理示例
自动映射枚举
概述
枚举声明
方式一:注解标记
@EnumValue
@EnumValue
方式二:实现接口
未声明枚举
修改全局 defaultEnumTypeHandler
yml文件中配置
自定义配置类
号外参考: 如何序列化枚举值为前端返回值
Jackson
重写 toString 方法
Spring Boot
Jackson 独立使用
注解处理
Fastjson
重写 toString 方法
全局处理方式
局部处理方式
自动填充字段
概述
原理概述
使用步骤
定义实体类
实现 MetaObjectHandler
配置自动填充处理器
注意事项
参数填充示例
无法填充示例
FieldFill 枚举
自动维护DDL
概述
功能概述
注意事项
代码示例
主键生成策略
概述
主键生成策略概述
示例
Spring Boot 配置
方式一:使用配置类
方式二:通过 MybatisPlusPropertiesCustomizer 自定义
Spring 配置
方式一: XML 配置
方式二:注解配置
自定义ID生成器
概述
ASSIGN_ID
ASSIGN_UUID
如何自定义
Spring Boot 集成
方式一:声明为Bean供Spring扫描注入
方式二:使用配置类
方式三:通过MybatisPlusPropertiesCustomizer自定义
Spring 集成
方式一:XML配置
方式二:注解配置
与KeyGenerator的差异
MyBatis-Plus的IdentifierGenerator主要用于生成数据库表的主键ID,
而KeyGenerator是MyBatis框架中的一个接口,用于在执行SQL语句时生成键值,通常用于生成自增主键或者在执行INSERT语句后获取新生成的ID。
而KeyGenerator是MyBatis框架中的一个接口,用于在执行SQL语句时生成键值,通常用于生成自增主键或者在执行INSERT语句后获取新生成的ID。
IdentifierGenerator更加专注于主键ID的生成,而KeyGenerator则更加通用,可以用于多种键值生成场景。
在使用MyBatis-Plus时,通常推荐使用IdentifierGenerator来生成主键ID,因为它与MyBatis-Plus的集成更加紧密,提供了更多的便利性和功能。
在使用MyBatis-Plus时,通常推荐使用IdentifierGenerator来生成主键ID,因为它与MyBatis-Plus的集成更加紧密,提供了更多的便利性和功能。
逻辑删除支持
概述
逻辑删除的工作原理
支持的数据类型
使用方法
步骤 1: 配置全局逻辑删除属性
步骤 2: 在实体类中使用 @TableLogic 注解
常见问题解答
如何处理插入操作?
删除接口自动填充功能失效怎么办?
多数据源支持
概述
dynamic-datasource
特性
约定
使用方法
引入依赖
SpringBoot2
SpringBoot3
配置数据源
使用 @DS 切换数据源
mybatis-mate
特性
使用方法
SQL分析与打印
概述
p6spy简介
示例工程
依赖引入
配置
application.yml
spy.properties
Spring Boot集成
依赖
配置
注意事项
数据安全保护
概述
配置安全
YML配置加密
密钥加密
如何使用
数据安全
SQL注入安全防护
自动检查
手动校验
SQL注入器
概述
使用场景
自定义查询方法:当标准的CRUD操作无法满足复杂的查询需求时,可以通过SQL注入器添加自定义的查询方法。
复杂数据处理:在需要进行复杂的数据处理,如多表联结、子查询、聚合函数等时,SQL注入器可以帮助生成相应的SQL语句。
性能优化:通过自定义SQL语句,可以针对特定的查询场景进行性能优化。
数据权限控制:在需要根据用户权限动态生成SQL语句时,SQL注入器可以用来实现数据权限的控制。
遗留系统迁移:在将遗留系统迁移到MyBatis-Plus时,可能需要保留原有的SQL语句结构,SQL注入器可以帮助实现这一过渡。
功能
注入自定义SQL方法:通过实现ISqlInjector接口,可以注入自定义的SQL方法到MyBatis容器中,这些方法可以是任何复杂的SQL查询。
扩展BaseMapper:可以在继承BaseMapper的基础上,通过SQL注入器添加额外的查询方法,这些方法将自动被MyBatis-Plus识别和使用。
灵活的SQL生成:SQL注入器提供了灵活的SQL生成机制,可以根据业务需求生成各种SQL语句,包括但不限于SELECT、INSERT、UPDATE、DELETE等。
集成第三方数据库功能:如果需要使用数据库的特定功能,如存储过程、触发器等,SQL注入器可以帮助生成调用这些功能的SQL语句。
动态SQL支持:在某些场景下,SQL语句需要根据运行时的条件动态生成,SQL注入器可以支持这种动态SQL的生成。
注入器配置
自定义全局方法攻略
定义SQL
注册自定义方法
定义BaseMapper
配置SqlInjector
注意事项
更多示例
字段类型处理器
概述
JSON 字段类型处理器
配置
XML 配置对应写法
Wrapper 查询中的 TypeHandler 使用
自定义类型处理器
创建自定义类型处理器
使用自定义类型处理器
高级特性
Mybatis X 插件
概述
安装指南
核心功能
XML 映射跳转
代码生成
重置模板
JPA 风格提示
生成新增操作
生成查询操作
生成修改操作
生成删除操作
常见问题解答
JPA 提示功能无法使用?
生成的表名与预期不符?
代码生成模板配置
默认模板
重置默认模板
自定义模板内容
插件
插件主体
概述
MybatisPlusInterceptor 概览
属性
InnerInterceptor 接口
使用示例
Spring 配置
Spring Boot 配置
mybatis-config.xml 配置
拦截忽略注解 @InterceptorIgnore
手动设置拦截器忽略执行策略
本地缓存 SQL 解析
分页插件
概述
支持的数据库
配置方法
属性介绍
overflow,boolean,false,溢出总页数后是否进行处理
maxLimit,Long,单页分页条数限制
dbType,DbType,数据库类型
dialect,IDialect,方言实现类
自定义 Mapper 方法中使用分页
方法签名
xml配置
说明
其他注意事项
生成 countSql 时,如果 left join 的表不参与 where 条件,会将其优化掉。
建议在任何带有 left join 的 SQL 中,都给表和字段加上别名。
建议在任何带有 left join 的 SQL 中,都给表和字段加上别名。
在使用多个插件时,请将分页插件放到插件执行链的最后面,以避免 COUNT SQL 执行不准确的问题。
Page类
乐观锁插件
概述
乐观锁的实现原理
读取记录时,获取当前的版本号(version)
在更新记录时,将这个版本号一同传递。
执行更新操作时,设置 version = newVersion 的条件为 version = oldVersion
如果版本号不匹配,则更新失败。
配置乐观锁插件
配置插件
XML形式
注解形式
在实体类字段上添加 @Version 注解
注意事项
示例
多租户插件
概述
示例工程
属性介绍
使用方法
实现租户处理器
将租户处理器注入插件
本地缓存SQL解析
插入时自动添加租户字段
注意事项
多租户不等于权限过滤,租户之间是完全隔离的。
启用多租户后,所有执行的 method 的 SQL 都会进行处理。
自定义的 SQL 请按规范书写,特别是涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join。
数据权限插件
概述
插件原理
插件地址和测试用例
核心代码
JSQLParser
使用方法
实现数据权限逻辑
注册数据权限拦截器
动态表名插件
概述
插件简介
快速开始
配置拦截器
使用动态表名
注意事项
为了防止误替换,建议将动态表名定义得复杂一些,例如使用前缀 mp_dt_。
确保你的表名规则不会导致 SQL 注入等安全问题。
在配置动态表名时,要考虑到数据库的兼容性,确保替换后的表名符合数据库的命名规则。
示例项目
数据变动记录插件
概述
插件简介
如何使用
配置拦截器
使用插件
注意事项
确保在配置拦截器时设置了合适的安全阈值,以防止不安全的批量操作。
插件会自动记录数据变动,但你需要自行实现日志记录的逻辑。
在配置和使用插件时,要考虑到数据库的性能和操作的实际需求。
非法SQL拦截插件
简介
功能特性
使用方法
java示例
xml示例
防全表更新与删除插件
概述
功能特性
使用方法
注入插件
配置拦截规则
测试示例
全表更新测试
部分表更新测试
参考
使用配置
概述
使用方式
Spring Boot 配置
Spring MVC 配置
Base
configLocation
mapperLocations
typeAliasesPackage
typeAliasesSuperType
typeHandlersPackage
typeEnumsPackage
checkConfigLocation
executorType
configurationProperties
configuration
globalConfig
Configuration
mapUnderscoreToCamelCase
defaultEnumTypeHandler
aggressiveLazyLoading
autoMappingBehavior
autoMappingUnknownColumnBehavior
localCacheScope
cacheEnabled
callSettersOnNulls
configurationFactory
GlobalConfig
banner
enableSqlRunner
sqlInjector
superMapperClass
metaObjectHandler
identifierGenerator
dbConfig
DbConfig
idType
tablePrefix
schema
columnFormat
tableFormat
propertyFormat
tableUnderline
capitalMode
keyGenerator
logicDeleteField
logicDeleteValue
logicNotDeleteValue
insertStrategy
updateStrategy
whereStrategy
注解配置
概述
@TableName
value
schema
keepGlobalPrefix
resultMap
autoResultMap
excludeProperty
@TableId
value
type
@TableField
value
exist
condition
示例
update
示例
insertStrategy
示例
等价XML配置
updateStrategy
示例
whereStrategy
示例
等价XML
fill
示例
select
示例
keepGlobalFormat
jdbcType
示例
typeHandler
示例
numericScale
示例
关于 numericScale、jdbcType、typeHandler 的说明
numericScale 属性仅在 update 操作时生效。
jdbcType 和 typeHandler 属性如果不与 @TableName 中的 autoResultMap = true 一起使用,也仅在 update 操作时生效。
对于 typeHandler,如果字段类型和设置的值类型是 equals 关系,则只需确保 typeHandler 被 MyBatis 加载到,不需要使用注解。
@Version
@EnumValue
@TableLogic
@KeySequence
@InterceptorIgnore
@OrderBy
代码生成器配置-新
概述
特点说明
Builder 模式:通过 builder 模式,开发者可以链式调用配置方法,直观地构建代码生成器的配置,使得代码更加清晰易读。
快速配置:新代码生成器提供了快速配置选项,如全局配置、包配置、策略配置等,可以一键设置常用选项,快速启动代码生成过程。
模板引擎:支持 Freemarker 等模板引擎,允许开发者自定义代码模板,以生成符合项目特定风格的代码。
Lombok 集成:新代码生成器默认启用 Lombok,减少了样板代码的编写,提高了代码的可读性和维护性。
多数据库支持:支持多种数据库类型,如 MySQL、Oracle、SQL Server 等,只需配置相应的数据库连接信息即可。
灵活的数据源配置:提供了丰富的数据源配置选项,包括数据库查询方式、类型转换器、关键字处理器等,满足不同数据库的需求。
示例配置
数据库配置-DataSourceConfig
基础配置
url
username
password
可选配置
dbQuery(IDbQuery)
schema(String)
typeConvert(ITypeConvert)
keyWordsHandler(IKeyWordsHandler)
typeConvertHandler(ITypeConvertHandler)
databaseQueryClass(AbstractDatabaseQuery)
全局配置
方法说明
disableOpenDir()
outputDir(String)
author(String)
enableKotlin()
enableSwagger()
dateType(DateType)
commentDate(String)
示例配置
包配置
方法说明
parent(String)
moduleName(String)
entity(String)
service(String)
serviceImpl(String)
mapper(String)
xml(String)
controller(String)
pathInfo(Map<OutputFile, String>)
示例配置
模板配置
方法说明
entityBuilder()
javaTemplate(String)
disable()
serviceBuilder()
disableService()
serviceTemplate(String)
serviceImplTemplate(String)
示例配置
注入配置
方法说明
beforeOutputFile(BiConsumer<TableInfo, Map<String, Object>>)
customMap(Map<String, Object>)
customFile(Map<String, String>)
示例配置
策略配置
方法说明
enableCapitalMode
enableSkipView
disableSqlFilter
enableSchema
likeTable(LikeTable)
notLikeTable(LikeTable)
addInclude(String…)
addExclude(String…)
addTablePrefix(String…)
addTableSuffix(String…)
addFieldPrefix(String…)
addFieldSuffix(String…)
outputFile
entityBuilder
controllerBuilder
mapperBuilder
serviceBuilder
示例配置
Entity 策略配置
方法说明
nameConvert(INameConvert)
superClass(Class<?>)
superClass(String)
disableSerialVersionUID
enableFileOverride
enableColumnConstant
enableChainModel
enableLombok
enableRemoveIsPrefix
enableTableFieldAnnotation
enableActiveRecord
versionColumnName(String)
versionPropertyName(String)
logicDeleteColumnName(String)
logicDeletePropertyName(String)
naming
columnNaming
addSuperEntityColumns(String…)
addIgnoreColumns(String…)
addTableFills(IFill…)
addTableFills(List<IFill>)
idType(IdType)
convertFileName(ConverterFileName)
formatFileName(String)
toString(boolean)
fieldUseJavaDoc
classAnnotations(ClassAnnotationAttributes)
tableAnnotationHandler
tableFieldAnnotationHandler
enableLombok(ClassAnnotationAttributes…)
示例配置
Controller 策略配置
方法说明
superClass(Class<?>)
superClass(String)
enableFileOverride
enableHyphenStyle
enableRestStyle
convertFileName(ConverterFileName)
formatFileName(String)
示例配置
Service 策略配置
方法说明
superServiceClass(Class<?>)
superServiceClass(String)
superServiceImplClass(Class<?>)
superServiceImplClass(String)
enableFileOverride
convertServiceFileName(ConverterFileName)
convertServiceImplFileName(ConverterFileName)
formatServiceFileName(String)
示例配置
Mapper 策略配置
方法说明
superClass(Class<?>)
superClass(String)
enableFileOverride
enableMapperAnnotation
enableBaseResultMap
enableBaseColumnList
cache(Class<? extends Cache>)
convertMapperFileName(ConverterFileName)
convertXmlFileName(ConverterFileName)
formatMapperFileName(String)
formatXmlFileName(String)
generateMapperMethodHandler
示例配置
自定义模板支持配置
注意
代码生成器配置
预防安全漏洞
概述
什么是漏洞?
SQL 注入漏洞
如何预防漏洞
表字段部分
字段参数/变量部分
使用工具类预防
注意
关于恶意漏洞的说明
CVE-2024-35548
CVE-2023-25330
CVE-2022-25517
常见问题
如何排除非表中字段?
使用 transient 修饰
使用 static 修饰
使用 TableField 注解
如何排除实体父类属性?
使用 transient 修饰需要排除的父类属性
出现 `lnvalid bound statement (not found)`异常
检查是否存在 jar 包冲突。
检查 Mapper.java 的扫描路径:
在 Configuration 类上使用注解 MapperScan
在 Configuration 类中配置 MapperScannerConfigurer
检查是否指定了主键。
不要使用原生的 SqlSessionFactory,请使用 MybatisSqlSessionFactory。
检查是否自定义了 SqlInjector,是否复写了 getMethodList() 方法。
在该方法中是否注入了你需要的方法(可参考 DefaultSqlInjector)。
在该方法中是否注入了你需要的方法(可参考 DefaultSqlInjector)。
IDEA 默认的 build 步骤可能会导致 mapper 文件无法正常编译到对应的 resources 文件夹中。
请检查 build 后相关资源文件夹是否有对应的 XML 文件。
如果没有,请调整 IDEA 的 build 设置。
推荐调整为 Maven 或 Gradle 的 build。
请检查 build 后相关资源文件夹是否有对应的 XML 文件。
如果没有,请调整 IDEA 的 build 设置。
推荐调整为 Maven 或 Gradle 的 build。
自定义SQL无法执行
启动异常时异常问题排查
java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
Injection of autowired
java.lang.NoSuchMethodError: org.apache.ibatis.session.Configuration.getDefaultScriptingLanguageInstance() Lorg/apache/ibatis/scripting/LanguageDriver
关于Long型主键填充不生效的问题
生成主键太长导致JS精度丢失
FastJson 处理方式
JackJson 处理方式
方式一
方式二
比较一般的处理方式
插入或更新的字段有空字符串或者'null'
方式一:调整全局的验证策略
方式二:调整字段验证注解
方式三:使用 UpdateWrapper (3.x)
字段类型为`bit`、`tinyint(1)`时映射为`boolean`类型
方式一:修改类型tinyint(1)为tinyint(2)或者int
方式二:需要修改请求连接添加参数 tinyInt1isBit=false
出现2个limit语句
原因:配了 2 个分页拦截器! 检查配置文件或者代码,只留一个!
insert后如何返回主键
insert 后主键会自动 set 到实体的 ID 字段,所以你只需要 getId() 就好
MP如何查看指定的几个字段?
EntityWrapper.sqlSelect 配置你想要查询的字段
Mapper二级缓存问题
我们建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现。
Mapper 层二级缓存刷新问题
方式一
方式二
'Cause: org.apache.ibatis.type.TypeException:Error setting null for parameter #1 with JdbcType OTHER’
Spring Bean 配置方式
yml配置
无法通过Page对象在自定义的SQL中传递参数
使用自定义的 Map 对象或者普通的 Java 对象来传递参数。
通过在方法参数中使用 @Param(“page”) int page, @Param(“size”) int size 来传递页码和每页大小。
如何使用Map下划线自动转驼峰
如何在Wrapper中使用limit限制sql
为什么将通用的批量操作放到Service层处理
SQL 长度存在限制:处理海量数据时,单条 SQL 可能无法执行或者容易引起内存泄漏、JDBC 连接超时等问题。
不同数据库的单条 SQL 批量语法不一致,不利于通用性。
解决方案:采用循环预处理批量提交的方法。虽然性能比单条 SQL 插入稍慢,但可以解决上述问题。
3.x版本中数据库关键字处理方法
MybatisPlusException: Your property named "xxx" cannot find the corresponding database column name!
Error attempting to get column "create time" from result set. Cause java.sql.SQLFeatureNotSupportedException
将 Druid 数据源升级至 1.1.21 版本以上,以解决此问题。
如果无法升级 Druid 数据源,可以选择保持 MyBatis Plus 版本在 3.1.0 及之前的版本。
若要继续使用最新的 MyBatis Plus 版本,可以考虑更换其他兼容新版 JDBC 的数据源,以避免出现此异常。
升级 MyBatis Plus 到 3.1.1 及更高版本后,新日期类型无法映射报错
升级您的 JDBC 驱动至支持 JDBC 4.2 API 的版本。
如果无法升级 JDBC 驱动,可以考虑将 MyBatis Plus 版本回滚至 3.1.0 或之前的版本。
Failed to bind properties under "mybatis-plus.configuration.incomplete-resultmaps[0].assistant.configuration.mapped-statements[0].parameter-map.parametermappings[0]" to org.apache.ibatis.mapping.ParameterMapping
将 Spring Boot 降级至 2.1.x 版本,或升级至 2.2.1 版本以上。
建议直接升级至 Spring Boot 2.2.2 版本以获取更好的稳定性和修复。
建议直接升级至 Spring Boot 2.2.2 版本以获取更好的稳定性和修复。
分离打包部署出现 ClassNotFoundException
方式一:去除 spring-boot-maven-plugin 插件进行打包
方式二:升级至 MyBatis Plus 3.3.2 版本
启用 MyBatis 内部日志记录
方式一: 在您的 application.yml 或 application.properties 文件中添加以下配置
方式二: 在您的 application.yml 或 application.properties 文件中增加日志级别配置,以指定特定包的日志级别。
如何在 update 时对字段进行自增操作
如何全局处理数据库关键词
如何在 XML 中根据数据库类型选择不同的 SQL 片段
为何 MyBatis Plus 不支持复合主键,强制唯一ID 问题解答
增加了表与表之间的相互依赖性:使用复合主键会使表与表之间的关系更加复杂,增加了维护和管理的难度。
增加了数据复杂的约束、规则:复合主键会增加数据的约束和规则,例如需要约束唯一性,而完全可以使用联合索引来实现。
增加了更新数据的限制:在更新数据时,需要更新所有复合主键的值,这增加了更新操作的限制和复杂性。
严重的数据冗余和更新异常问题:复合主键可能导致数据冗余和更新异常的问题,特别是在大型系统中,可能会出现更新异常的情况。
性能问题:使用复合主键时,查询某个 ID 时无法使用索引,会导致性能下降。
综上所述,虽然使用复合主键可以省去一个 ID 字段,但是这种做法的缺点大于优点,不建议也不推荐这样做。
MyBatis Plus 坚持使用唯一的 ID,以保证数据管理的简单性、可维护性和性能。
MyBatis Plus 坚持使用唯一的 ID,以保证数据管理的简单性、可维护性和性能。
项目启动速度缓慢
初始化默认雪花ID导致
查看本机hostname
编辑系统hosts文件,将本机hostname写入至hosts文件
检查数据库连接池初始化
3.5.7+ 版本 Db.saveBatch 返回值一直为 false
驱动连接去掉 rewriteBatchedStatements=true 配置
Page或List返回的结果集为null或者包含部分null元素
配置returnInstanceForEmptyRow 为true
当返回值为Map或List<Map>时,nul值对应的key没有添加至Map里
配置callSettersOnNulls 为true
如何重写BaseMapper方法
0 条评论
下一页