zoukankan      html  css  js  c++  java
  • Easy Code探测Schema,生成聪明一点点的Mybatis代码

     

    库是什么

      “库”和“表”是关系型数据库的两个重要概念,“库”对应MySQL中的schema。写SQL语句如果是指定当前schema中的表,则可以省略schema,如 select * from tableX 。如果指定的表不属性当前schema,则必须写schema,如 select * from schemaX.tableX 。

    问题

      由于历史原因,我的一个项目,连接的数据库采用了多“库”的形式,所以访问不是当前库的表,需要在表名前加库名作为前缀。也由于历史原因,连接的库(即当前库)名称不固定,有些环境是Xxxx_dev,有些环境是Xxxx_test。

      现在用Java做项目,操作数据库往往是用MyBatis这个轻易级的持久化框架。为了工作高效,我还配了代码生成工具。这个生成工具叫Easy Code,以插件的形式集成在IDEA使用,比独立的生成工具方便了不少。在IDEA的Database工具窗口,选中某个数据表,右键就能很方便地生成代码,包括Mybatis的xml Mapper文件在内。

      而EasyCode默认的模板,是没有考虑多库的情况,生成的数据表名都没有带库名作为前缀。如果能动态获取到要生成的表的库名,并且根据库名是不是连接库(当前库)而生成不同的代码,生成的代码不用再经手工修改就能直接使用,大大提高生产效率。

    如何获取选定表的库名

      操作的时候,从界面上选中一个表,模板中如何获取到此表对应的库名?答: tableInfo.obj.parent.name 。

    如何获取连接的库名

      如果表属于连接的库,则不加库名前缀。如何获取当前的库名(即连接的库名)呢?答案是:tableInfo.obj.dataSource.name。但是它的值是长这样的: schemaX@192.168.0.123 ,所以需要截取@后面的内容,即是  tableInfo.obj.dataSource.name.split("@").get(0) 

    做成变量

      由于一份模板要生成的表名有很多个,所以将上述运算得到的表名放在一个变量中,用的时候就简单了。最终代码如下:

    #if($tableInfo.obj.parent.name == $tableInfo.obj.dataSource.name.split("@").get(0))
        #set($tableName = ${tableInfo.obj.name})
    #else
        #set($tableName = ${tableInfo.obj.parent.name} + "." + ${tableInfo.obj.name})
    #end

    这些答案是如何找到的

      在默认的模板中,有一个叫debug的模板一直不知道它是干什么用的,最近才明白用它可以探测想要探测的对象。把不想探测的对象屏蔽掉,一运行它就会显示想探测的对象有哪些属性和属性值。我就是用它一步步探测到我要的数据所在的对象。


    博主简介:佘焕敏(shé),洋名 Billy Sir。
    关注编程基础技术,并致力于研究软件的自动化生成。 对编程规范化、面向对象的极致使用也有着浓厚的兴趣。 同时非常希望能够写程序到65岁。
    只有工匠精神,才能把常人觉得单调乏味的代码,当作作品雕刻成艺术品。
  • 相关阅读:
    Python实现天数倒计时计算
    pandas 的数据结构Series与DataFrame
    在python中使用静态方法staticmethod
    python 中对list做减法操作
    推荐系统之 BPR 算法及 Librec的BPR算法实现【1】
    机器学习中的 ground truth
    PyCharm 默认运行 unittest
    Python的copy()与deepcopy()区别
    MySQL中Decimal类型和Float Double的区别 & BigDecimal与Double使用场景
    Spring Boot 返回 JSON 数据,一分钟搞定!
  • 原文地址:https://www.cnblogs.com/BillySir/p/15341002.html
Copyright © 2011-2022 走看看