插件github:https://github.com/itfsw/mybatis-generator-plugin,很多用法请参考这里。

配置

mybatis-generator.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration
  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  5. <generatorConfiguration>
  6. <context id="MySql" defaultModelType="flat">
  7. <!--搜索:need to change-->
  8. <!-- 查询单条数据插件 -->
  9. <plugin type="com.itfsw.mybatis.generator.plugins.SelectOneByExamplePlugin"/>
  10. <!-- MySQL分页插件 -->
  11. <plugin type="com.itfsw.mybatis.generator.plugins.LimitPlugin">
  12. <!-- 通过配置startPage影响Example中的page方法开始分页的页码,默认分页从0开始 -->
  13. <property name="startPage" value="0"/>
  14. </plugin>
  15. <!-- Example Criteria 增强插件 -->
  16. <plugin type="com.itfsw.mybatis.generator.plugins.ExampleEnhancedPlugin">
  17. <!-- 是否支持已经过时的andIf方法(推荐使用when代替),默认支持 -->
  18. <property name="enableAndIf" value="true"/>
  19. </plugin>
  20. <!-- Example 目标包修改插件 need to change-->
  21. <plugin type="com.itfsw.mybatis.generator.plugins.ExampleTargetPlugin">
  22. <!-- 修改Example类生成到目标包下 -->
  23. <property name="targetPackage" value="com.alvin.biaozhu.entity.example"/>
  24. </plugin>
  25. <!-- 数据Model属性对应Column获取插件 -->
  26. <plugin type="com.itfsw.mybatis.generator.plugins.ModelColumnPlugin"/>
  27. <!-- 数据Model链式构建插件 -->
  28. <plugin type="com.itfsw.mybatis.generator.plugins.ModelBuilderPlugin"/>
  29. <!-- 批量插入插件 -->
  30. <plugin type="com.itfsw.mybatis.generator.plugins.BatchInsertPlugin">
  31. <!--
  32. 开启后可以实现官方插件根据属性是否为空决定是否插入该字段功能
  33. !需开启allowMultiQueries=true多条sql提交操作,所以不建议使用!插件默认不开启
  34. -->
  35. <property name="allowMultiQueries" value="false"/>
  36. </plugin>
  37. <!-- 存在即更新插件 -->
  38. <plugin type="com.itfsw.mybatis.generator.plugins.UpsertPlugin">
  39. <!--
  40. 支持upsertByExample,upsertByExampleSelective操作
  41. !需开启allowMultiQueries=true多条sql提交操作,所以不建议使用!插件默认不开启
  42. -->
  43. <property name="allowMultiQueries" value="false"/>
  44. <!--
  45. 开启批量功能,支持batchUpsert,batchUpsertWithBLOBs,batchUpserSelective
  46. !这几个方法中无法支持IncrementsPlugin的方法!插件默认不开启
  47. -->
  48. <property name="allowBatchUpsert" value="fasle"/>
  49. </plugin>
  50. <!-- 增量插件 -->
  51. <plugin type="com.itfsw.mybatis.generator.plugins.IncrementPlugin"/>
  52. <!--<table tableName="tb">-->
  53. <!--&lt;!&ndash; 配置需要进行增量操作的列名称(英文半角逗号分隔) &ndash;&gt;-->
  54. <!--<property name="incrementColumns" value="field1,field2"/>-->
  55. <!--</table>-->
  56. <!-- 查询结果选择性返回插件 -->
  57. <plugin type="com.itfsw.mybatis.generator.plugins.SelectSelectivePlugin"/>
  58. <!-- Selective选择插入更新增强插件 -->
  59. <plugin type="com.itfsw.mybatis.generator.plugins.SelectiveEnhancedPlugin"/>
  60. <!-- Lombok插件 -->
  61. <plugin type="com.itfsw.mybatis.generator.plugins.LombokPlugin">
  62. <!-- @Data 默认开启,同时插件会对子类自动附加@EqualsAndHashCode(callSuper = true),@ToString(callSuper = true) -->
  63. <property name="@Data" value="true"/>
  64. <!-- @Builder 必须在 Lombok 版本 >= 1.18.2 的情况下开启,对存在继承关系的类自动替换成@SuperBuilder -->
  65. <property name="@Builder" value="false"/>
  66. <!-- @NoArgsConstructor 和 @AllArgsConstructor 使用规则和Lombok一致 -->
  67. <property name="@AllArgsConstructor" value="false"/>
  68. <property name="@NoArgsConstructor" value="false"/>
  69. <!-- @Getter、@Setter、@Accessors 等使用规则参见官方文档 -->
  70. <property name="@Accessors(chain = true)" value="false"/>
  71. <!-- 临时解决IDEA工具对@SuperBuilder的不支持问题,开启后(默认未开启)插件在遇到@SuperBuilder注解时会调用ModelBuilderPlugin来生成相应的builder代码 -->
  72. <property name="supportSuperBuilderForIdea" value="false"/>
  73. </plugin>
  74. <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
  75. <!-- Mapper注解插件 -->
  76. <plugin type="com.itfsw.mybatis.generator.plugins.MapperAnnotationPlugin">
  77. <!-- @Mapper 默认开启 -->
  78. <property name="@Mapper" value="true"/>
  79. <!-- @Repository 默认关闭,开启后解决IDEA工具@Autowired报错 -->
  80. <property name="@Repository" value="true"/>
  81. </plugin>
  82. <!--<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />-->
  83. <!--数据库连接配置 need to change-->
  84. <jdbcConnection
  85. driverClass="com.mysql.jdbc.Driver"
  86. connectionURL="jdbc:mysql://soft.tianyunperfect.cn:3306/biaozhu?nullCatalogMeansCurrent=true"
  87. userId="dev"
  88. password="kaimen"/>
  89. <!--指定自动生成的 POJO置于哪个包下 need to change -->
  90. <javaModelGenerator targetPackage="com.alvin.biaozhu.entity"
  91. targetProject="src/main/java"></javaModelGenerator>
  92. <!--指定自动生成的 mapper.xml置于哪个包下 -->
  93. <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"></sqlMapGenerator>
  94. <!--指定自动生成的 DAO接口置于哪个包下 need to change-->
  95. <javaClientGenerator targetPackage="com.alvin.biaozhu.mapper"
  96. targetProject="src/main/java" type="XMLMAPPER"></javaClientGenerator>
  97. <!--指定数据表名,可以使用_和%通配符-->
  98. <table tableName="similar"></table>
  99. </context>
  100. </generatorConfiguration>

