GithubHelp home page GithubHelp logo

itfsw / mybatis-generator-plugin Goto Github PK

View Code? Open in Web Editor NEW
1.3K 65.0 396.0 1.16 MB

Mybatis Generator 代码生成插件拓展,增加:查询单条数据插件(SelectOneByExamplePlugin)、MySQL分页插件(LimitPlugin)、数据Model链式构建插件(ModelBuilderPlugin)、Example Criteria 增强插件(ExampleEnhancedPlugin)、Example 目标包修改插件(ExampleTargetPlugin)、批量插入插件(BatchInsertPlugin)、逻辑删除插件(LogicalDeletePlugin)、数据Model属性对应Column获取插件(ModelColumnPlugin)、存在即更新(UpsertPlugin)、Selective选择插入更新增强插件(SelectiveEnhancedPlugin)、Table增加前缀插件(TableSuffixPlugin)、自定义注释插件(CommentPlugin)、增量插件(IncrementsPlugin)、查询结果选择性返回插件(SelectSelectivePlugin)、乐观锁插件(OptimisticLockerPlugin)、LombokPlugin等拓展。

License: Apache License 2.0

Java 98.08% FreeMarker 1.92%
mybatis-generator plugin limit batchinsert selectone upsert mysql mybatis lombok

mybatis-generator-plugin's People

Contributors

dependabot[bot] avatar hellsof avatar itfsw avatar linlinjava avatar tonycody avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mybatis-generator-plugin's Issues

hi

我尝试使用了插件消除表名 t 前缀
发现,仍然无法消除。
具体情况:
mybatis-generator-config.xml

    <!-- Table重命名插件 -->
    <plugin type="com.itfsw.mybatis.generator.plugins.TablePrefixPlugin">
      <!-- 可根据具体需求确定是否配置 -->
      <property name="searchString" value="^T"/>
      <property name="replaceString" value=""/>
    </plugin>

    <!-- 该插件给实体类添加toString()方法  -->
    <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>

    <!-- 这个插件给由MBG生成的Java模型对象增加了equals和hashCode方法 -->
    <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>
    <!-- 序列化插件 -->
    <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

pom.xml

<!-- mybatis generator 插件 -->
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>${dev.plugin.mybatis-generator}</version>
        <configuration>
          <configurationFile>${basedir}/src/main/resources/mybatis-generator-config.xml</configurationFile>
          <overwrite>true</overwrite>
          <verbose>true</verbose>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${dev.lib.mysql-connector}</version>
          </dependency>
          <!-- 增强mybatis-generator 插件 -->
          <dependency>
            <groupId>com.itfsw</groupId>
            <artifactId>mybatis-generator-plugin</artifactId>
            <version>1.0.11</version>
          </dependency>
        </dependencies>
      </plugin>

配置如上,执行的时候,T表前缀仍然无法去除。

不能找到对应的依赖呢?

你好,为什么我不能找到对应的依赖呢?
这是我的配置:

    <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <configuration>
                    <!-- 配置文件 -->
                    <configurationFile>src/main/resources/excludes/mybatis-generator.xml</configurationFile>
                    <!-- 允许移动和修改 -->
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <dependencies>
                    <!-- jdbc 依赖 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.40</version>
                    </dependency>
                    <dependency>
                        <groupId>com.itfsw</groupId>
                        <artifactId>mybatis-generator-plugin</artifactId>
                        <version>1.0.4</version>
                    </dependency>
                </dependencies>
            </plugin>

集成通用mapper时生成mapper出现问题

由于集成了通用mapper(tk.mybatis),在生成table时需要把example关闭,如:
<table tableName="t_user_info" domainObjectName="UserInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> </table>
但是设置为false之后生成的mapper没有import ibatis的Param:
Param cannot be resolved to
a type
请问楼主有集成过通用mapper吗?

1.1.2中有Bug

指定了逻辑删除列,且配置有rootClass的情况下,还是直接取bean中的删除列字段
这时删除列在rootClass中,是private属性,不能直接引用的

可否为batch_insert增加 insert if not exists 逻辑?

因为很多时候有 insert if not exists 批量插入的需求, 是一个很实用功能.

