在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");