对应表
DROP TABLE IF EXISTS `sensorc`;
CREATE TABLE `sensorc` (
`parentId` varchar(255) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`nodeModel` varchar(255) DEFAULT NULL,
`entityName` varchar(255) DEFAULT NULL,
`latitude` varchar(255) DEFAULT NULL,
`rows` varchar(15000) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`longitude` varchar(255) DEFAULT NULL,
`id` int(64) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SpringBoot整合JDBC
1.导入依赖:sql依赖 spring-starter-jdbc依赖
2.配置yaml中的数据源
3.创建sql语句,调用jdbc进行处理
/**
* Spring Boot 整合jdbc很简单
* 由于jdbc中已经配置对应的DataSource和JdbcTemplate
* 我们可以从以下几步进行测试
* 1.导入依赖:sql依赖 spring-starter-jdbc依赖
* 2.配置yaml中的数据源
* 3.创建sql语句,调用jdbc进行处理
*/
@RestController
@RequestMapping("/jdbc")
public class JdbcController {
/**
* Spring Boot 默认提供了数据源,默认提供了 org.springframework.jdbc.core.JdbcTemplate
* JdbcTemplate 中会自己注入数据源,用于简化 JDBC操作
* 还能避免一些常见的错误,使用起来也不用再自己来关闭数据库连接
*/
@Resource
private JdbcTemplate jdbcTemplate;
//查询employee表中所有数据
//List 中的1个 Map 对应数据库的 1行数据
//Map 中的 key 对应数据库的字段名,value 对应数据库的字段值
@GetMapping("/list")
public List<Map<String, Object>> userList(){
String sql = "select * from affairs.sensorc";
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
return maps;
}
//新增一个用户
@GetMapping("/add")
public String addUser(){
//插入语句,注意时间问题
String sql = "insert into affairs.sensorc(parentId)" +
" values ('24556')";
jdbcTemplate.execute(sql);
//查询
return "addOk";
}
}
如何使用SpringBoot进行定时任务
- 配置
@EnableScheduling
在@SpringBootApplication方法上 - 配置
@Scheduled(cron = "0 0 0 * * ? ")
到想要执行的方法
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(
}
}
@org.springframework.stereotype.Controller
public class Controller {
@Resource
private AbutService abutService;
@RequestMapping(value = "/init")
@Scheduled(cron = "0 0 0 * * ? ") //表示凌晨
public String main() throws Exception {
abutService.main();
return "Result.ok()";
}
}
public class MyTimerTask {
public static void main(String[] args) {
// 定义一个任务
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("打印当前时间:" + new Date());
}
};
// 计时器
Timer timer = new Timer();
// 开始执行任务 (延迟1000毫秒执行,每3000毫秒执行一次)
timer.schedule(timerTask, 1000, 3000);
}
}
@Resource和静态对象
- 由于一个静态方法中需要拿到Spring容器中的对象jdbcTemplate,jdbcTemplate被@Resource所修饰
- @Resource无法注入静态对象,这是因为
- 静态变量、类变量不是对象的属性,而是一个类的属性,所以静态方法是属于类(class)的,普通方法才是属于实体对象(也就是New出来的对象)的,spring注入是在容器中实例化对象,所以不能使用静态方法。
- 而使用静态变量、类变量扩大了静态方法的使用范围。静态方法在spring是不推荐使用的,依赖注入的主要目的,是让容器去产生一个对象的实例,然后在整个生命周期中使用他们,同时也让testing工作更加容易。
- 一旦你使用静态方法,就不需要去产生这个类的实例,这会让testing变得更加困难,同时你也不能为一个给定的类,依靠注入方式去产生多个取优不同的依赖环境的实例,这种static field是隐含共享的,并且是一种global全局状态,spring同样不推荐这样去做。
public static void getDeviceInfo (String id, List<String> errorList) throws Exception {
JSONObject object = new JSONObject();
String parentId = String.valueOf(js2.getString("parentId"));
String latlng = "";
String latitude = "";
String longitude = "";
String address = "";
Sensor sensor = new Sensor();
try{
address = parent.getString("address");
latlng = parent.getString("latlng");
String[] split = latlng.split(",");
latitude = split[0];
longitude = split[1];
object.put("latitude", split[0]);
object.put("longitude", split[1]);
object.put("address", address);
}catch (Exception e){
System.out.println("Exception" + e);
}
sensor = new Sensor(parentId, address, entityName, latitude, longitude, );
System.out.println(sensor.toString());
String sql = "insert into affairs.sensorc(parentId,address,entityName,latitude," +
"longitude, rows, nodeModel, status) " +
"values (?,?,?,?,?,?,?,?)";
Object[] objects = new Object[]{
sensor.getParentId(),
};
/**
* jdbcTemplate空指针异常分析
* 用@Autowired报错,@Resource不报错的原因
* 提示:无法自动装配。找不到类型为 'JdbcTemplate' 的 bean。
* @Autowired是Spring提供的
* @Resource是官方提供的
*
* 当一个类启动的时候,它的初始化流程是
* 静态变量或静态语句块 –> 实例变量或初始化语句块 –> 构造方法 -> Autowired,
* 所以当在一个类的构造方法/静态方法中使用注入的对象的某一个方法的时候,
* 就会报一个NullPointerException的错误。
*/
abutService.jdbcTemplate.update(sql, objects);
device.put(id, object);
}
/**
* 智能处理
*/
@Service
public class AbutService {
@Resource
private JdbcTemplate jdbcTemplate;
/***
* Spring中静态方法中使用@Resource注解的变量
* 如果@Resource修饰的对象是一个静态对象是无法运行的
* 在静态方法中,通过维护一个本类的静态变量abutService,通过@PostConstruct提前创建,可以通过abutService直接调jdbcTemplate
* */
// 维护一个本类的静态变量
private static AbutService abutService = new AbutService();
// 初始化的时候,将本类中的jdbcTemplate赋值给静态的本类变量
/**
* @PostConstruct该注解被用来修饰一个非静态的void()方法。
* 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,
* 并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
* 执行顺序:Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
*/
@PostConstruct
public void init() {
/***
* this指针
* this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,
* 也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。
* */
abutService.jdbcTemplate = jdbcTemplate;
}
Controller 注解
/***
** @Controller 表示Spring某个类的是否可以接收HTTP请求
* @Controller类中的方法可以直接通过返回String跳转到jsp、ftl、html等模版页面。
* @RestController表示Spring某个类的是否可以接收HTTP请求,等价于@Controller和@ResponseBody
* 在方法上加@ResponseBody注解,也可以返回实体对象。@RestController类中的所有方法只能返回String、Object、Json等实体对象,不能跳转到模版页面。
* @RestControllerAdvice 等价于@ControllerAdvice注解和@ResponseBody
* @ControllerAdvice主要用来处理全局异常处理/添加全局数据,一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用。
**/