本来这个repo[https://github.com/beihaifeiwu/dolphin] 已经完成了这个功能,但是觉得他的其他功能写的没你的好, 所以恳请您的repo里面添加这项功能.

logicDeleteWithVersion

目前的deleteWithVersion好像不支持logicDelete。

我觉得logicDeleteWithVersion还是有应用场景的吧。

逻辑删除标识符的理解

不知道logicalDeleteValue/logicalUnDeleteValue和生成的常量DEL_FLAG_ON/OFF是一个怎样的对应关系呢?按照我的理解DEL_FLAG_ON是说明删除标识符被置为true,DEL_FLAG_OFF说明删除标识符被置为false,但是实际上生成的与我理解的正好相反,您是怎样理解这个删除常量的呢?
配置:

    <property name="logicalDeleteColumn" value="is_deleted"/>
    <!-- 逻辑删除-已删除值 -->
    <property name="logicalDeleteValue" value="1"/>
    <!-- 逻辑删除-未删除值 -->
    <property name="logicalUnDeleteValue" value="0"/>

实际生成:

    public static final Boolean DEL_FLAG_ON = false;
    public static final Boolean DEL_FLAG_OFF = true;

集成gradle

项目中现在用到了gradle、用到了官方的generator,如何再引入这个插件,还请执教,谢谢

文档错误

在README.md文件中关于逻辑删除插件使用说明有处错误,
配置逻辑删除常量名称的name错了,会导致生成的实体类中的值都是false。

这是原来的

    <!-- 逻辑删除常量名称,不配置默认为 IS_DELETED -->
    <property name="logicalDeleteValue" value="DEL"/>
    <!-- 逻辑删除常量(未删除)名称,不配置默认为 NOT_DELETED -->
    <property name="logicalUnDeleteValue" value="UN_DEL"/>

应改为

        <!-- 逻辑删除常量名称,不配置默认为 IS_DELETED -->
        <property name="logicalDeleteConstName" value="IS_DELETED"/>
        <!-- 逻辑删除常量(未删除)名称,不配置默认为 NOT_DELETED -->
        <property name="logicalUnDeleteConstName" value="NOT_DELETED"/>

blob方法的判断似乎有点问题

version

1.2.2
mybatis 1.3.6

log

org.apache.ibatis.builder.IncompleteElementException: Could not find SQL statement to include with refid 'com.github.flowerwrong.model.mapper.RegionMapper.Blob_Column_List'

我比较了一下,以前版本是没有生成下图方法的。
2018-05-15 5 32 38

乐观锁插件

并发更新应该引入乐观锁,原理是简单,基于version就可以,但是如果插件自动生成代码,那应该更方便了。

目前google结果是,mybatis项目本身对乐观锁提供了支持,然后以下mybatis项目好像支持乐观锁:

第一个也是插件,但是我觉得代码有点复杂,不像本项目一样一个插件就是一个类,同时不支持maven;后面两个项目,我觉得会引入依赖,目前我觉得插件形式自动生成代码既简单又直观有效。

当前项目没有乐观锁插件,不知道作者在实际项目是是否有更好的解决方案,希望交流一下。

SelectiveEnhancedPlugin插件和ModelColumnPlugin插件对数组的支持

在1.2.9中,SelectiveEnhancedPlugin插件和ModelColumnPlugin插件一起启动以后,生产的代码对数组支持有问题。

在我的项目中,数据库表中的有些字段虽然是varchar,但是实际是采用JSON数组格式存储,因此我这里自定义了typeHandler,产生的java代码中有些域是数组类型。
_20180703105056

在1.2.6中,编译运行都正常,但是在1.2.9中,引入了新的Colume特性,但是对数组支持有问题。
_20180703104858

在上面可以看到,mybatis产生的代码中andSpecificationsLessThanOrEqualTo方法的参数是String[], 而andSpecificationsLessThanColumn中实际则是调用了String类型。

预期的效果应该是andSpecificationsLessThanColumn里面应该是产生数组,然后内部调用andSpecificationsLessThanOrEqualTo。

关于in 空list的建议

当where中出现in list时,如果list为empty list,会报错,能否针对这种情况在生成代码时进行处理,让in empty list时返回空。
mbg生成的相关代码:

								<when test="criterion.listValue">
									and ${criterion.condition}
									<foreach collection="criterion.value" item="listItem"
										open="(" close=")" separator=",">
										#{listItem}
									</foreach>
								</when>

批量插入的selective不太友好

批量插入插件,batchInsertSelective不太友好,需要指定特定的列。可否使用原生xml的
<if test="fielName != null">
这种方式拼接

可以增加个批量的 插入存在便更新的插件

-- auto-generated definition
CREATE TABLE student
(
id INT AUTO_INCREMENT
COMMENT '自增id'
PRIMARY KEY,
no INT DEFAULT '0' NOT NULL,
type TINYINT DEFAULT '0' NOT NULL,
age INT DEFAULT '0' NOT NULL
COMMENT '年龄',
name VARCHAR(64) DEFAULT '' NOT NULL
COMMENT '姓名',
CONSTRAINT no
UNIQUE (no, type)
)
ENGINE = InnoDB;


INSERT INTO test.student (id, no, type, age, name) VALUES (2, 15, 2, 100, 'AAACCC');
INSERT INTO test.student (id, no, type, age, name) VALUES (4, 12, 1, 9999, 'DDD');


增加如下操作功能???---- 现在是单条的 插入存在便更新的插件

INSERT INTO student (no, type, age, name) VALUES (15, 2, 100, "长者"), (12, 1, 9999, "香港记者")
ON DUPLICATE KEY UPDATE age = values(age), name = values(name)

使用选择性插入(insertSelective) 时,useGeneratedKeys 属性无效

你好!

在我使用该插件生成选择性插入(insertSelective)代码后,在 XML 里指明对象 useGeneratedKeys=true ,调用该方法,对象的主键不自动赋值。

环境

  • MySQL: 5.7.22
  • JDK: 1.8.0_171
  • mybatis-generator-maven-plugin: 1.3.6
  • mybatis-generator-plugin: 1.2.9
  • mysql-connector-plugin: 5.1.38

对象定义

  • 表设计
create table tb_foo
(
 fid int priamry key auto_increment,
 fname varchar(50) not null,
 // 省略其它列的定义
)
  • 自动生成的 Java Model
public class Foo{

	private Integer fid;

	private String name;

	// 省略其它属性
	// 省略 getter 和 setter
}
  • insertSelective 代码
<insert id="insertSelective" useGeneratedKeys="true" keyPropertry="fid" parameterType="map">
	insert into tb_foo
	<choose>
		<when test="selective != null and selective.length &gt; 0">
			// 省略代码
		</when>
		<otherwise>
			// 省略代码
		</otherwise>
	</choose>
</insert>
  • 测试代码
@Autowired
private FooMapper fooMapper;

@Test
public void testInsertFoo(){

	Foo foo = Foo.builder()
		.name("fooName")
		.build();

	fooMapper.insertSelective(foo);

	// 测试不通过,foo的fid属性没有被赋值
	Assert.assertNotNull(foo.getfid());
}

使用该插件,进行全属性插入(insert)时,指明 userGeneratedKeys=true keyPropertry="fid" 可以为对象赋予主键 ID。如:

@Autowired
private FooMapper fooMapper;

@Test
public void testInsertFoo(){

	Foo foo = Foo.builder()
		.name("fooName")
		...  // 其它属性赋值
		.build();

	fooMapper.insert(foo);

	// 测试通过
	Assert.assertNotNull(foo.getfid());
}

自动生成的mapper文件中存在两个相同的selectOneByExampleSelective

首先对于作者下面的话不是很理解

因为1.2版本对Selective选择插入更新增强插件进行了重构,不再兼容老版。老版本参见分支V1.1.x(只进行BUG修正,不再添加新功能);

因为我现在需要乐观锁插件(感谢),因此我需要从1.1.x跟新到1.2,如果会带来不兼容,我觉得不要紧,我会重新更新自己依赖的代码。所以,你在release中所说的"建议使用老版(1.1.x)的用户不要升级",是不是就不要紧。

其次,今天发现一个问题是,更新到1.2以后,自动生成的mapper文件中存在两个相同的selectOneByExampleSelective,如下图所示

image

为了防止我自己失误,我把resources目录的dao文件夹都删除,重新运行生成器,仍然存在这个问题。

我的generatorConfig.xml是:

        <!-- 查询单条数据插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.SelectOneByExamplePlugin"/>
        <!-- 查询结果选择性返回插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.SelectSelectivePlugin" />
        <!-- Example Criteria 增强插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.ExampleEnhancedPlugin"/>
        <!-- 数据Model属性对应Column获取插件 -->
        <plugin type="com.itfsw.mybatis.generator.plugins.ModelColumnPlugin"/>

我的pom.xml是

   <build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <configurationFile>
                        mybatis-generator/generatorConfig.xml
                    </configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.46</version>
                    </dependency>
                    <dependency>
                        <groupId>com.itfsw</groupId>
                        <artifactId>mybatis-generator-plugin</artifactId>
                        <version>1.2.2</version>
                    </dependency>
                </dependencies>
            </plugin>

        </plugins>

    </build>

逻辑删除有问题1.0.6

对于1.0.6实测,逻辑批量删除是问题的,因为用到了批量更新的sql,所以参数名都是example,但是因为Mapper文件中未加@param,导致执行时,会用XXXExample去找getExample的getter方法。会报错。实际在逻辑删除插件中,即使参数个数为1,也要加上@param。最后,感谢插件的提供

MySQL分页插件 bug

MySQL分页插件中:
public MallExample page(Integer page, Integer pageSize) {
this.offset = page * pageSize;
this.rows = pageSize;
return this;
}
offset计算应该如下:
this.offset = (page - 1) * pageSize

batchUpsert

假设数据库中存在两条数据,修改两条数据(主键不变)再进行batchUpsert会返回结果为4

增量插件使用delimitAllColumns属性后报错

如果配置列名用反引号包裹,使用增量插件后执行mybatis generator插件会报错,去掉后可以正常生成。

配置信息:

        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        ...
        <table tableName="test"
                  delimitAllColumns="true"
          ....

错误信息

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.182 s
[INFO] Finished at: 2017-08-03T16:51:02+08:00
[INFO] Final Memory: 11M/135M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate (default-cli) on project sharejam-core: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate failed.: NullPointerException -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate (default-cli) on project sharejam-core: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate failed.
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
	at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate failed.
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:145)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
	... 26 more
