上班两个月了,遇到一个很难以理解的设计,需求是:为了统一管理数据库(??我是没理解),做法是把数据库的列名写在java文件中,我感觉很不可思议
具体做法是这样的,把现在的数据库表名,列名都写在一个java文件中,像
public static final String 表名+列名这样,然后全部sql语句都统一引用该文件中的语句
(这里有一点小弟必须声明一下,该软件只是一个应用软件,所以都是用拼字符串来写sql的,这个做法好与坏暂且不讨论)。然后我问该设计者
:为什么这样做,是针对什么需求这样做的?
答
:为了以后维护,统一管理起数据库,如果你有什么想法,你可以说看看(我是听得很奇怪,感觉模棱两可的,硬是没了解这需求是什么)
按小弟的理解,这样的做法唯一的好处,就是以后表名列名改了,sql语句不用改,但是坏处是可想而知的,所有名字定义在文件中,那写sql的效率会慢了多少倍?维护数据库的同时,又要维护该java文件。看以前写的sql,根本就看不懂,别说修改了……
反正小弟是无法接受这种做法,是否有朋友能指教一下,让小弟接受,或者告诉小弟怎样去说服该设计者(也就是小弟的上司),谢谢了
低调点吧,兄弟
我在上家公司也想改变什么
但在你没得到肯定之前那是不可能的
管它怎样,按原来的搞呗
=上面发现问题的你再说该怎么高吧
事实上,我个人觉得这个想法还是有点意思
通常我会在service层定义,类似于这样
[code="java"]
public class BeanService implements IBeanService {
public final static String TABLENAME = "bean";
public final static String PKCOLUMN = "pk_id";
public final static String[] COLUMNS = { "pk_id", "bean_id", "can_show",
"withdrawn" };
public final static String[] EXPLAINS = { "主键ID", "实体类id", "是否可见", "是否废弃" };
...............
}
[/code]
但是写在一起,我倒是没考虑过
[quote]为了以后维护,统一管理起数据库[/quote]
说的很有理啊..
单用jdbc 没有规则约束 那代码如何维护
[quote]按小弟的理解,这样的做法唯一的好处,就是以后表名列名改了,sql语句不用改,但是坏处是可想而知的,所有名字定义在文件中,那写sql的效率会慢了多少倍?[/quote]
好处你理解的很对
坏处[color=red]完全[/color]不存在...建议深入学习java基础...
[quote]维护数据库的同时,又要维护该java文件。看以前写的sql,根本就看不懂,别说修改了……[/quote]
按照我的理解 你们领导的想法 这个java文件 就代替数据库文档了
你以后修改数据库 不用改文档么?
让我选 我也愿意改java代码 至少ide中有注释
[quote]反正小弟是无法接受这种做法,是否有朋友能指教一下,让小弟接受,或者告诉小弟怎样去说服该设计者(也就是小弟的上司),谢谢了[/quote]
你需要明确几点..
你才入职两个月.
不要想着改变公司已有的东西..没资格 也没能力..
就好像我们公司ssh都快要退出时代了..我们还在用纯jsp开发...
改变? 现在开发得好好的 没遇到什么问题 换ssh能带来什么?
你们领导还不错
对于这种问题 居然用 "如果你有什么想法,你可以说看看" 可见是个好领导..要珍惜
[quote]
[code="java"]String sql = "select count(*) from " + TPDBConstants.DB_TABLE_4_BTP_2_MIB_RELATIONSHIP + "," + TPDBConstants.DB_TABLE_4_BTP_USED_MIB_TABLE + " where "
+ TPDBConstants.DB_TABLE_4_BTP_2_MIB_RELATIONSHIP + "." + TPDBConstants.DB_BTP_2_MIB_RELATIONSHIP_4_BTP_2_MIB_ID + " = "
+ TPDBConstants.DB_TABLE_4_BTP_USED_MIB_TABLE + "." + TPDBConstants.DB_BTP_USED_MIB_TABLE_4_BTP_2_MIB_ID + " and "
+ TPDBConstants.DB_BTP_2_MIB_RELATIONSHIP_4_OID_NAME + " is not null and " + TPDBConstants.DB_BTP_2_MIB_RELATIONSHIP_4_BTP_MAIN_TABLE_ID
+ " is not null and " + TPDBConstants.DB_TABLE_4_BTP_USED_MIB_TABLE + "." + TPDBConstants.DB_BTP_USED_MIB_TABLE_4_BTP_MIB_TABLE_ID + " = '"
+ BTP_MIB_TABLE_ID + "'";
[/code]
[/quote]
这段代码这么读 肯定没法读
但是在eclipse或者其他ide中
这些变量有注释的话 移上去读起来应该比读纯字符串拼接要容易吧?
[quote]没尝试过这痛苦的人啊
~你去写写,改改就知道了,一按“.”,出来的是一页页的
其实小弟当时没想反驳他,就写了正则表达式匹配的方法去解析sql语句,然后通过按规则拼接,反射回来得到该字符串(因为都是final static,这反射性能应该不慢),但是方法不太通用,只能兼容比较少部份的sql关键字,而且也不敢写通用,多人用了要是出现大bug负不起责 [/quote]
那按照表建类啊...
或者按照模块划分类啊
难道非得划分在一个.java中么
我以前开发 所有的struts跳转 都是用类似的方法实现的..
包括struts2本身其实也有类似的功能啊..
设计是通的...
[quote]效率呢,大哥,小弟写sql,一向都是在sql gui窗口中写,复制,粘贴,然后顺便一查,又验证了sql语句,但是这样做呢? [/quote]
效率必然会低一些 当不至于太多
你sql的where条件总还需要拼接吧 只不过多了表名 和 列名...
而且 有哥们不是说了么..做成数组
写个工具类封装一下(然后让他输出sql 你复制到gui中试一下) 不见得慢多少
[quote]再问问这位兄弟什么情况会产生数据库的表名,列名的改变,结构却不改变?
情况很多么?起码网上搜不到这样的情况解决方案,我也没听说过
[/quote]
网上怎么能搜到这种东西呢...
我们公司有一个小团队就是改代码的...(公司做电子政务)
把一个单位的网站改成另外一个单位 地税换交管 业务名称变的多 实际流程大变动的不多..而且表结构这种东西用工具类是可以生成的..改改就是了
事没有绝对 心态要调整
技术选型是你的职责所在吗?
如果是 你完全可以换掉或者修改成你喜欢的
如果不是 公司可能更希望看到的是 给什么任务都用的起来的员工
有很多情况底层员工是不了解的 也许这些情况决定了一些事.
还可以防止拼写错误。