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岁。
    只有工匠精神,才能把常人觉得单调乏味的代码,当作作品雕刻成艺术品。
  • 相关阅读:
    Android中Context具体解释 ---- 你所不知道的Context
    JDK6、Oracle11g、Weblogic10 For Linux64Bit安装部署说明
    matplotlib 可视化 —— 定制 matplotlib
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    指数函数的研究
    指数函数的研究
    指数分布的研究
  • 原文地址:https://www.cnblogs.com/BillySir/p/15341002.html
Copyright © 2011-2022 走看看