Caused by: java.lang.NullPointerException
	at com.itfsw.mybatis.generator.plugins.utils.IncrementsPluginTools.supportColumn(IncrementsPluginTools.java:121)
	at com.itfsw.mybatis.generator.plugins.IncrementsPlugin.generatedWithSelective(IncrementsPlugin.java:189)
	at com.itfsw.mybatis.generator.plugins.IncrementsPlugin.sqlMapUpdateByExampleSelectiveElementGenerated(IncrementsPlugin.java:105)
	at org.mybatis.generator.internal.PluginAggregator.sqlMapUpdateByExampleSelectiveElementGenerated(PluginAggregator.java:320)
	at org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.UpdateByExampleSelectiveElementGenerator.addElements(UpdateByExampleSelectiveElementGenerator.java:81)
	at org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator.initializeAndExecuteGenerator(XMLMapperGenerator.java:250)
	at org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator.addUpdateByExampleSelectiveElement(XMLMapperGenerator.java:199)
	at org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator.getSqlMapElement(XMLMapperGenerator.java:83)
	at org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator.getDocument(XMLMapperGenerator.java:258)
	at org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3Impl.getGeneratedXmlFiles(IntrospectedTableMyBatis3Impl.java:268)
	at org.mybatis.generator.config.Context.generateFiles(Context.java:723)
	at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:269)
	at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:189)
	at org.mybatis.generator.maven.MyBatisGeneratorMojo.execute(MyBatisGeneratorMojo.java:199)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
	... 27 more

