Java 在编译单元内编写SQL文本

Java 在编译单元内编写SQL文本,java,sql,string,Java,Sql,String,我正在使用JdbcTemplate编写DAO对象 有时我会使用长字符串查询的格式(制表符、新行等),但我不知道在类中存储它的最佳方式是什么。现在我正在编写连接字符串,但这不是一个很好的解决方案,例如,我无法将其复制并粘贴到db管理器中。。。而且看起来不太好: public List queryTest() { String sql="SELECT '%c%' as Chapter,\r\n" + "(SELECT count(ticket.id) AS Matc

我正在使用JdbcTemplate编写DAO对象

有时我会使用长字符串查询的格式(制表符、新行等),但我不知道在类中存储它的最佳方式是什么。现在我正在编写连接字符串,但这不是一个很好的解决方案,例如,我无法将其复制并粘贴到db管理器中。。。而且看起来不太好:

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文本?

如注释中所述,您应该存储在属性XML文件中

XML优于普通属性文件的优点在于,您可以使用CDATA块正确地获取多行查询

例如:


但是,如果您使用Spring JDBC模板,您可能应该使用Spring工具(通过XML设置查询,或者将属性文件作为资源加载)。

我建议在数据库上创建视图,并使用简单的sql查询从视图中获取数据。

您可以尝试使用框架


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

将它们放在属性文件中如何?从文件中读取SQL。为什么不将它存储在其他位置,比如XML文件,然后从那里读取它?为什么
\r\n
?属性文件是纯文本文件。。。我真的不希望有人直接从文件系统更改它。我知道somecone可以对其进行反编译,但这比更改属性文件要困难一些。我知道,但我不想添加另一个框架,我正在退出hibernate噩梦,我真的更喜欢一个简单的xml而不是另一个框架。不是添加,而是替换。Spring模板也是一个框架。MyBatis没有魔力。您仍然可以编写简单的SQL。
<?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");
}