我想构建一个SQL字符串来进行数据库操作(更新,删除,插入,选择,那种东西) - 而不是使用数以百万计的"+"和引号的糟糕的字符串连接方法,这些方法最好是不可读的 - 那里必须是一个更好的方法.
我确实想过使用MessageFormat - 但它应该用于用户消息,虽然我认为它会做一个合理的工作 - 但我想在Java sql库中应该有一些更符合SQL类型操作的东西.
Groovy会有什么好处吗?
首先考虑在预准备语句中使用查询参数:
PreparedStatement stm = c.prepareStatement("UPDATE user_table SET name=? WHERE id=?"); stm.setString(1, "the name"); stm.setInt(2, 345); stm.executeUpdate();
可以做的另一件事是将所有查询保留在属性文件中.例如,在queries.properties文件中可以放置以上查询:
update_query=UPDATE user_table SET name=? WHERE id=?
然后借助一个简单的实用程序类:
public class Queries { private static final String propFileName = "queries.properties"; private static Properties props; public static Properties getQueries() throws SQLException { InputStream is = Queries.class.getResourceAsStream("/" + propFileName); if (is == null){ throw new SQLException("Unable to load property file: " + propFileName); } //singleton if(props == null){ props = new Properties(); try { props.load(is); } catch (IOException e) { throw new SQLException("Unable to load property file: " + propFileName + "\n" + e.getMessage()); } } return props; } public static String getQuery(String query) throws SQLException{ return getQueries().getProperty(query); } }
您可以使用以下查询:
PreparedStatement stm = c.prepareStatement(Queries.getQuery("update_query"));
这是一个相当简单的解决方案,但效果很好.
对于任意SQL,请使用jOOQ.jOOQ目前支持SELECT
,INSERT
,UPDATE
,DELETE
,TRUNCATE
,和MERGE
.您可以像这样创建SQL:
String sql1 = DSL.using(SQLDialect.MYSQL) .select(A, B, C) .from(MY_TABLE) .where(A.equal(5)) .and(B.greaterThan(8)) .getSQL(); String sql2 = DSL.using(SQLDialect.MYSQL) .insertInto(MY_TABLE) .values(A, 1) .values(B, 2) .getSQL(); String sql3 = DSL.using(SQLDialect.MYSQL) .update(MY_TABLE) .set(A, 1) .set(B, 2) .where(C.greaterThan(5)) .getSQL();
您也可以使用jOOQ执行它,而不是获取SQL字符串.看到
http://www.jooq.org
(免责声明:我为jOOQ背后的公司工作)
您应该考虑的一种技术是SQLJ - 一种直接在Java中嵌入SQL语句的方法.举个简单的例子,你可能在名为TestQueries.sqlj的文件中有以下内容:
public class TestQueries { public String getUsername(int id) { String username; #sql { select username into :username from users where pkey = :id }; return username; } }
还有一个额外的预编译步骤,它将您的.sqlj文件转换为纯Java - 简而言之,它会查找与之分隔的特殊块
#sql { ... }
并将它们转换为JDBC调用.使用SQLJ有几个主要好处:
完全抽象出JDBC层 - 程序员只需要考虑Java和SQL
可以使编译器在编译时针对数据库检查查询语法等
能够使用":"前缀直接绑定查询中的Java变量
大多数主要数据库供应商都有翻译器的实现,因此您应该能够轻松找到所需的一切.
我想知道你是不是喜欢Squiggle之类的东西.另外一些非常有用的东西是jDBI.但它对查询没有帮助.
我会看一下Spring JDBC.每当我需要以编程方式执行SQL时,我就会使用它.例:
int countOfActorsNamedJoe = jdbcTemplate.queryForInt("select count(0) from t_actors where first_name = ?", new Object[]{"Joe"});
它对于任何类型的sql执行都非常有用,特别是查询; 它可以帮助您将结果集映射到对象,而不会增加完整ORM的复杂性.
我倾向于使用Spring的命名JDBC参数,因此我可以编写一个标准字符串,例如"select*from blah where colX =':someValue'"; 我觉得这很可读.
另一种方法是在单独的.sql文件中提供字符串,并使用实用程序方法读取内容.
哦,也值得一看Squill:https://squill.dev.java.net/docs/tutorial.html