【发布时间】:2010-12-05 09:15:16
【问题描述】:
我正在寻找将 SQL 语句存储在外部文件中的 Java 库/框架/技术。支持团队(包括 DBA)应该能够(稍微)更改语句,以在数据库架构更改或出于调整目的时使它们保持同步。
以下是要求:
- 该文件必须可以从 Java 中读取 应用程序,但也必须是可编辑的 由支持团队无需 高级编辑
- 理想情况下,文件应该是普通的 文本格式,但 XML 也可以
- 允许 DML 和 DDL 语句 存储/检索
- 可以在稍后阶段添加新语句(应用程序足够灵活,可以选择并执行它们)
- 语句可以分组(并由应用程序作为一个组执行)
- 语句应该允许参数
注意事项:
- 一旦检索到,语句将 使用 Spring 的 JDBCTemplate 执行
- Hibernate 或 Spring 的 IOC 容器 不会被使用
到目前为止,我设法找到了以下 Java 库,它们使用外部文件来存储 SQL 语句。但是,我主要对存储感兴趣,而不是隐藏所有 JDBC “复杂性”的库。
-
示例文件内容:
<s:query name="get_emp"> <s:param name="name" type="string"/> <s:sql databases="oracle"> select * from scott.emp join scott.dept on (emp.deptno = dept.deptno) where emp.ename = <s:bind param="name"/> </s:sql> </s:query> -
示例文件内容:
<sqlMap namespace="Contact""> <typeAlias alias="contact" type="com.sample.contact.Contact"/"> <select id="getContact" parameterClass="int" resultClass="contact""> select CONTACTID as contactId, FIRSTNAME as firstName, LASTNAME as lastName from ADMINISTRATOR.CONTACT where CONTACTID = #id# </select> </sqlMap> <insert id="insertContact" parameterClass="contact"> INSERT INTO ADMINISTRATOR.CONTACT( CONTACTID,FIRSTNAME,LASTNAME) VALUES(#contactId#,#firstName#,#lastName#); </insert> <update id="updateContact" parameterClass="contact"> update ADMINISTRATOR.CONTACT SET FIRSTNAME=#firstName# , LASTNAME=#lastName# where contactid=#contactId# </update> <delete id="deleteContact" parameterClass="int"> DELETE FROM ADMINISTRATOR.CONTACT WHERE CONTACTID=#contactId# </delete> -
-- This is a comment ADD_MESSAGE { INSERT INTO MyMessage -- another comment (LoginName, Body, CreationDate) -- another comment VALUES (?,?,?) } -- Example of referring to a constant defined above. FETCH_RECENT_MESSAGES { SELECT LoginName, Body, CreationDate FROM MyMessage ORDER BY Id DESC LIMIT ${num_messages_to_view} }
谁能推荐一个经过试验和测试的解决方案?
【问题讨论】:
-
您确定要将所有 SQL 集中到支持团队可以编辑的文件中吗?他们能把东西弄坏到什么程度?
-
一旦部署,除非发现重大错误,否则应用程序不太可能更改。支持团队不具备修补复杂 Java 应用程序的专业知识,因为他们知道如何修补 SQL 语句。通常他们需要进行 DBA 类型更改而不是实际的应用程序更改
-
WEB4J 示例格式不正确,有编辑权限的人可以解决这个问题吗?
-
认为 Java 代码不会改变是一种错觉。如果您更改查询,您可能必须更改使用结果的代码。
-
SQLind 提供了一种 xml 模板化的方式来从 java 代码中外部化 SQL。