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岁。
只有工匠精神,才能把常人觉得单调乏味的代码,当作作品雕刻成艺术品。
原文地址:https://www.cnblogs.com/BillySir/p/15341002.html