在编译单元中编写SQL文本

时间:2014-07-18 07:49:10

标签: java sql string

我正在使用JdbcTemplate编写DAO对象。

有时我会使用格式(标签,新行等)进行长字符串查询,但我不知道在课程中存储它的最佳方法是什么。现在我正在编写串联字符串,但它不是一个非常好的解决方案,例如我无法将其复制并粘贴到数据库管理器中...它看起来不是很好:

public List queryTest() {
    String sql="SELECT '%c%' as Chapter,\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%' AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status IN ('new','assigned') ) AS 'New',\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%' AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status='document_interface' ) AS 'Document\\\r\n" + 
            " Interface',\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%' AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status='interface_development' ) AS 'Inter\\\r\n" + 
            "face Development',\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%' AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status='interface_check' ) AS 'Interface C\\\r\n" + 
            "heck',\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%' AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status='document_routine' ) AS 'Document R\\\r\n" + 
            "outine',\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%' AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status='full_development' ) AS 'Full Devel\\\r\n" + 
            "opment',\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%' AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status='peer_review_1' ) AS 'Peer Review O\\\r\n" + 
            "ne',\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%'AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status='peer_review_2' ) AS 'Peer Review Tw\\\r\n" + 
            "o',\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%' AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status='qa' ) AS 'QA',\r\n" + 
            "(SELECT count(ticket.id) AS Matches FROM engine.ticket INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%'AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine' AND ticket.status='closed' ) AS 'Closed',\r\n" + 
            "count(id) AS Total,\r\n" + 
            "ticket.id AS _id\r\n" + 
            "FROM engine.ticket\r\n" + 
            "INNER JOIN engine.ticket_custom ON ticket.id = ticket_custom.ticket\r\n" + 
            "WHERE ticket_custom.name='chapter' AND ticket_custom.value LIKE '%c%' AND type='New material' AND milestone='1.1.12' AND component NOT LIKE 'internal_engine'";
    return getJdbcTemplate().query(sql,rmapper);
}

如何在类中存储sql文本?

3 个答案:

答案 0 :(得分:0)

如评论中所述,您应该存储在属性XML文件中。

XML over plain属性文件的优点是您可以使用CDATA块正确地获取多行查询。

例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties version="1.0">
  <entry key="query"><![CDATA[
...
]]></entry>
</properties>

然后,在你的代码中:

try (InputStream is = MyClass.class.getResourceAsStream("queries.xml")) {
  Properties properties = new Properties();
  properties.loadFromXML(is);
  this.query = Objects.requireNonNull(properties.get("query"), "queries.xml#query");
}

但是,如果使用Spring JDBC Template,则应该使用Spring工具(通过将属性文件作为资源加载,通过XML设置查询)。

答案 1 :(得分:0)

我建议在数据库上创建VIEW并使用简单的SQL查询从VIEW获取数据

答案 2 :(得分:0)

您可以尝试使用MyBatis框架。

它是JDBC的包装器,提供了很好的SQL模板引擎。它通常将SQL模板存储在XML文件中。 Spring JdbcTemplete的良好替代品。 IDE也支持它。我在几个项目中用MyBatis取代了Spring JdbcTemplate。