当前位置:  开发笔记 > 编程语言 > 正文

在Java中构建SQL字符串的最简洁方法

如何解决《在Java中构建SQL字符串的最简洁方法》经验,为你挑选了6个好方法。

我想构建一个SQL字符串来进行数据库操作(更新,删除,插入,选择,那种东西) - 而不是使用数以百万计的"+"和引号的糟糕的字符串连接方法,这些方法最好是不可读的 - 那里必须是一个更好的方法.

我确实想过使用MessageFormat - 但它应该用于用户消息,虽然我认为它会做一个合理的工作 - 但我想在Java sql库中应该有一些更符合SQL类型操作的东西.

Groovy会有什么好处吗?



1> Piotr Kochań..:

首先考虑在预准备语句中使用查询参数:

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"));

这是一个相当简单的解决方案,但效果很好.



2> Lukas Eder..:

对于任意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背后的公司工作)


这是一个昂贵的解决方

3> Ashley Merce..:

您应该考虑的一种技术是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变量

大多数主要数据库供应商都有翻译器的实现,因此您应该能够轻松找到所需的一切.



4> tcurdt..:

我想知道你是不是喜欢Squiggle之类的东西.另外一些非常有用的东西是jDBI.但它对查询没有帮助.



5> Bent André S..:

我会看一下Spring JDBC.每当我需要以编程方式执行SQL时,我就会使用它.例:

int countOfActorsNamedJoe
    = jdbcTemplate.queryForInt("select count(0) from t_actors where first_name = ?", new Object[]{"Joe"});

它对于任何类型的sql执行都非常有用,特别是查询; 它可以帮助您将结果集映射到对象,而不会增加完整ORM的复杂性.



6> GaryF..:

我倾向于使用Spring的命名JDBC参数,因此我可以编写一个标准字符串,例如"select*from blah where colX =':someValue'"; 我觉得这很可读.

另一种方法是在单独的.sql文件中提供字符串,并使用实用程序方法读取内容.

哦,也值得一看Squill:https://squill.dev.java.net/docs/tutorial.html

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有