selectByExampleSelective 不支持 distinct

官方的selectByExample支持distinct, 例如

<select id="selectByExample" parameterType="org.demo.Demo" resultMap="BaseResultMap">
    select
    <if test="distinct">
      distinct
    </if>
    <include refid="Base_Column_List" />
   ...
</select>

而当前的SelectSelectivePlugin插件生产的selectByExampleSelective则不支持,例如

<select id="selectByExampleSelective" parameterType="map" resultMap="BaseResultMap">
    select
    <foreach collection="selective" item="column" separator=",">
      ${column.value}
    </foreach>
   ...
</select>

这里应该生产如下的效果,才可以:

<select id="selectByExampleSelective" parameterType="map" resultMap="BaseResultMap">
    select
    <if test="example.distinct">
      distinct
    </if>
    <foreach collection="selective" item="column" separator=",">
      ${column.value}
    </foreach>
   ...
</select>

事实上,distinct在官方生产的代码中意义不大,因为查询的全数据肯定是唯一的,而在这里的可选查询中才真正有意义,因为查询部分得到的数据存在重复性,因此应该支持。

感谢作者的付出。

打包的时候发现有7个测试用例不能通过。



Tests run: 13, Failures: 7, Errors: 0, Skipped: 0, Time elapsed: 26.598 sec <<< FAILURE!
testWithLogicalDeletePlugin(com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest)  Time elapsed: 0.851 sec  <<< FAILURE!
org.junit.ComparisonFailure: expected:<[]where inc_f1 = 1 and...> but was:<[update tb set inc_f1 = inc_f1 + 1,inc_f2 = 9 ]where inc_f1 = 1 and...>
	at org.junit.Assert.assertEquals(Assert.java:115)
	at org.junit.Assert.assertEquals(Assert.java:144)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest$9.reloadProject(OptimisticLockerPluginTest.java:368)
	at com.itfsw.mybatis.generator.plugins.tools.AbstractShellCallback.refreshProject(AbstractShellCallback.java:59)
	at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:289)
	at com.itfsw.mybatis.generator.plugins.tools.MyBatisGeneratorTool.generate(MyBatisGeneratorTool.java:95)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest.testWithLogicalDeletePlugin(OptimisticLockerPluginTest.java:344)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

