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岁。
只有工匠精神,才能把常人觉得单调乏味的代码,当作作品雕刻成艺术品。
重点:这里几乎每一篇文章,都是我认真创作的,凝结了心血。写作从来都不是一件容易的事,对从小语文不好的我而言,是难上加难。而且,你发现没有,文中没有广告。这篇文章介绍了为什么要写这些文章。
放个赞赏码,省得找起麻烦,万一真有人要赞赏呢。赞赏伤钱,三思后行。真要赞赏,一两块意思一下就好。