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;
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操作* 还能避免一些常见的错误,使用起来也不用再自己来关闭数据库连接*/@Resourceprivate JdbcTemplate jdbcTemplate;//查询employee表中所有数据//List 中的1个 Map 对应数据库的 1行数据//Map 中的 key 对应数据库的字段名,value 对应数据库的字段值@GetMapping("/list")public List
@EnableScheduling在@SpringBootApplication方法上@Scheduled(cron = "0 0 0 * * ? ")到想要执行的方法@EnableScheduling
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
@org.springframework.stereotype.Controller
public class Controller {@Resourceprivate 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() {@Overridepublic void run() {System.out.println("打印当前时间:" + new Date());}};// 计时器Timer timer = new Timer();// 开始执行任务 (延迟1000毫秒执行,每3000毫秒执行一次)timer.schedule(timerTask, 1000, 3000);}
}
public static void getDeviceInfo (String id, List errorList) throws Exception {JSONObject js1 = getEntityInfo(id);if (js1 == null) {errorList.add(id);return;}String status = js1.getString("status");String nodeModel = js1.getString("nodeModel");JSONObject js2 = getOperSensorListByEntityId(id);if (js2 == null) {errorList.add(id);return;}JSONArray rows = js2.getJSONArray("rows");StringBuilder sb = new StringBuilder();for (int j = 0 ; j < rows.size() ; j++) {JSONObject object = rows.getJSONObject(j);sb.append(object.getString("sensorName")).append(":").append(object.getString("value"));if (object.get("unitName") != null) {sb.append(object.getString("unitName"));}sb.append(";");}JSONObject object = new JSONObject();String parentId = String.valueOf(js2.getString("parentId"));object.put("parentId",js2.getString("parentId"));String entityName = js2.getString("entityName");object.put("entityName",entityName);object.put("rows",sb);object.put("status",status);object.put("nodeModel",nodeModel);JSONObject parent = org.get(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, nodeModel, JSONArray.toJSONString(rows), status);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(),sensor.getAddress(),sensor.getEntityName(),sensor.getLatitude(),sensor.getLongitude(),sensor.getRows(),sensor.getNodeModel(),sensor.getStatus()};
/*** jdbcTemplate空指针异常分析* 用@Autowired报错,@Resource不报错的原因* 提示:无法自动装配。找不到类型为 'JdbcTemplate' 的 bean。* @Autowired是Spring提供的* @Resource是官方提供的** 当一个类启动的时候,它的初始化流程是* 静态变量或静态语句块 –> 实例变量或初始化语句块 –> 构造方法 -> Autowired,* 所以当在一个类的构造方法/静态方法中使用注入的对象的某一个方法的时候,* 就会报一个NullPointerException的错误。*/abutService.jdbcTemplate.update(sql, objects);device.put(id, object);}
/*** 智能处理*/
@Service
public class AbutService {@Resourceprivate 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(注释的方法)*/@PostConstructpublic void init() {/**** this指针* this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,* 也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。* */abutService.jdbcTemplate = jdbcTemplate;}
/***
** @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使用。
**/