testUpdateWithVersionByPrimaryKey(com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest)  Time elapsed: 0.897 sec  <<< FAILURE!
org.junit.ComparisonFailure: expected:<[]where inc_f1 = 100 a...> but was:<[update tb set inc_f1 = inc_f1 + 1, field1 = 'null', inc_f2 = 10, inc_f3 = 5 ]where inc_f1 = 100 a...>
	at org.junit.Assert.assertEquals(Assert.java:115)
	at org.junit.Assert.assertEquals(Assert.java:144)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest$17.reloadProject(OptimisticLockerPluginTest.java:675)
	at com.itfsw.mybatis.generator.plugins.tools.AbstractShellCallback.refreshProject(AbstractShellCallback.java:59)
	at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:289)
	at com.itfsw.mybatis.generator.plugins.tools.MyBatisGeneratorTool.generate(MyBatisGeneratorTool.java:95)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest.testUpdateWithVersionByPrimaryKey(OptimisticLockerPluginTest.java:662)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

testUpdateWithVersionByPrimaryKeyWithBLOBs(com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest)  Time elapsed: 0.97 sec  <<< FAILURE!
org.junit.ComparisonFailure: expected:<[]where inc_f1 = 100 a...> but was:<[update tb_blobs set inc_f1 = inc_f1 + 1, field1 = 'null', inc_f2 = 10, inc_f3 = 5 ]where inc_f1 = 100 a...>
	at org.junit.Assert.assertEquals(Assert.java:115)
	at org.junit.Assert.assertEquals(Assert.java:144)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest$19.reloadProject(OptimisticLockerPluginTest.java:746)
	at com.itfsw.mybatis.generator.plugins.tools.AbstractShellCallback.refreshProject(AbstractShellCallback.java:59)
	at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:289)
	at com.itfsw.mybatis.generator.plugins.tools.MyBatisGeneratorTool.generate(MyBatisGeneratorTool.java:95)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest.testUpdateWithVersionByPrimaryKeyWithBLOBs(OptimisticLockerPluginTest.java:733)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

testWithIncrementsPlugin(com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest)  Time elapsed: 5.097 sec  <<< FAILURE!
org.junit.ComparisonFailure: expected:<[]where inc_f1 = 100 a...> but was:<[update tb SET inc_f1 = inc_f1 + 1, inc_f2 = inc_f2 + 5 , inc_f3 = 10 ]where inc_f1 = 100 a...>
	at org.junit.Assert.assertEquals(Assert.java:115)
	at org.junit.Assert.assertEquals(Assert.java:144)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest$27.reloadProject(OptimisticLockerPluginTest.java:1030)
	at com.itfsw.mybatis.generator.plugins.tools.AbstractShellCallback.refreshProject(AbstractShellCallback.java:59)
	at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:289)
	at com.itfsw.mybatis.generator.plugins.tools.MyBatisGeneratorTool.generate(MyBatisGeneratorTool.java:95)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest.testWithIncrementsPlugin(OptimisticLockerPluginTest.java:1016)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

