`
changhongbao
  • 浏览: 125583 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

修改mybatis-generator-1.3.2源码实现自定义代码生成详解(二)

 
阅读更多

上一篇对mybatis-generator-core源码的基础修改作了说明,也可以说是最想改的地方,这一篇将在此基础上再做进一步的修改。
    首先说说上一篇最后提到的关于自定义注释的问题,想实现这个功能就需要修改org.mybatis.generator.internal.DefaultCommentGenerator这个类。我将里面一些主要的方法讲下。
    addJavaFileComment(CompilationUnit compilationUnit)
    Java文件加注释,这个注释是在文件的顶部,也就是package上面。
    

    addComment(XmlElement xmlElement)
    给生成的XML文件加注释。大象将这个方法清空了,不生成注释。

    addClassComment(InnerClass innerClass,IntrospectedTable introspectedTable)
    Java类的类注释。
    

    请注意红线的getRemarks()方法,这个remarks属性在原来的FullyQualifiedTable里面是没有的,这是大象自己加上去的,就是为了保存表的注释信息。那是在哪里加进去的呢?请看org.mybatis.generator.internal.db.DatabaseIntrospector这个类,大概浏览下就会发现,数据库表以及列的信息读取,类型设置都是由它来完成的,定位到608行,正好这里是个空行,插入几行代码。如下:
    
    这样我们就取到了表的注释信息,看到这里应该就会明白了吧?
    另外我需要说明的是,想通过databaseMetaData.getTables()来获得表注释的童鞋,这个做法是没用的,大象已经试过了,这个结果集里面的rs.getString("REMARKS")得到的是一个空字符串,什么都木有。而且大象还想吐槽下,网上一大堆说返回的这个结果集是10列,呵呵,是的么?我debug了好久发现它还是只有5列,不知道这10列是从哪来的,请打印出10列的童鞋告之是怎么做的,我用的mysql驱动是5.1.29

    addFieldComment(Field field, IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
    Java属性注释。注释为空就不给属性添加。
    

    addGetterComment(Method method,IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn)
    getter方法加注释。这里添加注释的方法和Field一样,大象把这个方法以及addSetterComment方法都清空了,因为我比较习惯把注释加到属性上面,如果你习惯在getter方法上面加注释可以自行改一下。
    上面这些修改做完后,记得要在org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator61行增加下面这行代码:
    commentGenerator.addClassComment(topLevelClass, introspectedTable);
    因为mybatis-generator源码中本来就是不加类注释的。
    大家都在不同的公司,要求肯定都不一样,大象没法满足所有人,只对该类做了一定程度的修改,姑且把它当做一个示例模板吧,主要是弄明白怎么改就成了。

    mybatis-generator1.3.2版里对生成xmlnamespace作了修改,不再用表名当为namespace的值,而是用包结构+类名+Mapper后缀的形式设置,大象不喜欢这么复杂做法,所以这里需要改一改,只保留类名+Mapper的命名形式。去掉org.mybatis.generator.api.IntrospectedTable类的907行与908行代码。

    接下来再来说说对大对象类型的处理,mybatis-generator默认会把所有jdbcType为:BINARYBLOBCLOBLONGVARBINARYLONGVARCHARVARBINARY这些类型都作为大对象,反应出来的效果就是生成的pojo类会多一个类名+WithBLOBs.java的文件(含有的大对象个数大于1),而在XML里面也会增加一个idResultMapWithBLOBsresultMap,它继承BaseResultMap,大象一向喜欢简单的风格,这看得太不爽了。如果你觉得无所谓,不需要修改,请跳过这段往下看。
    表中的textblob等类型,通过databaseMetaData.getColumns()取出来后,它的rs.getInt("DATA_TYPE")值是与java.sql.Types对应的。
    text类型的值:Types.LONGVARCHAR
    blob类型是值:Types.LONGVARBINARY
    它用org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl解析java类型与jdbc类型,然后设置到org.mybatis.generator.api.IntrospectedColumnjdbcTypeName属性里,最关键的地方到了,IntrospectedColumn类第156行有个isBLOBColumn()方法,它就是用来判断是否生成xxxWithBLOBs.javaResultMapWithBLOBs的条件。当然mybatis-generator不会这么直接用,它在里面定义了一个Rules接口,由它来统一进行调用。所以我们只需要把isBLOBColumn()里面的代码都去掉,直接返回false就可以了,再结合配置文件中的columnOverride属性就能达到目的。
    

    jdbcType指定的值就是生成xmlresult里面对应的类型,javaType与生成的pojo里面属性类型一致,这里其实可以不定义javaType,但是当数据库的表字段有的定义为tinyint时,如果不给它指定类型,那么默认生成的java类型就是java.lang.Byte,假如你想转换类型,而且保证不会超出字段类型的大小限制,那么你可以将它的javaType设为java.lang.Integer
    经过这么一番修改之后,输出结果已经比较理想了,但是xml文件看上去还是有点问题,元素与元素之间没空行,看起来好别扭。恩,这里要给它加上空行,所以请找到org.mybatis.generator.api.dom.xml.XmlElement类的getFormattedContent方法,这个方法有个参数:indentLevel,通过名字我们可以很直观的理解它的作用就是来控制缩进等级,它的初始值为0,这表示不缩进,当变成1时就是缩进一级,也即缩进四个空格,后面以此类推,我们应该还注意到,方法内部用到了递归,所以它是从最底元素开始,再一步步返回,所以我们就应该在indentLevel1的元素后面加上换行。
    

    在生成xml的文件里面,我们看到有一个update元素,idupdateByPrimaryKey,这个基本上用不到,但是你还不能在table里加上enableUpdateByPrimaryKey="false",如果你这么做,虽然updateByPrimaryKey没有了,但updateByPrimaryKeySelective也会消失。所以这时请看看org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator这个类,getSqlMapElement()里面,有大量的addXXX方法,这些方法里面每个都用到了Rules规则来处理是否执行,比如我们在table里面加了enableDeleteByExample="false",它对应的是addDeleteByExampleElement(),而它又调用了introspectedTable.getRules().generateDeleteByExample()方法,再进入到generateDeleteByExample()里面,我们可以看到红线部分,上一篇大象讲过,在加载配置文件的时候,TableConfiguration会将table中的这些属性设置到对应的属性里,所以说其实最后还是回到了判断enableDeleteByExample的布尔值上面。
    

    上面啰嗦了一大堆,现在再来解决之前提到的问题,如何去掉idupdateByPrimaryKeyupdate元素,注释掉addUpdateByPrimaryKeyWithoutBLOBsElement()或直接去掉这行代码,跟踪代码你会发现,它和addUpdateByPrimaryKeySelectiveElement()rules验证里面都用到了enableUpdateByPrimaryKey的值。或者你不想采取我说的这个办法,而是改BaseRulesgenerateUpdateByPrimaryKeyWithoutBLOBs(),让它直接返回false
    最后大象再唠叨一句,这些addXXX方法的顺序决定了生成xml文件中的元素顺序,所以有代码洁癖的人可以作下调整。
    上一篇加这一篇都是讲怎么少量的改动源码以实现自定义文件输出,写的比较凌乱,不是很系统,完全是从实用的角度出发,关键还是大象水平有限,有什么错误还请大家帮我指出来,谢谢!
    改了这么多,总要看下效果吧,下一篇大象将写个测试看看生成的结果,然后用maven assembly将它打包生成一个zip,它将包含:
    
    本文为菠萝大象原创,如要转载请注明出处。http://www.blogjava.net/bolo

分享到:
评论

相关推荐

    mybatis-generator-1.3.2.zip

    MyBatis Generator(MBG)是一个强大的工具,用于在Java环境下自动生成MyBatis相关的代码。这个工具的主要目的是提升开发效率,减少手动编写常见的DAO层、Mapper XML文件以及对应的Java Domain对象。`mybatis-...

    芋道 yudao ruoyi-vue-pro pay sql , 更新时间 2024-08 ,可对应yudao版本2.4.1

    芋道 yudao ruoyi-vue-pro pay sql , 更新时间 2024-08 ,可对应yudao版本2.4.1

    手势识别_CNN_训练测试_问题解决技巧_1741785490.zip

    图像处理项目实战

    中国民营科技促进会2023中国大数据企业排行榜V8.0大数据产业白皮书110页.pdf

    中国民营科技促进会2023中国大数据企业排行榜V8.0大数据产业白皮书110页.pdf

    java-springboot+vue大药房管理系统实现源码(项目源码-说明文档).zip

    系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

    车辆识别_深度学习_图像预处理_实际应用CarModelRe_1741786237.zip

    图像处理项目实战

    一周入门 UE 开发教程背景知识

    一周入门 UE 开发教程背景知识

    车辆识别_深度学习_车牌检测与识别_OpenCV部署dete_1741774462.zip

    车牌识别项目

    Kubernetes K8s架构师实战.zip

    目录: 第 1 章:Ansible 自动化部署 K8S 集群【内含6个文件】 第 2 章:弹性伸缩【内含4个文件】 第 3 章:Helm 应用包管理器(v3)【内含3个文件】 第 4 章:K8S 集群网络【内含1个文件】 第 5 章:K8S 存储 之 Ceph 分布式存储系统【内含4个文件】 第 6 章:微服务容器化迁移【内含3个文件】 第 7 章:基于 K8S 构建企业 Jenkins CICD 平台(微服务)【内含4个文件】 第 8 章:服务治理 Istio 初探【内含1个文件】 网盘文件永久链接

    基于Springboot框架的网上在线点餐系统平台的设计和实现(完整源码+完整毕设文档+数据库文件+ppt).zip

    第一章 绪 论 1 1.1背景及意义 1 1.2国内外研究概况 2 1.3 研究的内容 2 第二章 关键技术的研究 3 2.1 相关技术 3 2.2 Java技术 3 2.3 ECLIPSE 开发环境 4 2.4 Tomcat介绍 4 2.5 Spring Boot框架 5 第三章 系统分析 5 3.1 系统设计目标 6 3.2 系统可行性分析 6 3.3 系统功能分析和描述 7 3.4系统UML用例分析 8 3.4.1管理员用例 9 3.4.2用户用例 9 3.5系统流程分析 10 3.5.1添加信息流程 11 3.5.2操作流程 12 3.5.3删除信息流程 13 第四章 系统设计 14 4.1 系统体系结构 15 4.2 数据库设计原则 16 4.3 数据表 17 第五章 系统实现 18 5.1用户功能模块 18 5.2管理员功能模块 19 5.3美食店功能模块 19 5.4前台首页功能模块 19 第六章 系统测试 20 6.1测试定义及目的 21 6.2性能测试 22 6.3测试模块 23 6.4测试结果 24 总 结 26 致 谢 27 参考文献 28

    33559399361500导师评价.zip

    33559399361500导师评价.zip

    前端后端修改改进第一次

    前端后端修改改进第一次

    网络安全是指通过技术、管理和法律手段保护网络系统、数据及用户隐私,防止未经授权的访问、攻击和信息泄露,确保可用性、完整性和机密性

    网络安全是通过技术手段、管理策略和法律规范,保护网络系统、数据及用户隐私免受未经授权的访问、攻击或泄露,确保网络服务的可用性、数据的完整性和机密性。其核心内容包括: 1. 技术防护:如防火墙、入侵检测系统(IDS)、加密通信、漏洞修复等。 2. 管理措施:包括安全策略制定、访问控制、安全审计、应急响应等。 3. 法律与合规:遵循《网络安全法》《数据安全法》等法规,保障用户隐私与国家安全。 4. 安全意识:提升用户对钓鱼攻击、密码安全等风险的防范能力。 # 适用人群 - 企业/组织:IT运维人员、安全管理员、开发工程师(需保障业务系统安全)。 - 普通用户:需防范个人信息泄露、网络诈骗等风险。 - 政府与公共部门:确保关键基础设施(如电力、金融、通信)的安全运行。 - 教育领域:学生及教师需了解基础安全知识以应对网络威胁。 # 适用场景及目标 1. 企业场景: - 目标:防御黑客攻击、数据泄露、勒索软件等,保障业务连续性。 - 措施:部署网络隔离、多因素认证、定期渗透测试。 2

    基于C#的调用今日头条API并写入数据库 源码.zip

    需要将源码中的key换成正式的key方可使用

    幼儿园教师儿童行为观察:困惑与思考.docx

    幼儿园教师儿童行为观察:困惑与思考

    RAG-Adapter:一种即插即用的RAG增强框架,用于长视频理解

    多模态大语言模型(MLLMs)具备视频理解能力,正在迅速发展。为了有效评估其视频理解能力,提出了针对长视频理解的基准测试,如Video-MME和MLVU。然而,这些基准直接使用均匀帧采样进行测试,导致信息大量丢失,影响了评估结果对MLLMs真实能力的准确性。为此,我们提出了一种称为RAG-Adapter的即插即用框架,通过采样与给定问题最相关的帧来减少测试期间的信息损失。此外,我们引入了一种分组监督对比学习(GCL)方法,以进一步通过在我们构建的MMAT数据集上的微调来提高RAG-Adapter的采样效果。最后,我们在各种视频理解基准上测试了多个基线MLLMs,发现RAG-Adapter采样始终优于均匀采样(例如,GPT-4o在Video-MME上的准确率提高了9.3%),为长视频基准提供了一种更准确的测试方法。

    智慧工业园区大数据云平台建设方案Word(321页).docx

    在当今数字化浪潮中,园区智慧化建设正成为推动区域经济发展和产业转型升级的关键力量。这份园区智慧化解决方案全面展示了如何通过集成大数据、云计算、物联网(IoT)、人工智能(AI)、地理信息系统(GIS)和建筑信息模型(BIM)等前沿技术,为传统产业园区插上数字的翅膀,打造“数字创新”产业园区。 数字技术赋能,重塑园区生态 传统产业园区往往面临运营效率低下、管理粗放、资源利用率不高等问题。而通过智慧化改造,园区可以实现从“清水房”到“精装房”的华丽蜕变。数字化技术不仅提升了园区的运营管理水平,降低了运营成本,还显著增强了园区的竞争力和吸引力。例如,通过构建园区数字模型(CIM),实现了多规数据融合,形成了园区规划“一张图”,为园区管理提供了直观、高效的可视化工具。此外,智能感知设施的应用,如环境监测、能耗监测等,让园区管理更加精细化、科学化。智慧能源管理系统通过实时监测和智能分析,帮助园区实现低碳绿色发展,而综合安防管控系统则通过AI+视频融合技术,为园区安全保驾护航。更有趣的是,这些技术的应用还让园区服务变得更加个性化和便捷,比如园区移动APP,让企业和员工可以随时随地享受园区服务,从会议室预定到智慧公寓管理,一切尽在“掌”握。 智慧运营中心,打造园区大脑 园区智慧化建设的核心在于构建智慧运营中心,这可以看作是园区的“数字大脑”。通过集成物联网服务平台、大数据分析平台、应用开发赋能平台等核心支撑平台,智慧运营中心实现了对园区内各类数据的实时采集、处理和分析。在这个“大脑”的指挥下,园区管理变得更加高效、协同。比如,建设工程项目智慧监管系统,通过基于二三维GIS底图的统一数字化监管,实现了对园区在建工程项目的进度控制、质量控制和安全控制的全方位监管。可视化招商系统则利用CIM模型,以多种方式为园区对外招商推介提供了数字化、在线化的展示窗口。而产业经济分析系统,则通过挖掘和分析产业数据,为园区产业发展提供了有力的决策支持。智慧运营中心的建设,不仅提升了园区的整体运营水平,还为园区的可持续发展奠定了坚实基础。 产业服务升级,激发创新活力 园区智慧化建设不仅关注基础设施和运营管理的升级,更重视产业服务的创新。通过整合平台资源、园区本地资源和外围资源,打造园区服务资源池,为园区内的企业和个人提供了全面的智慧管理、智慧工作和智慧生活服务。特别是工业互联网平台和工业云服务的建设,为园区内的企业提供了轻量化、智能化的生产服务。这些服务涵盖了车间信息化管理、云制造执行、云智能仓储、设备健康管理等多个方面,有效提升了企业的生产效率和竞争力。此外,通过产业经济分析系统,园区还能够对潜在客户进行挖掘、对经销商进行风控、对产品销量进行预测等,为企业的市场营销提供了有力支持。这些创新的产业服务,不仅激发了园区的创新活力,还为区域经济的转型升级注入了新的动力。总之,园区智慧化建设是一场深刻的变革,它正以前所未有的方式重塑着园区的生态、运营和服务模式,为园区的可持续发展开辟了广阔的前景。

    tensorflow实现YOLO实时目标检测训练和测试.zip

    python、yolo、pytorch

    chromedriver-mac-x64-136.0.7064.0.zip

    chromedriver-mac-x64-136.0.7064.0.zip

    图像处理_SIFT_KMeans_自动分类_图片管理工具_1741784322.zip

    图像处理项目实战

Global site tag (gtag.js) - Google Analytics