SpringBoot:如何读取 .sql文件的内容并执行

摘要:

在复杂查询、统计等应用场景,直接写 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

posted @ 2024-03-21 10:15  山顶听风  阅读(1499)  评论(0)    收藏  举报