testUpdateWithVersionByPrimaryKeySelective(com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest)  Time elapsed: 0.843 sec  <<< FAILURE!
org.junit.ComparisonFailure: expected:<[]where inc_f1 = 100 a...> but was:<[update tb SET inc_f1 = inc_f1 + 1, inc_f2 = 10, inc_f3 = 5 ]where inc_f1 = 100 a...>
	at org.junit.Assert.assertEquals(Assert.java:115)
	at org.junit.Assert.assertEquals(Assert.java:144)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest$15.reloadProject(OptimisticLockerPluginTest.java:606)
	at com.itfsw.mybatis.generator.plugins.tools.AbstractShellCallback.refreshProject(AbstractShellCallback.java:59)
	at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:289)
	at com.itfsw.mybatis.generator.plugins.tools.MyBatisGeneratorTool.generate(MyBatisGeneratorTool.java:95)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest.testUpdateWithVersionByPrimaryKeySelective(OptimisticLockerPluginTest.java:593)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

testWithSelectiveEnhancedPlugin(com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest)  Time elapsed: 2.115 sec  <<< FAILURE!
org.junit.ComparisonFailure: expected:<[]where inc_f1 = 100 a...> but was:<[update tb SET inc_f1 = inc_f1 + 1, inc_f2 = 10, inc_f3 = 5 ]where inc_f1 = 100 a...>
	at org.junit.Assert.assertEquals(Assert.java:115)
	at org.junit.Assert.assertEquals(Assert.java:144)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest$32.reloadProject(OptimisticLockerPluginTest.java:1226)
	at com.itfsw.mybatis.generator.plugins.tools.AbstractShellCallback.refreshProject(AbstractShellCallback.java:59)
	at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:289)
	at com.itfsw.mybatis.generator.plugins.tools.MyBatisGeneratorTool.generate(MyBatisGeneratorTool.java:95)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest.testWithSelectiveEnhancedPlugin(OptimisticLockerPluginTest.java:1202)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

testWithSelectiveEnhancedPluginAndIncrementsPlugin(com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest)  Time elapsed: 2.181 sec  <<< FAILURE!
org.junit.ComparisonFailure: expected:<[]where inc_f1 = 100 a...> but was:<[update tb SET inc_f1 = inc_f1 + 1, inc_f2 = inc_f2 + 5 , inc_f3 = 10 ]where inc_f1 = 100 a...>
	at org.junit.Assert.assertEquals(Assert.java:115)
	at org.junit.Assert.assertEquals(Assert.java:144)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest$34.reloadProject(OptimisticLockerPluginTest.java:1332)
	at com.itfsw.mybatis.generator.plugins.tools.AbstractShellCallback.refreshProject(AbstractShellCallback.java:59)
	at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:289)
	at com.itfsw.mybatis.generator.plugins.tools.MyBatisGeneratorTool.generate(MyBatisGeneratorTool.java:95)
	at com.itfsw.mybatis.generator.plugins.OptimisticLockerPluginTest.testWithSelectiveEnhancedPluginAndIncrementsPlugin(OptimisticLockerPluginTest.java:1307)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

Running com.itfsw.mybatis.generator.plugins.BatchInsertPluginTest

ExampleEnhancedPlugin生成了一个空的ICriteriaAdd类

我在使用的时候添加了

        <plugin type="com.itfsw.mybatis.generator.plugins.ExampleEnhancedPlugin"/>
        <plugin type="com.itfsw.mybatis.generator.plugins.LimitPlugin"/>

两个插件,然后生成的example对象中ICriteriaAdd对象是空的,在andIf方法的add.add(this)会报错

     public Criteria andIf(boolean ifAdd, ICriteriaAdd add) {
            if (ifAdd) {
                add.add(this);
            }
            return this;
        }

        class ICriteriaAdd {
        }

请教下是那里出了问题,谢谢。

13. 自定义注释插件 复制模板到idea文件导致格式混乱的问题

找了很久很久,终于找到了这样的插件中的插件,很感谢。

复制模板到idea文件导致格式混乱的问题

由于idea的原因,模板中的文本复制过去会被转换,导致生成注释格式混乱

  • 建议提供模板文件的下载地址,或者插件默认加载默认的模板文件
  • 临时解决方案,可以不使用idea粘贴文件,用最基本的文本编辑器粘贴模板文件。

能不能提一个BaseDomain和BaseExample类

1.能不能提取一个BaseExample类,存放Criteria 这样减少很多重复代码,并且提取了一个抽象,然后统一的查询条件Criteria,可以被使用到多个表查询中。
2.改写andEqual方法,这样代码的复用性更强
之前: public Criteria andIdEqualTo(Long value) {
addCriterion("id =", value, "id");
return (Criteria) this;
}
之后:public Criteria and(String column,Object value){
addCriterion(column+" =", value, column);
return (Criteria) this;
}

