From 951b389eb5301a3270d3db410c548211e24005fc Mon Sep 17 00:00:00 2001 From: hewei Date: Tue, 8 May 2018 17:51:48 +0800 Subject: [PATCH] V1.2.0 --- README.md | 112 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 01b4897..0539cdd 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ -# 这是 MyBatis Generator 插件的拓展插件包 +# 这是 MyBatis Generator 插件的拓展插件包 应该说使用Mybatis就一定离不开[MyBatis Generator](https://github.com/mybatis/generator)这款代码生成插件,而这款插件自身还提供了插件拓展功能用于强化插件本身,官方已经提供了一些[拓展插件](http://www.mybatis.org/generator/reference/plugins.html),本项目的目的也是通过该插件机制来强化Mybatis Generator本身,方便和减少我们平时的代码开发量。 ->因为插件是本人兴之所至所临时发布的项目(本人已近三年未做JAVA开发,代码水平请大家见谅),但基本插件都是在实际项目中经过检验的请大家放心使用,但因为项目目前主要数据库为MySQL,Mybatis实现使用Mapper.xml方式,所以代码生成时对于其他数据库和注解方式的支持未予考虑,请大家见谅。 +>因为插件是本人兴之所至所临时发布的项目(本人已近三年未做JAVA开发,代码水平请大家见谅),但基本插件都是在实际项目中经过检验的请大家放心使用,但因为项目目前主要数据库为MySQL,Mybatis实现使用Mapper.xml方式,所以代码生成时对于其他数据库和注解方式的支持未予考虑,请大家见谅。 +>因为1.2版本对Selective选择插入更新增强插件进行了重构,不再兼容老版。老版本参见分支[V1.1.x](https://github.com/itfsw/mybatis-generator-plugin/tree/V1.1)(只进行BUG修正,不再添加新功能); + --------------------------------------- 插件列表: * [查询单条数据插件(SelectOneByExamplePlugin)](#1-查询单条数据插件) @@ -20,6 +22,7 @@ * [增量插件(IncrementsPlugin)](#14-增量插件) * [查询结果选择性返回插件(SelectSelectivePlugin)](#15-查询结果选择性返回插件) * [~~官方ConstructorBased配置BUG临时修正插件(ConstructorBasedBugFixPlugin)~~](#16-官方constructorbased配置bug临时修正插件) +* [乐观锁插件(OptimisticLockerPlugin)](#17-乐观锁插件) --------------------------------------- Maven引用: @@ -27,7 +30,7 @@ Maven引用: com.itfsw mybatis-generator-plugin - 1.1.3 + 1.2.0 ``` --------------------------------------- @@ -556,7 +559,6 @@ public class Test { ``` ### 10. Selective选择插入更新增强插件 项目中往往需要指定某些字段进行插入或者更新,或者把某些字段进行设置null处理,这种情况下原生xxxSelective方法往往不能达到需求,因为它的判断条件是对象字段是否为null,这种情况下可使用该插件对xxxSelective方法进行增强。 ->warning:配置老版本插件(<=1.1.2)时请把插件配置在所有插件末尾最后执行,这样才能把上面提供的某些插件的Selective方法也同时增强! >warning:以前老版本(<=1.1.2)插件处理需要指定的列时是放入Model中指定的,但在实际使用过程中有同事反馈这个处理有点反直觉,导致某些新同事不能及时找到对应方法,而且和增强的SelectSelectivePlugin以及UpsertSelective使用方式都不一致,所以统一修改之。 插件: @@ -605,42 +607,6 @@ public class Test { .build(), Tb.Column.field1 ); - - // ------------------------------ 老版本(SelectiveEnhancedPlugin)-------------------------------- - // 1. 指定插入或更新字段 - Tb tb = new Tb.Builder() - .field1(1) - .field2("xx2") - .field3(1) - .field4(new Date()) - .createTime(new Date()) - .delFlag(Tb.DEL_FLAG_ON) - .build(); - // 只插入或者更新field1,field2字段 - this.tbMapper.insertSelective(tb.selective(Tb.Column.field1, Tb.Column.field2)); - this.tbMapper.updateByExampleSelective(tb.selective(Tb.Column.field1, Tb.Column.field2), - new TbExample() - .createCriteria() - .andIdEqualTo(1l) - .example() - ); - this.tbMapper.updateByPrimaryKeySelective(tb.selective(Tb.Column.field1, Tb.Column.field2)); - this.tbMapper.upsertSelective(tb.selective(Tb.Column.field1, Tb.Column.field2)); - this.tbMapper.upsertByExampleSelective(tb.selective(Tb.Column.field1, Tb.Column.field2), - new TbExample() - .createCriteria() - .andField3EqualTo(1) - .example() - ); - - // 2. 更新某些字段为null - this.tbMapper.updateByPrimaryKeySelective( - new Tb.Builder() - .id(1l) - .field1(null) // 方便展示,不用设也可以 - .build() - .selective(Tb.Column.field1) - ); } } ``` @@ -1124,3 +1090,69 @@ public class Test { ``` +### 17. 乐观锁插件 +为并发操作引入乐观锁,当发生删除或者更新操作时调用相应的WithVersion方法传入版本号,插件会在相应的查询条件上附加上版本号的检查,防止非法操作的发生。 +同时在更新操作中支持自定义nextVersion或者利用sql 的“set column = column + 1”去维护版本号。 + +插件: +```xml + + + + + + + + + + + + +
+
+``` +使用: +```java +public class Test { + public static void main(String[] args) { + // ============================ 带版本号的删除更新等操作 =============================== + int result = this.tbMapper.deleteWithVersionByExample( + 100, // 版本号 + new TbExample() + .createCriteria() + .andField1GreaterThan(1) + .example() + ); + if (result == 0){ + throw new Exception("没有找到数据或者数据版本号错误!"); + } + // 对应生成的Sql: delete from tb WHERE version = 100 and ( ( field1 > 1 ) ) + + // 带版本号的方法有: + // deleteWithVersionByExample、deleteWithVersionByPrimaryKey、 + // updateWithVersionByExampleSelective、updateWithVersionByExampleWithBLOBs、updateWithVersionByExample + // updateWithVersionByPrimaryKeySelective、updateWithVersionByPrimaryKeyWithBLOBs、updateWithVersionByPrimaryKey + + // ============================= 使用默认版本号生成策略 =========================== + this.tbMapper.updateWithVersionByPrimaryKey( + 100, // 版本号 + new Tb.Builder() + .id(102) + .field1("ts1") + .build() + ); + // 对应生成的Sql: update tb set version = version + 1, field1 = 'ts1' where version = 100 and id = 102 + + // ============================= 使用自定义版本号生成策略 =========================== + this.tbMapper.updateWithVersionByPrimaryKey( + 100, // 版本号 + new Tb.Builder() + .id(102) + .field1("ts1") + .nextVersion(System.currentTimeMillis()) // 传入nextVersion + .build() + ); + // 对应生成的Sql: update tb set version = 1525773888559, field1 = 'ts1' where version = 100 and id = 102 + } +} +``` \ No newline at end of file