摘要:
在复杂查询、统计等应用场景,直接写 sql 并执行是一种高效的方法。此文记录工作中解决的将查询统计sql直接写在文件中,代码中读取相应的文件即可获得要执行的 sql。
要点:.sql 文件要放到 Resource 目录下,读取时路径要正确
一种正确的方式 和关键代码
这里提供的是一种尝试过的正确的方式,可能不是唯一的方式。
数据库读取方面使用的是JDBCTemplate
数据源配置
读取对应数据源
JDBCTemplate 的简单封装,查询结果转 JSONArray 或 JSONObject
点击查看代码
/**
* 查询
*
* @return JSONArray json数组
*/
@Override
public JSONArray getJSONArray(String sql, Object[] params) {
return getJSONArray(sql, params, false);
}
private JSONArray getJSONArray(String sql, Object[] params, final boolean toUpper) {
return jdbcTemplate.query(sql, params, new ResultSetExtractor<JSONArray>() {
@Override
public JSONArray extractData(ResultSet resultSet) throws SQLException, DataAccessException {
ResultSetMetaData rsd = resultSet.getMetaData();
int clength = rsd.getColumnCount();
JSONArray jsonArray = new JSONArray();
String columnName;
try {
while (resultSet.next()) {
JSONObject jo = new JSONObject();
for (int i = 0; i < clength; i++) {
columnName = rsd.getColumnLabel(i + 1);
columnName = toUpper ? columnName.toUpperCase() : columnName.toLowerCase();
jo.put(columnName, resultSet.getObject(i + 1));
}
jsonArray.add(jo);
}
} catch (Exception e) {
}
return jsonArray;
}
});
}
public JSONObject getJSONObject(String sql) {
return getJSONObject(sql, new Object[]{});
}
/**
* 说明:查询,返回的是Json对象
*
* @return JSONObject
*/
@Override
public JSONObject getJSONObject(String sql, Object[] params) {
return getJSONObject(sql, params, false);
}
private JSONObject getJSONObject(String sql, Object[] params, final boolean toUpper) {
return jdbcTemplate.query(sql, params, new ResultSetExtractor<JSONObject>() {
@Override
public JSONObject extractData(ResultSet resultSet) throws SQLException, DataAccessException {
ResultSetMetaData rsd = resultSet.getMetaData();
int clength = rsd.getColumnCount();
String columnName;
try {
if (resultSet.next()) {
JSONObject jo = new JSONObject();
for (int i = 0; i < clength; i++) {
columnName = rsd.getColumnLabel(i + 1);
columnName = toUpper ? columnName.toUpperCase() : columnName.toLowerCase();
jo.put(columnName, resultSet.getObject(i + 1));
}
return jo;
}
} catch (Exception e) {
}
return null;
}
});
}
具体使用
Service
BaseService,提供读 sql 文件的功能,供应用层 service 扩展
一个应用层 Service 的例子
.sql 文件位置
Controller层对应例子
参考资料:
springboot 如何读取 .sql文件的内容并执行
https://blog.csdn.net/qq_35387940/article/details/109719468
https://blog.csdn.net/hzbooks/article/details/121347339