锁定老帖子 主题:Apache的DBUtils
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-25
个人喜欢用xml。不是说xml就一定好,或者该sql一定可以不用改java。同时我也很不喜欢(早期的)hibernate那种方式。
另外,上面说的几年后的维护,我想,如果是“维护”的话应该不会涉及到大的变更,只是小修小补而已,往往只是加个查询条件,或者多个显示项目,排序条件而已。能只改SQL,JSP,不动java,自然是最好的。对于我现在做的大部分应用来说,99%的情况,真的可以只改sql/jsp。 框架是自己封装的(也顺便用到了dbutils),支持ORM。平时从来不需要按照查询条件拼接where。支持${xxx.y[0].zzz}占位符,当[ AND x =xx.xxx ]不存在的时候,自动略过。 BTW,项目并发不高,人员很少(往往1个人),因此,开发效率>运行效率。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="incomemonth"> <![CDATA[ SELECT SUM(price * quantity) AS nextIncome, DAYOFMONTH(date) AS date, storeId FROM t_sale WHERE delFlag = 0 [ AND year(date) = :year ] [ AND month(date) = :month ] GROUP BY date, storeId ]]> </entry> <entry key="expensemonth"> <![CDATA[ SELECT SUM(amount) AS nextExpense, DAYOFMONTH(date) AS date, storeId FROM t_expense WHERE delFlag = 0 [ AND year(date) = :year ] [ AND month(date) = :month ] GROUP BY date, storeId ]]> </entry> <entry key="incomeyear"> <![CDATA[ SELECT SUM(price * quantity) AS nextIncome, month(date) AS date, storeId FROM t_sale WHERE delFlag = 0 [ AND year(date) = :year ] [ AND month(date) = :month ] GROUP BY date, storeId ]]> </entry> <entry key="expenseyear"> <![CDATA[ SELECT SUM(amount) AS nextExpense, month(date) AS date, storeId FROM t_expense WHERE delFlag = 0 [ AND year(date) = :year ] [ AND month(date) = :month ] GROUP BY date, storeId ]]> </entry> <entry key="stores"> <![CDATA[ SELECT * FROM m_config WHERE delFlag = 0 AND category = '1' [ AND id = :storeId ] ORDER BY id ]]> </entry> </properties> |
|
返回顶楼 | |
发表时间:2011-05-25
dsjt 写道 common DBUtil 很轻巧,比JDBC省事,
感觉比 spring 封装的JDBC 更舒服一些, bboss jdbc也非常省事啊 |
|
返回顶楼 | |
发表时间:2011-05-25
QueryRunner 是线程安全的,没必要每个数据库操作方法里都new一个。完全可以共用。
|
|
返回顶楼 | |
发表时间:2011-05-25
二十一 写道 QueryRunner 是线程安全的,没必要每个数据库操作方法里都new一个。完全可以共用。 可以静态初始化下 |
|
返回顶楼 | |
发表时间:2011-05-25
piziwang 写道 确实是的,我们公司现在已经放弃使用什么 iBatis, Hibernate 了;
简单高效就是最好的, 我们全部使用最底层的JDBC,外加一个数据库连接池组件而已。 发现,越是使用一些高集成的东西,我们会变得越笨,到最后连 Class.forName(); DriverManager.getConnection() 最基本的数据库连接都不会了。 那时就悲哀了。呵呵~~ 你用java也是高集成的,你去搞汇编,机器码吧 |
|
返回顶楼 | |
发表时间:2011-05-26
yin_bp 写道 caoyangx 写道 george_space 写道 直接把SQL写在程序中,这样不太好吧,如果有n年前的系统,当初的开发者都消失了。
现在需要改一条SQL语句,还需要重新修改、编译这个老项目啊? 可以考虑把SQL语句提取出来,放到xml中,这样可以集中管理SQL,即使换数据库,也不同动程序,只要修改一下xml中的SQL即可。 你就直接说是IBatis得了,把SQL写在XML中,并且掺杂着逻辑标签,你觉得很爽吗?你觉得DBA喜欢看这些XML标签偶尔出现些SQL关键字的内容吗? 其实把sql语句放到xml文件的不止ibatis吧,国内的bbossgroups中的持久层框架也可以把sql语句放到xml文件中,还支持热加载,改了后立马生效,不用重启应用,详细的情况可以参考文章《bbossgroups 开发系列文章之-最佳实践 》: http://www.iteye.com/wiki/bbossgroups/3092-mvc-bboss-config 中的章节:数据库访问组件及sql语句配置文件和章节:dao组件管理及注入数据库访问组件 典型的配置如下: <?xml version="1.0" encoding="UTF-8"?> <properties> <property name="getRequesterDaoListInfo"> <![CDATA[ select r.*, o.ORG_NAME as service_requester_org_name from TD_ESB_REQUESTER r left join TD_SM_ORGANIZATION o on r.SERVICE_REQUESTER_ORG = o.ORG_ID where 1=1 #if($service_requester_code && !$service_requester_code.equals("")) and SERVICE_REQUESTER_CODE = #[service_requester_code] #end #if($service_requester_account && !$service_requester_account.equals("")) and SERVICE_REQUESTER_ACCOUNT like #[service_requester_account] #end #if($service_requester_name && !$service_requester_name.equals("")) and SERVICE_REQUESTER_NAME like #[service_requester_name] #end #if($service_requester_org && !$service_requester_org.equals("")) and SERVICE_REQUESTER_ORG = #[service_requester_org] #end order by create_time desc ]]> </property> <property name="delete"> <![CDATA[ delete from TD_ESB_REQUESTER where SERVICE_REQUESTER_ID = ? ]]> </property> <property name="findObjectById"> <![CDATA[ select r.*, o.ORG_NAME as service_requester_org_name from TD_ESB_REQUESTER r left join TD_SM_ORGANIZATION o on r.SERVICE_REQUESTER_ORG = o.ORG_ID where SERVICE_REQUESTER_ID = ? ]]> </property> <property name="insert"> <![CDATA[ insert into TD_ESB_REQUESTER(ADDRESS ,BUSINESS_LINE_CODE ,CONTACT ,CREATE_TIME ,CREATOR ,EMAIL ,MODIFIER ,MODIFY_TIME ,PHONE ,SERVICE_REQUESTER_ACCOUNT ,SERVICE_REQUESTER_DESP ,SERVICE_REQUESTER_ID ,SERVICE_REQUESTER_NAME ,SERVICE_REQUESTER_ORG ,SERVICE_REQUESTER_PASSWORD ,USED_FLAG) values(#[address] ,#[business_line_code] ,#[contact] ,#[create_time] ,#[creator] ,#[email] ,#[modifier] ,#[modify_time] ,#[phone] ,#[service_requester_account] ,#[service_requester_desp] ,#[service_requester_id] ,#[service_requester_name] ,#[service_requester_org] ,#[service_requester_password] ,#[used_flag]) ]]> </property> <property name="update"> <![CDATA[ update TD_ESB_REQUESTER set ADDRESS=#[address] ,BUSINESS_LINE_CODE=#[business_line_code] ,CONTACT=#[contact] ,EMAIL=#[email] ,MODIFIER=#[modifier] ,MODIFY_TIME=#[modify_time] ,PHONE=#[phone] ,SERVICE_REQUESTER_ACCOUNT=#[service_requester_account] ,SERVICE_REQUESTER_DESP=#[service_requester_desp] ,SERVICE_REQUESTER_ID=#[service_requester_id] ,SERVICE_REQUESTER_NAME=#[service_requester_name] ,SERVICE_REQUESTER_ORG=#[service_requester_org] ,SERVICE_REQUESTER_PASSWORD=#[service_requester_password] where SERVICE_REQUESTER_ID = #[service_requester_id] ]]> </property> <property name="updateFlag"> <![CDATA[ update TD_ESB_REQUESTER set USED_FLAG = #[used_flag], Modifier = #[modifier], Modify_time = #[modify_time] where SERVICE_REQUESTER_ID = #[service_requester_id] ]]> </property> </properties> DBA观此XML后笑而不语。 |
|
返回顶楼 | |
发表时间:2011-05-30
george_space 写道 直接把SQL写在程序中,这样不太好吧,如果有n年前的系统,当初的开发者都消失了。
现在需要改一条SQL语句,还需要重新修改、编译这个老项目啊? 可以考虑把SQL语句提取出来,放到xml中,这样可以集中管理SQL,即使换数据库,也不同动程序,只要修改一下xml中的SQL即可。 --------------------------------------------------------------------------------------- N年前的老系统,还能只是修改一下SQL就可以了?我表示怀疑。 |
|
返回顶楼 | |