使用这个插件报错,问下这个问题怎么解决?

Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate (default-cli) on project lepai: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate failed: Cannot instantiate object of type com.itfsw.mybatis.generator.plugins.BatchInsertPlugin -> [Help 1]

一些修正的建议

1,建议把分页里面的page方法修改为
this.offset = ( page - 1 ) * pageSize;
比较符合使用习惯 page就是页码

2,建议把BatchInsert方法和BatchInsertSelective切分成两个插件
我当前就只想使用BatchInsert方法,就只能修改你的源码了,不太方便

3, 使用作者项目是发现我的一些需求无法解决,就自己写了几个插件
贡献出来希望可以添加到作者的项目里
1>自动生成 mysql generatorKey 的插件 解决每个table设置generatorKey的问题
`

@Override
public boolean validate(List<String> list) {
    return true;
}

@Override
public void initialized(IntrospectedTable introspectedTable) {
    GeneratedKey gk = introspectedTable.getGeneratedKey();
    //如果需要生成参数
    if (gk == null) {
        List<IntrospectedColumn> keyColumns = introspectedTable.getPrimaryKeyColumns();
        IntrospectedColumn keyColumn = null;
        //只能有一个主键列;
        if (keyColumns.size() == 1) {
            //得到这个唯一的主键列
            keyColumn = keyColumns.get(0);
            //得到这个列映射成Java模型之后的属性对应的Java类型;
            FullyQualifiedJavaType javaType = keyColumn.getFullyQualifiedJavaType();
            //要求主键只能是递增的,所以我们把这个主键属性的类型分别和Integer,Long,Short做对比;
            if (javaType.equals(PrimitiveTypeWrapper.getIntegerInstance())
                    || javaType.equals(PrimitiveTypeWrapper.getLongInstance())
                    || javaType.equals(PrimitiveTypeWrapper.getShortInstance())) {
                //设置自增 insert 和 insertSelective 去除字段赋值
                keyColumn.setIdentity(true);
                //设置 Mysql generatedKey 用于生成 selectKey
                GeneratedKey generatedKey = new GeneratedKey(keyColumn.getActualColumnName(), "Mysql", true, "post");
                introspectedTable.getTableConfiguration().setGeneratedKey(generatedKey);
            }
        }
    }
    super.initialized(introspectedTable);
}

`

2> 需要修改mapper后缀为dao 所以写了下面这个插件
`
private String mapperSuffix;
private String sqlSuffix;

public boolean validate(List<String> warnings) {
    //获取配置
    mapperSuffix = properties.getProperty("mapperSuffix");
    sqlSuffix = properties.getProperty("sqlSuffix");
    //至少一个配置
    return stringHasValue(mapperSuffix) || stringHasValue(sqlSuffix);
}

@Override
public void initialized(IntrospectedTable introspectedTable) {
    String modelName = introspectedTable.getFullyQualifiedTable().getDomainObjectName();
    if (stringHasValue(mapperSuffix)) {
        String mapperType = introspectedTable.getMyBatis3JavaMapperType();
        mapperType = mapperType.replaceAll(modelName + "Mapper", modelName + mapperSuffix);
        introspectedTable.setMyBatis3JavaMapperType(mapperType);
    }
    if (stringHasValue(sqlSuffix)) {
        introspectedTable.setMyBatis3XmlMapperFileName(modelName + sqlSuffix);
    }
}`

最后感谢作者的无私奉献,希望项目越做越好

tb表会生产andLogicalDeleted?

基于1.2.4,在tb表中增加了deleted属性,然后采用逻辑删除插件生产代码。

Tb类存在deleted域,存在getDeleted和setDeleted方法了。
但是tb表会多生产andLogicalDeleted方法,我不知道这里这个方法为什么要存在?
有什么作用吗,还是放错地方了。

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table tb
     *
     * @mbg.generated
     * @project https://github.com/itfsw/mybatis-generator-plugin
     */
    public void andLogicalDeleted(boolean deleted) {
        setDeleted(deleted ? IS_DELETED : NOT_DELETED);
    }

配置设置允许修改时,Mapper 文件中出现了 ID 相同的 SQL

环境列表

  • MyBatis Generator : 1.1.2
  • JDK : 1.8.0_152
  • Maven : 3.5.0

