今日实际项目:传感器信息入库操作 SpringBoot整合JDBC
创始人
2025-05-28 15:12:30

这里写目录标题

  • 对应表
  • SpringBoot整合JDBC
  • 如何使用SpringBoot进行定时任务
  • @Resource和静态对象
  • Controller 注解

对应表

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操作* 还能避免一些常见的错误,使用起来也不用再自己来关闭数据库连接*/@Resourceprivate JdbcTemplate jdbcTemplate;//查询employee表中所有数据//List 中的1个 Map 对应数据库的 1行数据//Map 中的 key 对应数据库的字段名,value 对应数据库的字段值@GetMapping("/list")public List> userList(){String sql = "select * from affairs.sensorc";List> 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进行定时任务

  1. 配置@EnableScheduling在@SpringBootApplication方法上
  2. 配置 @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);}
}

@Resource和静态对象

  • 由于一个静态方法中需要拿到Spring容器中的对象jdbcTemplate,jdbcTemplate被@Resource所修饰
  • @Resource无法注入静态对象,这是因为
  • 静态变量、类变量不是对象的属性,而是一个类的属性,所以静态方法是属于类(class)的,普通方法才是属于实体对象(也就是New出来的对象)的,spring注入是在容器中实例化对象,所以不能使用静态方法。
  • 而使用静态变量、类变量扩大了静态方法的使用范围。静态方法在spring是不推荐使用的,依赖注入的主要目的,是让容器去产生一个对象的实例,然后在整个生命周期中使用他们,同时也让testing工作更加容易。
  • 一旦你使用静态方法,就不需要去产生这个类的实例,这会让testing变得更加困难,同时你也不能为一个给定的类,依靠注入方式去产生多个取优不同的依赖环境的实例,这种static field是隐含共享的,并且是一种global全局状态,spring同样不推荐这样去做。
   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 注解

/***
** @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使用。
**/

相关内容

热门资讯

四川射洪:让绿色福祉惠及城乡百... (来源:中国环境网)转自:中国环境网12月25日,四川省遂宁市射洪市成功获评国家级生态文明建设示范区...
日本广岛市长称日政府应坚持“无... 转自:央视网  日本广岛市市长松井一实26日表示,“日本政府应明确,不会受到个人观点左右并将坚持‘无...
阿努廷:泰柬今天或签停火声明 本报驻柬埔寨特约记者 董开映 本报特约记者 任 重据柬埔寨《新鲜新闻》26日报道,柬泰边界事务联合委...
日本群马县多车相撞致1人死26... 转自:新华社新华社东京12月27日电 (记者 陈泽安 李子越)据日本广播协会27日报道,日本群马县...
员工因岗位被AI替代遭解雇,公... 岗位被AI替代了,员工就能因此被解雇吗?12月26日,北京市人力资源和社会保障局发布2025年度劳动...