博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis generator插件系列--lombok插件 (减少百分之九十bean代码)
阅读量:6570 次
发布时间:2019-06-24

本文共 10590 字,大约阅读时间需要 35 分钟。

经常使用mybatis generator生成代码的你

有没有因为生成的getter/setter而烦恼呢?

有没有生成后又手动加toString/hashCode/Equals方法呢?

有没有改一个字段又要手动改写getter/setter/toString/hashCode/Equals呢?

下面我将介绍一个mybatis generator Lombok插件来解决以上所有问题

Lombok是一款简单强大的代码工具,没使用过Lombok插件的同学可以用10分钟了解下

1、首先定义Lombok插件

LombokPlugin.java 

package com.demo.mybatis.plugin;import org.mybatis.generator.api.IntrospectedColumn;import org.mybatis.generator.api.IntrospectedTable;import org.mybatis.generator.api.PluginAdapter;import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;import org.mybatis.generator.api.dom.java.Interface;import org.mybatis.generator.api.dom.java.Method;import org.mybatis.generator.api.dom.java.TopLevelClass;import java.util.*;/** * A MyBatis Generator plugin to use Lombok's annotations. * For example, use @Data annotation instead of getter ands setter. * * @author Paolo Predonzani (http://softwareloop.com/) */public class LombokPlugin extends PluginAdapter {    private final Collection
annotations; /** * LombokPlugin constructor */ public LombokPlugin() { annotations = new LinkedHashSet
(Annotations.values().length); } /** * @param warnings list of warnings * @return always true */ public boolean validate(List
warnings) { return true; } /** * Intercepts base record class generation * * @param topLevelClass the generated base record class * @param introspectedTable The class containing information about the table as * introspected from the database * @return always true */ @Override public boolean modelBaseRecordClassGenerated( TopLevelClass topLevelClass, IntrospectedTable introspectedTable ) { addAnnotations(topLevelClass); return true; } /** * Intercepts primary key class generation * * @param topLevelClass the generated primary key class * @param introspectedTable The class containing information about the table as * introspected from the database * @return always true */ @Override public boolean modelPrimaryKeyClassGenerated( TopLevelClass topLevelClass, IntrospectedTable introspectedTable ) { addAnnotations(topLevelClass); return true; } /** * Intercepts "record with blob" class generation * * @param topLevelClass the generated record with BLOBs class * @param introspectedTable The class containing information about the table as * introspected from the database * @return always true */ @Override public boolean modelRecordWithBLOBsClassGenerated( TopLevelClass topLevelClass, IntrospectedTable introspectedTable ) { addAnnotations(topLevelClass); return true; } /** * Prevents all getters from being generated. * See SimpleModelGenerator * * @param method the getter, or accessor, method generated for the specified * column * @param topLevelClass the partially implemented model class * @param introspectedColumn The class containing information about the column related * to this field as introspected from the database * @param introspectedTable The class containing information about the table as * introspected from the database * @param modelClassType the type of class that the field is generated for */ @Override public boolean modelGetterMethodGenerated( Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType ) { return false; } /** * Prevents all setters from being generated * See SimpleModelGenerator * * @param method the setter, or mutator, method generated for the specified * column * @param topLevelClass the partially implemented model class * @param introspectedColumn The class containing information about the column related * to this field as introspected from the database * @param introspectedTable The class containing information about the table as * introspected from the database * @param modelClassType the type of class that the field is generated for * @return always false */ @Override public boolean modelSetterMethodGenerated( Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType ) { return false; } /** * Adds the lombok annotations' imports and annotations to the class * * @param topLevelClass the partially implemented model class */ private void addAnnotations(TopLevelClass topLevelClass) { for (Annotations annotation : annotations) { topLevelClass.addImportedType(annotation.javaType); topLevelClass.addAnnotation(annotation.asAnnotation()); } } @Override public void setProperties(Properties properties) { super.setProperties(properties); //@Data is default annotation annotations.add(Annotations.DATA); for (String annotationName : properties.stringPropertyNames()) { if (annotationName.contains(".")) { // Not an annotation name continue; } String value = properties.getProperty(annotationName); if (!Boolean.parseBoolean(value)) { // The annotation is disabled, skip it continue; } Annotations annotation = Annotations.getValueOf(annotationName); if (annotation == null) { continue; } String optionsPrefix = annotationName + "."; for (String propertyName : properties.stringPropertyNames()) { if (!propertyName.startsWith(optionsPrefix)) { // A property not related to this annotation continue; } String propertyValue = properties.getProperty(propertyName); annotation.appendOptions(propertyName, propertyValue); annotations.add(annotation); annotations.addAll(Annotations.getDependencies(annotation)); } } } @Override public boolean clientGenerated( Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable ) { interfaze.addImportedType(new FullyQualifiedJavaType( "org.apache.ibatis.annotations.Mapper")); interfaze.addAnnotation("@Mapper"); return true; } private enum Annotations { DATA("data", "@Data", "lombok.Data"), BUILDER("builder", "@Builder", "lombok.Builder"), ALL_ARGS_CONSTRUCTOR("allArgsConstructor", "@AllArgsConstructor", "lombok.AllArgsConstructor"), NO_ARGS_CONSTRUCTOR("noArgsConstructor", "@NoArgsConstructor", "lombok.NoArgsConstructor"), ACCESSORS("accessors", "@Accessors", "lombok.experimental.Accessors"), TO_STRING("toString", "@ToString", "lombok.ToString"); private final String paramName; private final String name; private final FullyQualifiedJavaType javaType; private final List
options; Annotations(String paramName, String name, String className) { this.paramName = paramName; this.name = name; this.javaType = new FullyQualifiedJavaType(className); this.options = new ArrayList
(); } private static Annotations getValueOf(String paramName) { for (Annotations annotation : Annotations.values()) if (String.CASE_INSENSITIVE_ORDER.compare(paramName, annotation.paramName) == 0) return annotation; return null; } private static Collection
getDependencies(Annotations annotation) { if (annotation == ALL_ARGS_CONSTRUCTOR) return Collections.singleton(NO_ARGS_CONSTRUCTOR); else return Collections.emptyList(); } // A trivial quoting. // Because Lombok annotation options type is almost String or boolean. private static String quote(String value) { if (Boolean.TRUE.toString().equals(value) || Boolean.FALSE.toString().equals(value)) // case of boolean, not passed as an array. return value; return value.replaceAll("[\\w]+", "\"$0\""); } private void appendOptions(String key, String value) { String keyPart = key.substring(key.indexOf(".") + 1); String valuePart = value.contains(",") ? String.format("{%s}", value) : value; this.options.add(String.format("%s=%s", keyPart, quote(valuePart))); } private String asAnnotation() { if (options.isEmpty()) { return name; } StringBuilder sb = new StringBuilder(); sb.append(name); sb.append("("); boolean first = true; for (String option : options) { if (first) { first = false; } else { sb.append(", "); } sb.append(option); } sb.append(")"); return sb.toString(); } }}

2、然后为mybatisgenerator配置插件

 

3、生成效果

package com.demo.biz.entity.base;import java.io.Serializable;import java.util.Date;import lombok.Data;@Datapublic class UsUserInfo implements Serializable {    /**     *      */    private Integer id;    /**     * 用户id     */    private Integer userId;    /**     * 昵称     */    private String nickName;    /**     * 头像     */    private String headImage;    /**     * 手机号码     */    private String mobile;    /**     * 性别(0保密,1男,2女)     */    private Integer sex;    /**     * 地区     */    private Integer region;    /**     * 个性签名     */    private String signature;    /**     * 用户类型(1普通用户,2达人用户)     */    private Byte type;    /**     * 用户种类     */    private String kindCode;    /**     * r热度     */    private Integer hot;    /**     * 创建时间     */    private Date createTime;    /**     * 更新时间     */    private Date updateTime;    private static final long serialVersionUID = 1L;}

 

本文所有代码及demo:

转载于:https://www.cnblogs.com/cblogs/p/9720370.html

你可能感兴趣的文章
js随笔
查看>>
子元素绝对定位absolute后,自动撑开宽度
查看>>
【权值分块】bzoj1503 [NOI2004]郁闷的出纳员
查看>>
【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate...
查看>>
期末大作业
查看>>
ThreadLocal
查看>>
第一次作业-准备篇
查看>>
cnzz统计代码引起的Bad Request - Request Too Long
查看>>
MinGW安装与使用简介
查看>>
Sublime Text 3 遇到的一些小坑的解决方法
查看>>
JSP之9大对象
查看>>
sql 递归查询
查看>>
KMP C++
查看>>
HDU1506 Largest Rectangle in a Histogram(算竞进阶习题)
查看>>
HTTP响应状态码
查看>>
crushmap磁盘智能分组
查看>>
《算法导论》读书笔记--第三章 函数的增长
查看>>
《利用python进行数据分析》读书笔记--第八章 绘图和可视化
查看>>
栈的操作
查看>>
Flask 备注一(单元测试,Debugger, Logger)
查看>>