生成代码

双击即可生成代码

image.png

效果:

image.png

使用

  1. -----原始用法------
  2. public PageResult<Phone> findByExample(String userId, Date date,int pageNum, int pageSize) {
  3. PhoneExample phoneExample = new PhoneExample();
  4. PhoneExample.Criteria criteria = phoneExample.createCriteria();
  5. /**
  6. * 多条件
  7. */
  8. criteria.andUserIdEqualTo(userId);
  9. criteria.andPhoneGetTimeGreaterThan(new Date());
  10. /**
  11. * 排序
  12. */
  13. String orderByClause = "user_name DESC";
  14. phoneExample.setOrderByClause(orderByClause);
  15. /**
  16. * 查询,分页必须卸载查询的前一行
  17. */
  18. phoneExample.page(pageNum, pageSize);
  19. List<Phone> list = phoneMapper.selectByExample(phoneExample);
  20. return new PageResult<Phone>(list.size(), list);
  21. }

Module的构建

  1. User user = User.builder()
  2. .id(1L)
  3. .userName("userName")
  4. .passwd("passwd")
  5. .build();

条件的构建

  1. UserExample userExample = UserExample.newAndCreateCriteria()
  2. .andUserNameEqualTo(userName)
  3. .when(Math.random() > 1, criteria -> criteria.andIdGreaterThan(1L))
  4. .when(Math.random() > 1, criteria -> criteria.andIdGreaterThan(1L), criteria -> criteria.andIdGreaterThan(1L))
  5. .example()
  6. .orderBy(User.Column.id.desc());

查询单条记录

  1. userMapper.selectOneByExample(UserExample.newAndCreateCriteria().example());

查询多条记录

  1. List<User> users = userMapper.selectByExample(userExample);

修改和插入

  1. # 批量插入
  2. userMapper.batchInsert(Arrays.asList(user));
  3. # 单条插入
  4. userMapper.insert(user);
  5. # 存在即更新,类似于JPA的save
  6. userMapper.upsert(user);
  7. # 有时候我们要对某列设置为null,但是mybatis会判断如果是null则不生成sql,我们要使用Selective
  8. tbMapper.insertSelective(tb, Tb.Column.field1, Tb.Column.field2);
  9. tbMapper.updateByPrimaryKeySelective(tb, Tb.Column.field1, Tb.Column.field2);

增量更新

生成pojo前,需要提前配置好

  1. // 在构建更新对象时,配置了增量支持的字段会增加传入增量枚举的方法
  2. Tb tb = Tb.builder()
  3. .id(102)
  4. .field4(new Date())
  5. .build()
  6. .increment(Tb.Increment.field1.inc(1)) // 字段1 统计增加1
  7. .increment(Tb.Increment.field2.dec(2)); // 字段2 统计减去2
  8. // 更新操作,可以是 updateByExample, updateByExampleSelective, updateByPrimaryKey
  9. // , updateByPrimaryKeySelective, upsert, upsertSelective等所有涉及更新的操作
  10. this.tbMapper.updateByPrimaryKey(tb);

查询结果选择性返回

  1. // 查询操作精确返回需要的列
  2. this.tbMapper.selectByExampleSelective(
  3. new TbExample()
  4. .createCriteria()
  5. .andField1GreaterThan(1)
  6. .example(),
  7. Tb.Column.field1,
  8. Tb.Column.field2
  9. );
  10. // 同理还有 selectByPrimaryKeySelective,selectOneByExampleSelective(SelectOneByExamplePlugin插件配合使用)方法
  11. // 当然可以使用excludes
  12. this.tbMapper.selectByExampleSelective(
  13. new TbExample()
  14. .createCriteria()
  15. .andField1GreaterThan(1)
  16. .example(),
  17. Tb.Column.excludes(Tb.Column.id, Tb.Column.delFlag)
  18. );

分页

  1. example.page(pageNum,pageSize); 从0页开始