网站开发实训步骤,重庆网站快速排名提升,服装微商城网站建设,深圳珠宝品牌网站设计MyBatis-Plus时Mybatis的Best Partner
MyBatis-Plus (opens new window)#xff08;简称 MP#xff09;是一个 MyBatis (opens new window)的增强工具#xff0c;在 MyBatis 的基础上只做增强不做改变#xff0c;为简化开发、提高效率而生。
特性
无侵入损耗小强大的 CR…MyBatis-Plus时Mybatis的Best Partner
MyBatis-Plus (opens new window)简称 MP是一个 MyBatis (opens new window)的增强工具在 MyBatis 的基础上只做增强不做改变为简化开发、提高效率而生。
特性
无侵入损耗小强大的 CRUD 操作支持 Lambda 形式调用支持主键自动生成支持 ActiveRecord 模式支持自定义全局通用操作内置代码生成器内置分页插件分页插件支持多种数据库内置性能分析插件内置全局拦截插件
#支持数据库
框架结构 引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 mybatis-spring-boot-starter和MyBatis-Spring以避免因版本差异导致的问题
注解
TableName
描述表名注解标识实体类对应的表
使用位置实体类
注意: 默认是以对象名为表名可以配置全局配置名字增加前缀
也可以用TableName进行注释表名如下同时配置注解生效
。TableName(sys_user) public class User { private Long id; private String name; private Integer age; private String email; } 属性 类型 必须指定 默认值 描述 value String 否 表名 schema String 否 schema keepGlobalPrefix boolean 否 false 是否保持使用全局的 tablePrefix 的值当全局 tablePrefix 生效时 resultMap String 否 xml 中 resultMap 的 id用于满足特定类型的实体类对象绑定 autoResultMap boolean 否 false 是否自动构建 resultMap 并使用如果设置 resultMap 则不会进行 resultMap 的自动构建与注入 excludeProperty String[] 否 {} 需要排除的属性名 since 3.3.1
关于 autoResultMap 的说明
MP 会自动构建一个 resultMap 并注入到 MyBatis 里一般用不上请注意以下内容
因为 MP 底层是 MyBatis所以 MP 只是帮您注入了常用 CRUD 到 MyBatis 里注入之前是动态的根据您的 Entity 字段以及注解变化而变化但是注入之后是静态的等于 XML 配置中的内容。
而对于 typeHandler 属性MyBatis 只支持写在 2 个地方:
定义在 resultMap 里作用于查询结果的封装定义在 insert update #{property} property #{property,typehandlerxxx.xxx.xxx} 设置值
除了以上两种直接指定 typeHandler 的形式MyBatis 有一个全局扫描自定义 typeHandler 包的配置原理是根据您的 property 类型去找其对应的 typeHandler 并使用。
TableId
描述主键注解
使用位置实体类主键字段
TableName(sys_user) public class User { TableId private Long id; private String name; private Integer age; private String email; } 属性 类型 必须指定 默认值 描述 value String 否 主键字段名 type Enum 否 IdType.NONE 指定主键类型在不写type类型的时候默认为雪花算法
IdType
需要提前设置数据库自增
如果需要自己写主键可以自己配置全局的主键生成策略 值 描述 AUTO 数据库 ID 自增需要设置数据库的递增 NONE 无状态该类型为未设置主键类型注解里等于跟随全局全局里约等于 INPUT INPUT insert 前自行 set 主键值 ASSIGN_ID 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口 IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) ASSIGN_UUID 分配 UUID,主键类型为 String(since 3.3.0),使用接口 IdentifierGenerator的方法nextUUID (默认 default 方法) ID_WORKER 分布式全局唯一 ID 长整型类型(pleaseuseASSIGN_ID) UUID 32 位 UUID 字符串(please use ASSIGN_UUID ) ID_WORKER_STR 分布式全局唯一 ID 字符串类型(please use ASSIGN_ID )
TableField
描述字段注解非主键
TableName(sys_user) public class User { TableId private Long id; TableField(nickname) private String name; private Integer age; private String email; } 属性 类型 必须指定 默认值 描述 value String 否 数据库字段名 exist boolean 否 true 是否为数据库表字段 condition String 否 字段 where 实体查询比较条件有值设置则按设置的值为准没有则为默认全局的 %s#{%s} 参考
Version
描述乐观锁注解标记version在字段上
EnumValue
描述普通枚举类注解(标注在枚举字段上)
TableLogic
描述表字段逻辑处理注解(逻辑删除) 属性 类型 必须指定 默认值 描述 value String 否 逻辑未删除值 delval String 否 逻辑删除值
OrderBy
描述内置Sql默认指定排序优先级低于wrapper条件查询 属性 类型 必须指定 默认值 描述 asc boolean 否 true 是否倒序查询 sort short 否 Short.MAX_VALUE 数字越小越靠前
Mapper
写在Dao类上将类注入Spring容器中
MapperScan()
MapperScan(value {com.aqiuo.dao})
写在启动类上将需要扫描的包写在value中
CRUD接口
Service CRUD 接口
说明: 通用 Service CRUD 封装IService (opens new window)
get 查询单行 remove 删除list 查询集合page 分页Mapper 泛型 T 为任意实体对象 建议如果存在自定义通用 Service 方法的可能请创建自己的 IBaseService 基础 Mybatis-Plus 的基类 对象 Wrapper 为 条件构造器
save
// 插入一条记录选择字段策略插入 boolean save(T entity); // 插入批量 boolean saveBatch(CollectionT entityList); // 插入批量 boolean saveBatch(CollectionT entityList, int batchSize);
参数说明 类型 参数名 描述 T entity 实体对象 Collection entityList 实体对象集合 int batchSize 插入批次数量
SaveOrUpdate
// TableId 注解存在更新记录否插入一条记录
//如果有这个记录则修改记录如果没有就插入记录
//如果没有id就是插入有就是修改
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, WrapperT updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(CollectionT entityList);
// 批量修改插入
boolean saveOrUpdateBatch(CollectionT entityList, int batchSize);
参数说明 类型 参数名 描述 T entity 实体对象 Wrapper updateWrapper 实体对象封装操作类 UpdateWrapper Collection entityList 实体对象集合 int batchSize 插入批次数量
Remove
// 根据 queryWrapper 设置的条件删除记录
boolean remove(WrapperT queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件删除记录map存的条件
boolean removeByMap(MapString, Object columnMap);
// 删除根据ID 批量删除
boolean removeByIds(Collection? extends Serializable idList);
参数说明 类型 参数名 描述 Wrapper queryWrapper 实体包装类 QueryWrapper Serializable id 主键 ID Map columnMap 表字段 map 对象 Collection idList 主键 ID 列表
Update
注意updateById才能根据id修改内容其他的要用wrapper
// 根据 UpdateWrapper 条件更新记录 需要设置sqlset
boolean update(WrapperT updateWrapper);
// 根据 whereWrapper 条件更新记录
boolean update(T updateEntity, WrapperT whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(CollectionT entityList);
// 根据ID 批量更新
boolean updateBatchById(CollectionT entityList, int batchSize);
参数说明 类型 参数名 描述 Wrapper updateWrapper 实体对象封装操作类 UpdateWrapper T entity 实体对象 Collection entityList 实体对象集合 int batchSize 更新批次数量
Get
// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper查询一条记录。结果集如果是多个会抛出异常随机取一条加上限制条件 wrapper.last(LIMIT 1)
T getOne(WrapperT queryWrapper);
// 根据 Wrapper查询一条记录
T getOne(WrapperT queryWrapper, boolean throwEx);
// 根据 Wrapper查询一条记录
MapString, Object getMap(WrapperT queryWrapper);
// 根据 Wrapper查询一条记录
V V getObj(WrapperT queryWrapper, Function? super Object, V mapper);
参数说明 类型 参数名 描述 Serializable id 主键 ID Wrapper queryWrapper 实体对象封装操作类 QueryWrapper boolean throwEx 有多个 result 是否抛出异常 T entity 实体对象 Function mapper 转换函数
List
// 查询所有
ListT list();
// 查询列表
ListT list(WrapperT queryWrapper);
// 查询根据ID 批量查询
CollectionT listByIds(Collection? extends Serializable idList);
// 查询根据 columnMap 条件
CollectionT listByMap(MapString, Object columnMap);
// 查询所有列表
ListMapString, Object listMaps();
// 查询列表
ListMapString, Object listMaps(WrapperT queryWrapper);
// 查询全部记录
ListObject listObjs();
// 查询全部记录
V ListV listObjs(Function? super Object, V mapper);
// 根据 Wrapper 条件查询全部记录
ListObject listObjs(WrapperT queryWrapper);
// 根据 Wrapper 条件查询全部记录
V ListV listObjs(WrapperT queryWrapper, Function? super Object, V mapper);
参数说明 类型 参数名 描述 Wrapper queryWrapper 实体对象封装操作类 QueryWrapper Collection idList 主键 ID 列表 Map columnMap 表字段 map 对象 Function mapper 转换函数
Page
// 无条件分页查询
IPageT page(IPageT page);
// 条件分页查询
IPageT page(IPageT page, WrapperT queryWrapper);
// 无条件分页查询
IPageMapString, Object pageMaps(IPageT page);
// 条件分页查询
IPageMapString, Object pageMaps(IPageT page, WrapperT queryWrapper);
参数说明 类型 参数名 描述 IPage page 翻页对象 Wrapper queryWrapper 实体对象封装操作类 QueryWrapper
Count
// 查询总记录数 int count(); // 根据 Wrapper 条件查询总记录数 int count(WrapperT queryWrapper);
参数说明 类型 参数名 描述 Wrapper queryWrapper 实体对象封装操作类 QueryWrapper
Chain
query (返回值类型是lanmdateQuery)
(存在有一个静态方法引用非静态方法的问题)
// 链式查询 普通
QueryChainWrapperT query();
// 链式查询 lambda 式。注意不支持 Kotlin
LambdaQueryChainWrapperT lambdaQuery();// 示例
query().eq(column, value).one();
lambdaQuery().eq(Entity::getId, value).list();
update(返回值是LamdaQueryWrapper)
// 链式更改 普通
UpdateChainWrapperT update();
// 链式更改 lambda 式。注意不支持 Kotlin
LambdaUpdateChainWrapperT lambdaUpdate();// 示例
update().eq(column, value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);
Mapper CRUD 接口
说明: 通用 CRUD 封装BaseMapper接口为Mybatis-Plus启动时自动解析实体表关系映射转换为Mybatis内部对象注入容器 泛型 T 为任意实体类对象 参数 Serializable为任意类型的主键Mybatis-Plus不推荐使用复合主键约定每一张表都有自己唯一的id主键 对象Wrapper 条件构造器
Insert
// 插入一条记录 int insert(T entity);
参数说明 类型 参数名 描述 T entity 实体对象
Delete
// 根据 entity 条件删除记录 int delete(Param(Constants.WRAPPER) WrapperT wrapper); // 删除根据ID 批量删除 int deleteBatchIds(Param(Constants.COLLECTION) Collection? extends Serializable idList); // 根据 ID 删除 int deleteById(Serializable id); // 根据 columnMap 条件删除记录 int deleteByMap(Param(Constants.COLUMN_MAP) MapString, Object columnMap);
参数说明 类型 参数名 描述 Wrapper wrapper 实体对象封装操作类可以为 null Collection idList 主键 ID 列表(不能为 null 以及 empty) Serializable id 主键 ID Map columnMap 表字段 map 对象
Update
// 根据 whereWrapper 条件更新记录 int update(Param(Constants.ENTITY) T updateEntity, Param(Constants.WRAPPER) WrapperT whereWrapper); // 根据 ID 修改 int updateById(Param(Constants.ENTITY) T entity);
使用提示:
在调用updateById方法前需要在T entity对应的实体类中的主键属性上加上TableId注解。
参数说明 类型 参数名 描述 T entity 实体对象 (set 条件值,可为 null) Wrapper updateWrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句
Select
// 根据 ID 查询 T selectById(Serializable id); // 根据 entity 条件查询一条记录 T selectOne(Param(Constants.WRAPPER) WrapperT queryWrapper); // 查询根据ID 批量查询 ListT selectBatchIds(Param(Constants.COLLECTION) Collection? extends Serializable idList); // 根据 entity 条件查询全部记录 ListT selectList(Param(Constants.WRAPPER) WrapperT queryWrapper); // 查询根据 columnMap 条件 ListT selectByMap(Param(Constants.COLUMN_MAP) MapString, Object columnMap); // 根据 Wrapper 条件查询全部记录 ListMapString, Object selectMaps(Param(Constants.WRAPPER) WrapperT queryWrapper); // 根据 Wrapper 条件查询全部记录。注意 只返回第一个字段的值 ListObject selectObjs(Param(Constants.WRAPPER) WrapperT queryWrapper); // 根据 entity 条件查询全部记录并翻页 IPageT selectPage(IPageT page, Param(Constants.WRAPPER) WrapperT queryWrapper); // 根据 Wrapper 条件查询全部记录并翻页 IPageMapString, Object selectMapsPage(IPageT page, Param(Constants.WRAPPER) WrapperT queryWrapper); // 根据 Wrapper 条件查询总记录数 Integer selectCount(Param(Constants.WRAPPER) WrapperT queryWrapper);
参数说明 类型 参数名 描述 Serializable id 主键 ID Wrapper queryWrapper 实体对象封装操作类可以为 null Collection idList 主键 ID 列表(不能为 null 以及 empty) Map columnMap 表字段 map 对象 IPage page 分页查询条件可以为 RowBounds.DEFAULT
条件构造器
说明
以下出现的第一个入参 boolean condition 表示该条件是否加入最后生成的sql语句中例如 query.like(StringUtils.isNotBlank(name),Entity::getName,name).eq(age!null age0,Entity::getAge,age)以下代码块内的多个方法均从上往下补全个别 boolean 类别的入参默认为 true以下方法在入参中出现的 R 为泛型在普通wrapper中 是String, 在 LambdaWrapper 中是函数 例如 Entity::getId,Entity 为实体类getId 为字段 id 的getter Method)
以下方法入参中的 R column 均为数据库字段当 R 具体类型为 String 时则为数据库字段名字段名是数据库关键字的自己用转义符包裹!以下举例均为使用普通wrapper ,入参为Map 和List 的均以json形式表现如果入参的Map或者List为空则不会加入最后生成的SQL中
警告
wrapper 很重传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr
AbstractWrapper
说明:
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类
用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件
注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为
allEq
allEq(MapR, V params) allEq(MapR, V params, boolean null2IsNull) allEq(boolean condition, MapR, V params, boolean null2IsNull)
全部eq(或个别isNull
个别参数说明
params : key 为数字库字段名 value为 字段值null2IsNull: 为true,则 在 map 的value为null时调用isNull方法为false则忽略value的值为null的
例一allEq({id:1,name:老王,age:null}) ---id 1 and name 老王 and age is null
例二allEq({id:1,name:老王,age:null}, false)--id 1 and name 老王
eq
eq(R column, Object val) eq(boolean condition, R column, Object val)
等于
例: eq(name, 老王) - -- name 老王
ne
ne(R column, Object val) ne(boolean condition, R column, Object val)
不等于
例 ne(name, 老王) --- name 老王
gt
gt(R column, Object val) gt(boolean condition, R column, Object val)
大于 例gt(age,18) - - - age18
ge
ge(R column, Object val) ge(boolean condition, R column, Object val)
大于等于 例: ge(age, 18) -- age 18
lt
lt(R column, Object val) lt(boolean condition, R column, Object val)
小于例: lt(age, 18)---age 18
#le
le(R column, Object val) le(boolean condition, R column, Object val)
小于等于例: le(age, 18)---age
#between
between(R column, Object val1, Object val2) between(boolean condition, R column, Object val1, Object val2)
BETWEEN 值1 AND 值2例: between(age, 18, 30)---age between 18 and 30
#notBetween
notBetween(R column, Object val1, Object val2) notBetween(boolean condition, R column, Object val1, Object val2)
NOT BETWEEN 值1 AND 值2例: notBetween(age, 18, 30)---age not between 18 and 30
#like
like(R column, Object val) like(boolean condition, R column, Object val)
LIKE %值%例: like(name, 王)---name like %王%
#notLike
notLike(R column, Object val) notLike(boolean condition, R column, Object val)
NOT LIKE %值%例: notLike(name, 王)---name not like %王%
#likeLeft
likeLeft(R column, Object val) likeLeft(boolean condition, R column, Object val)
LIKE %值例: likeLeft(name, 王)---name like %王
likeRight
likeRight(R column, Object val) likeRight(boolean condition, R column, Object val)
LIKE 值%例: likeRight(name, 王)---name like 王%
notLikeLeft
notLikeLeft(R column, Object val) notLikeLeft(boolean condition, R column, Object val)
NOT LIKE %值例: notLikeLeft(name, 王)---name not like %王
notLikeRight
notLikeRight(R column, Object val) notLikeRight(boolean condition, R column, Object val)
NOT LIKE 值%例: notLikeRight(name, 王)---name not like 王%
#isNull
isNull(R column) isNull(boolean condition, R column)
字段 IS NULL例: isNull(name)---name is null
isNotNull
isNotNull(R column) isNotNull(boolean condition, R column)
字段 IS NOT NULL例: isNotNull(name)---name is not null
in
in(R column, Collection? value) in(boolean condition, R column, Collection? value)
字段 IN (value.get(0), value.get(1), ...)例: in(age,{1,2,3})---age in (1,2,3)
in(R column, Object... values) in(boolean condition, R column, Object... values)
字段 IN (v0, v1, ...)例: in(age, 1, 2, 3)---age in (1,2,3)
notIn
notIn(R column, Collection? value) notIn(boolean condition, R column, Collection? value)
字段 NOT IN (value.get(0), value.get(1), ...)例: notIn(age,{1,2,3})--age not in (1,2,3)
notIn(R column, Object... values) notIn(boolean condition, R column, Object... values)
字段 NOT IN (v0, v1, ...)例: notIn(age, 1, 2, 3)---age not in (1,2,3)
inSql
inSql(R column, String inValue) inSql(boolean condition, R column, String inValue)
字段 IN ( sql语句 )例: inSql(age, 1,2,3,4,5,6)---age in (1,2,3,4,5,6)例: inSql(id, select id from table where id 3)---id in (select id from table where id 3)
notInSql
notInSql(R column, String inValue) notInSql(boolean condition, R column, String inValue)
字段 NOT IN ( sql语句 )例: notInSql(age, 1,2,3,4,5,6)---age not in (1,2,3,4,5,6)例: notInSql(id, select id from table where id 3)---id not in (select id from table where id 3)
groupBy
groupBy(R... columns) groupBy(boolean condition, R... columns)
分组GROUP BY 字段, ...例: groupBy(id, name)---group by id,name
orderByAsc
orderByAsc(R... columns) orderByAsc(boolean condition, R... columns)
排序ORDER BY 字段, ... ASC例: orderByAsc(id, name)---order by id ASC,name ASC
orderByDesc
orderByDesc(R... columns) orderByDesc(boolean condition, R... columns)
排序ORDER BY 字段, ... DESC例: orderByDesc(id, name)---order by id DESC,name DESC
orderBy
orderBy(boolean condition, boolean isAsc, R... columns)
排序ORDER BY 字段, ...例: orderBy(true, true, id, name)---order by id ASC,name ASC
having
having(String sqlHaving, Object... params) having(boolean condition, String sqlHaving, Object... params)
HAVING ( sql语句 )例: having(sum(age) 10)---having sum(age) 10例: having(sum(age) {0}, 11)---having sum(age) 11
func
func(ConsumerChildren consumer) func(boolean condition, ConsumerChildren consumer)
func 方法(主要方便在出现if...else下调用不同方法能不断链)例: func(i - if(true) {i.eq(id, 1)} else {i.ne(id, 1)})
or
or() or(boolean condition)
拼接 OR
注意事项:
主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)
例: eq(id,1).or().eq(name,老王) ---id 1 or name 老王
or(ConsumerParam consumer) or(boolean condition, ConsumerParam consumer)
OR 嵌套例: or(i - i.eq(name, 李白).ne(status, 活着))---or (name 李白 and status 活着)
and
and(ConsumerParam consumer) and(boolean condition, ConsumerParam consumer)
AND 嵌套例: and(i - i.eq(name, 李白).ne(status, 活着))---and (name 李白 and status 活着)
nested
nested(ConsumerParam consumer) nested(boolean condition, ConsumerParam consumer)
正常嵌套 不带 AND 或者 OR例: nested(i - i.eq(name, 李白).ne(status, 活着)) ---(name 李白 and status 活着)
apply
apply(String applySql, Object... params) apply(boolean condition, String applySql, Object... params)
拼接 sql 注意事项:
该方法可用于数据库函数 动态入参的params对应前面applySql内部的{index}部分.这样是不会有sql注入风险的,反之会有!
例: apply(id 1) id 1例: apply(date_format(dateColumn,%Y-%m-%d) 2008-08-08)---date_format(dateColumn,%Y-%m-%d) 2008-08-08)例: apply(date_format(dateColumn,%Y-%m-%d) {0}, 2008-08-08)---date_format(dateColumn,%Y-%m-%d) 2008-08-08)
last
last(String lastSql) last(boolean condition, String lastSql)
无视优化规则直接拼接到 sql 的最后
注意事项:
只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用
例: last(limit 1)
exists
exists(String existsSql) exists(boolean condition, String existsSql)
拼接 EXISTS ( sql语句 )例: exists(select id from table where age 1)---exists (select id from table where age 1)
notExists
notExists(String notExistsSql) notExists(boolean condition, String notExistsSql)
拼接 NOT EXISTS ( sql语句 )例: notExists(select id from table where age 1)---not exists (select id from table where age 1)
QueryWrapper
说明:
继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取
select
select(String... sqlSelect) select(PredicateTableFieldInfo predicate) select(ClassT entityClass, PredicateTableFieldInfo predicate)
设置查询字段
说明:
以上方法分为两类.
第二类方法为:过滤查询字段(主键除外),入参不包含 class 的调用前需要wrapper内的entity属性有值! 这两类方法重复调用以最后一次为准
例: select(id, name, age)例: select(i - i.getProperty().startsWith(test))
UpdateWrapper
说明:
继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
及 LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!
set
set(String column, Object val) set(boolean condition, String column, Object val)
SQL SET 字段例: set(name, 老李头)例: set(name, )空字符串例: set(name, null) null
setSql
setSql(String sql)
设置 SET 部分 SQL例: setSql(name 老李头)
lambda
(这个lambda可以用方法引用其他不行支持链式编程)
获取 LambdaWrapper
在QueryWrapper是LambdaQueryWrapper
在UpdateWrapper是LambdaUpdateWrapper
乐观OptimisticLockerInnerInterceptor
当要更新一条记录的时候希望这条记录没有被别人更新
乐观锁实现方式
取出记录时获取当前 version更新时带上这个 version执行更新时 set version newVersion where version oldVersion如果 version 不对就更新失败
spring boot 注解方式:
Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; }
2.在实体类的字段上加上Version注解
Version private Integer version;
示例
// Spring Boot 方式 Configuration MapperScan(按需修改) public class MybatisPlusConfig { /** * 旧版 */ Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } /** * 新版 */ Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mybatisPlusInterceptor; } }
代码生成器
引入依赖
dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-generator/artifactId version最新版本/version /dependency
快速生成
FastAutoGenerator.create(url, username, password) .globalConfig(builder - { builder.author(baomidou) // 设置作者 .enableSwagger() // 开启 swagger 模式 .fileOverride() // 覆盖已生成文件 .outputDir(D://); // 指定输出目录 }) .dataSourceConfig(builder - builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) - { int typeCode metaInfo.getJdbcType().TYPE_CODE; if (typeCode Types.SMALLINT) { // 自定义类型转换 return DbColumnType.INTEGER; } return typeRegistry.getColumnType(metaInfo); })) .packageConfig(builder - { builder.parent(com.baomidou.mybatisplus.samples.generator) // 设置父包名 .moduleName(system) // 设置父包模块名 .pathInfo(Collections.singletonMap(OutputFile.xml, D://)); // 设置mapperXml生成路径 }) .strategyConfig(builder - { builder.addInclude(t_simple) // 设置需要生成的表名 .addTablePrefix(t_, c_); // 设置过滤表前缀 }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板默认的是Velocity引擎模板 .execute();