编写mybatis generator插件
程序员文章站
2022-06-12 18:45:47
...
1、需求
如果使用mybatis generator进行代码生成,将会自动生成model类,类中将会包括所有数据库字段的定义及get/set方法,如果数据库结构进行更改,那我们将再次进行代码生成,然后覆盖掉之前的model类。
这里存在一个很大的问题就是,如果项目我们已经在model中添加了其它辅助字段或者方法,那么文件就不能直接覆盖,因为会把以前的逻辑一起覆盖掉。
2、解决方案
将所有数据库字段提升至model类的父类,而在model类中实现业务逻辑,这样如果需要数据库结构有变,也只需要覆盖model类的父类即可,业务逻辑并不受影响。
举例:
User表拥有字段username,password,之前对应model类User,数据库字段及业务逻辑都写在这里,处理后,将原User类中的数据库字段全部提至AbstractUser类中,User类继承AbstractUser类,User类中则专门用于实现业务逻辑,之后如果User表需要添加字段如sex,则只需要覆盖AbstractUser类即可。
而这一切,我们希望跟以前一样进行生成即可
3、编写插件
mybatis generator插件继承自PluginAdapter,通过重写相关方法,实现功能,所有提供的方法在调用上有前后顺序关系,具体可以参考generator API http://generator.sturgeon.mopaas.com/
4、配置文件中注册插件
这样就可以在代码生成时使用插件了
如果使用mybatis generator进行代码生成,将会自动生成model类,类中将会包括所有数据库字段的定义及get/set方法,如果数据库结构进行更改,那我们将再次进行代码生成,然后覆盖掉之前的model类。
这里存在一个很大的问题就是,如果项目我们已经在model中添加了其它辅助字段或者方法,那么文件就不能直接覆盖,因为会把以前的逻辑一起覆盖掉。
2、解决方案
将所有数据库字段提升至model类的父类,而在model类中实现业务逻辑,这样如果需要数据库结构有变,也只需要覆盖model类的父类即可,业务逻辑并不受影响。
举例:
User表拥有字段username,password,之前对应model类User,数据库字段及业务逻辑都写在这里,处理后,将原User类中的数据库字段全部提至AbstractUser类中,User类继承AbstractUser类,User类中则专门用于实现业务逻辑,之后如果User表需要添加字段如sex,则只需要覆盖AbstractUser类即可。
而这一切,我们希望跟以前一样进行生成即可
3、编写插件
mybatis generator插件继承自PluginAdapter,通过重写相关方法,实现功能,所有提供的方法在调用上有前后顺序关系,具体可以参考generator API http://generator.sturgeon.mopaas.com/
public class ModelAbstractPlugin extends PluginAdapter { @Override public boolean validate(List<String> list) { return true; } @Override public List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable) { List<GeneratedJavaFile> list = new ArrayList<GeneratedJavaFile>(); List<TopLevelClass> units = new ArrayList<TopLevelClass>(); if (introspectedTable.getRules().generateBaseRecordClass()) units.add(generateRealRecordClass(introspectedTable, new FullyQualifiedJavaType(introspectedTable.getBaseRecordType()))); if (introspectedTable.getRules().generateRecordWithBLOBsClass()) units.add(generateRealRecordClass(introspectedTable, new FullyQualifiedJavaType(introspectedTable.getRecordWithBLOBsType()))); CompilationUnit unit; for (Iterator<TopLevelClass> iterator = units.iterator(); iterator.hasNext();) { unit = (CompilationUnit)iterator.next(); list.add(new GeneratedJavaFile(unit, getContext().getJavaModelGeneratorConfiguration().getTargetProject(), getContext().getJavaFormatter())); } return list; } @Override public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { makeSerializable(topLevelClass, introspectedTable); ReflectUtils.getInstance().setFieldValue(topLevelClass, "type", getAbstractType(topLevelClass)); return true; } @Override public boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { makeSerializable(topLevelClass, introspectedTable); ReflectUtils.getInstance().setFieldValue(topLevelClass, "type", getAbstractType(topLevelClass)); return true; } protected void makeSerializable(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { Field field = new Field(); field.setFinal(true); field.setInitializationString("1L"); field.setName("serialVersionUID"); field.setStatic(true); field.setType(new FullyQualifiedJavaType("long")); field.setVisibility(JavaVisibility.PRIVATE); List<Field> fields = topLevelClass.getFields(); fields.add(0, field); } protected TopLevelClass generateRealRecordClass(IntrospectedTable introspectedTable, FullyQualifiedJavaType recordType) { TopLevelClass answer = new TopLevelClass(recordType); answer.setSuperClass(getAbstractType(answer)); answer.setVisibility(JavaVisibility.PUBLIC); makeSerializable(answer, introspectedTable); return answer; } protected FullyQualifiedJavaType getAbstractType(TopLevelClass topLevelClass) { return new FullyQualifiedJavaType(getAbstractTypeName(topLevelClass)); } protected String getAbstractTypeName(TopLevelClass topLevelClass) { String prefix = "Abstract"; return (new StringBuilder(String.valueOf(topLevelClass.getType().getPackageName()))).append(".").append(prefix).append(topLevelClass.getType().getShortName()).toString(); } }
4、配置文件中注册插件
<plugin type="com.test.mybatis.generator.plugins.ModelAbstractPlugin"></plugin>
这样就可以在代码生成时使用插件了
上一篇: PHP方法位置
下一篇: web前端开发小工具集合