在SpringBoot开发当中, 我们经常需要写一些工具类,例如SQLHelper类,这些类可能需要使用一些今天变量或者非静态变量,但工具类方法为静态方法,此时直接使用 类的静态方法,会因为 @Autowired 无法注入导致 null 指针错误。这里介绍一种通过构造函数来自动注入静态变量的方法。
对于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;
@Component
@Slf4j
public class SqlHelper {
    public static JdbcTemplate jdbcTemplate;
    @Autowired
    public SqlHelper(JdbcTemplate jdbcTemplate) {
        SqlHelper.jdbcTemplate = jdbcTemplate;
    }
    
    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()");
    }
    
    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();
        }
    }
    
    public static <T> List<T> query(String sql, RowMapper<T> rowMapper) {
        return jdbcTemplate.query(sql, rowMapper);
    }
}
使用时,按普通的方法调用即可,无需初始化工具类:
SqlHelper.queryForInt("select count(*) from table");