首页  编辑  

SpringBoot静态变量如何Autowired和SQL工具类

Tags: /Java/   Date Created:
在SpringBoot开发当中, 我们经常需要写一些工具类,例如SQLHelper类,这些类可能需要使用一些今天变量或者非静态变量,但工具类方法为静态方法,此时直接使用 类的静态方法,会因为 @Autowired 无法注入导致 null 指针错误。这里介绍一种通过构造函数来自动注入静态变量的方法。
SQL工具类,可以使用 Connection.createStatement().executeQuery("sql 语句")来实现。参考: 简单SQLHelper(java) - 新手之小龙 - 博客园 (cnblogs.com)
对于SpringBoot,可以用 jdbcTemplate来实现,例如:
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * SQL Helper
 */
@Component
@Slf4j
public class SqlHelper {
    public static JdbcTemplate jdbcTemplate;

    @Autowired
    public SqlHelper(JdbcTemplate jdbcTemplate) {
        SqlHelper.jdbcTemplate = jdbcTemplate;
    }

    /**
     * Query for first column of first record
     *
     * @param sql SQL statement
     * @return first column integer of first record
     */
    public static Integer queryForInt(String sql) {
        Map<String, Object> map = jdbcTemplate.queryForMap(sql);
        if (map.isEmpty()) {
            return null;
        } else {
            Object obj = map.values().iterator().next();
            if (obj == null) {
                return null;
            }
            return Integer.parseInt(obj.toString());
        }
    }

    public static String version() {
        return queryForString("select version()");
    }

    /**
     * Query for single record with single field
     *
     * @param sql SQL statement
     * @return first column value of first record
     */
    public static String queryForString(String sql) {
        Map<String, Object> map = jdbcTemplate.queryForMap(sql);
        if (map.isEmpty()) {
            return null;
        } else {
            Object obj = map.values().iterator().next();
            if (obj == null) {
                return null;
            }
            return obj.toString();
        }
    }

    /**
     * Run SQL and return List Object
     * <p>
     * Usage:
     * <pre>{@code
     *         RowMapper<Result> mapper = new BeanPropertyRowMapper<>(Result.class);
     *         List<Result> ret = SqlHelper.query("select * from ete_result", mapper);
     * }</pre>
     *
     * @param sql       SQL statement
     * @param rowMapper RowMapper
     * @param <T>       Type
     * @return List Object Of T
     */
    public static <T> List<T> query(String sql, RowMapper<T> rowMapper) {
        return jdbcTemplate.query(sql, rowMapper);
    }
}
使用时,按普通的方法调用即可,无需初始化工具类:
SqlHelper.queryForInt("select count(*) from table");