今日实际项目:传感器信息入库操作 SpringBoot整合JDBC

文章介绍了如何在SpringBoot中整合JDBC进行数据库操作,包括导入依赖、配置数据源及使用JdbcTemplate进行查询和插入操作。此外,还讲解了如何设置定时任务,通过@Scheduled注解实现定时执行的方法。同时,讨论了@Resource注解无法注入静态对象的问题以及Controller注解的使用场景。
摘要由CSDN通过智能技术生成

对应表

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进行定时任务

  1. 配置@EnableScheduling在@SpringBootApplication方法上
  2. 配置 @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使用。
**/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值