说明

Maven build 文件配置如下:

<configuration>
  <configurationFile>src/main/resources/mybatis_generator.xml</configurationFile>
  <verbose>true</verbose>
  <overwrite>true</overwrite>
</configuration>

当使用 Maven Generator 重新生成 Mapper 文件时,Mapper 文件会追加同名的 SQL 。如下面的图片所示:生成了同名的 selectByExample SQL。

第一次生成 Mapper 文件:

one-match

第二次生成 Mapper 文件:

two-matches

OptimisticLockerPlugin如何使用以及可能的bug

最近准备采用乐观锁插件解决并发控制。
使用过程中发现一些问题。

  1. 当前OptimisticLockerPlugin的使用方法如下描述:
<xml>
    <!-- 乐观锁插件 -->
    <plugin type="com.itfsw.mybatis.generator.plugins.OptimisticLockerPlugin">
        <!-- 是否启用自定义nextVersion, 默认不启用使用(使用sql的 set column = column + 1) -->
        <property name="customizedNextVersion" value="true"/>
    </plugin>
    
    <table tableName="tb">
        <!-- 这里可以单独表配置,覆盖全局配置 -->
        <property name="customizedNextVersion" value="false"/>
        <!-- 指定版本列 -->
        <property name="versionColumn" value="version"/>
    </table>
</xml>

这里customizedNextVersion到底是什么以及如何使用不是很明白。

  1. 按照本人的理解,认为只要启动插件,即可自动生成相关代码。
    因此采用如下配置
<xml>
    <!-- 乐观锁插件 -->
    <plugin type="com.itfsw.mybatis.generator.plugins.OptimisticLockerPlugin">
    </plugin>
</xml>

然后,实际上没有任何反应,没有代码生成。

因此,我这里采用如下配置

<xml>
    <!-- 乐观锁插件 -->
    <plugin type="com.itfsw.mybatis.generator.plugins.OptimisticLockerPlugin">
    </plugin>
    
    <table tableName="tb">
        <property name="versionColumn" value="version"/>
    </table>
</xml>

这里,项目自动生成了乐观锁的相关代码。
因此,这里的使用方法到底是什么样的。是插件只是开启功能,在表配置中声明才能使用?

  1. 此外,还有一个与设想不一致的现象是,我这里多个表,但是只有表一采用了配置,而其他表没有采用配置。
<xml>
    <!-- 乐观锁插件 -->
    <plugin type="com.itfsw.mybatis.generator.plugins.OptimisticLockerPlugin">
    </plugin>
    
    <table tableName="tb">
        <property name="versionColumn" value="version"/>
    </table>
    <table tableName="tb2">
    </table>
</xml>

我预期是只有表一会生成相关代码,而其他表不会生成代码。
但是实际结果是表一和表二都会生成代码。
因此,个人觉得这里可能是插件代码bug,也可能是设计上不是很合理。

由于这里的问题,我目前是暂缓乐观锁插件的使用。

  1. 目前本人开源项目使用mybatis框架,以及作者这里的相关插件。
    不知道作者有没有qq或者微信,可以有机会实时沟通一些使用中的问题。
    本人也可以帮忙测试以及反馈使用中的问题。

关于mysql驱动支持

https://github.com/itfsw/mybatis-generator-plugin/blob/master/src/main/java/com/itfsw/mybatis/generator/plugins/BatchInsertPlugin.java

// 插件使用前提是数据库为MySQL或者SQLserver,因为返回主键使用了JDBC的getGenereatedKeys方法获取主键 if ("com.mysql.jdbc.Driver".equalsIgnoreCase(this.getContext().getJdbcConnectionConfiguration().getDriverClass()) == false && "com.microsoft.jdbc.sqlserver.SQLServer".equalsIgnoreCase(this.getContext().getJdbcConnectionConfiguration().getDriverClass()) == false && "com.microsoft.sqlserver.jdbc.SQLServerDriver".equalsIgnoreCase(this.getContext().getJdbcConnectionConfiguration().getDriverClass()) == false) { warnings.add("itfsw:插件" + this.getClass().getTypeName() + "插件使用前提是数据库为MySQL或者SQLserver,因为返回主键使用了JDBC的getGenereatedKeys方法获取主键!"); return false; }

这个地方,com.mysql.cj.jdbc.Driver ,新的驱动类型不支持。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.