“库”和“表”是关系型数据库的两个重要概念,“库”对应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的模板一直不知道它是干什么用的,最近才明白用它可以探测想要探测的对象。把不想探测的对象屏蔽掉,一运行它就会显示想探测的对象有哪些属性和属性值。我就是用它一步步探测到我要的数据所在的对象。