我正在使用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文本?
答案 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。