设为首页 收藏本站
查看: 727|回复: 0

[经验分享] 编写mybatis generator插件

[复制链接]

尚未签到

发表于 2016-11-26 02:55:02 | 显示全部楼层 |阅读模式
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/
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>

DSC0000.gif 这样就可以在代码生成时使用插件了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305477-1-1.html 上篇帖子: mybatis 多数据源配置 下篇帖子: MyBatis运用心得(2)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表