前言
由于这次Arduino实验需要spring boot框架,所以记录一下项目搭建过程
一、Spring boot是什么?
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署等。使用Spring Boot可以做到专注于Spring应用的开发,而无需过多关注XML的配置。Spring Boot使用“习惯优于配置”的理念,简单来说,它提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题。使用Spring Boot可以不用或者只需要很少的Spring配置就可以让企业项目快速运行起来。
Spring Boot是开发者和Spring 本身框架的中间层,帮助开发者统筹管理应用的配置,提供基于实际开发中常见配置的默认处理(即习惯优于配置),简化应用的开发,简化应用的运维;总的来说,其目的Spring Boot就是为了对Java web 的开发进行“简化”和加“快”速度,简化开发过程中引入或启动相关Spring 功能的配置。这样带来的好处就是降低开发人员对于框架的关注点,可以把更多的精力放在自己的业务代码上。
同时随着微服务概念的推广和实践,Spring Boot的精简理念又使其成为Java微服务开发的不二之选,也可以说,Spring Boot其实就是为了微服务而生的Java web框架。
先如今,Spring Boot已经在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
二、使用步骤
1.打开IDEA,新建项目
选择Spring boot,注意换成阿里云的源(https://start.aliyun.com/)选择maven类型,注意JDK,最好选择JDK17,老版本的一些依赖不支持
如果是要下载JDK,可以在file的project structure里面下载JDK选项点+然后下载
下载完了之后继续上面步骤点next,注意选低版本的框架,然后添加web还有数据库的一下依赖,系统可以自己导入
然后点产生,系统就新建好了
注意:可以采用系统的Maven,但是它是国外的,速度慢,可以设置setting.xml换成国内源,先找到路径
打开系统路径(里面是没有这个xml的),新建xml
将下面代码直接复制进去
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<usePluginRegistry/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>central repo</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>apache snapshots</mirrorOf>
<name>阿里云阿帕奇仓库</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
</mirrors>
<proxies/>
<activeProfiles/>
<profiles>
<profile>
<repositories>
<repository>
<id>aliyunmaven</id>
<name>aliyunmaven</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>MavenCentral</id>
<url>http://repo1.maven.org/maven2/</url>
</repository>
<repository>
<id>aliyunmavenApache</id>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</repository>
</repositories>
</profile>
</profiles>
</settings>
2.配置mybatis
打开application.properties,配置数据库即可:
新建映射xml
将下面代码直接复制进去
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- Globally enables or disables any caches configured in any mapper under this configuration -->
<setting name="cacheEnabled" value="true"/>
<!-- Sets the number of seconds the driver will wait for a response from the database -->
<setting name="defaultStatementTimeout" value="3000"/>
<!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- Allows JDBC support for generated keys. A compatible driver is required.
This setting forces generated keys to be used if set to true,
as some drivers deny compatibility but still work -->
<setting name="useGeneratedKeys" value="true"/>
</settings>
<!-- Continue going here -->
</configuration>
新建Bean类,注意和数据库里面的名字要一模一样(不然有些数据操作会出现NULL的现象),生成get/set方法
package com.example.demo.mybatis.entry;
import java.sql.Timestamp;
import java.time.LocalDateTime;
public class SensorBean {
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Timestamp getDate() {
return timestamp;
}
public void setDate(Timestamp date) {
this.timestamp = date;
}
public double getTemperature() {
return temperature;
}
public void setTemperature(double temperature) {
this.temperature = temperature;
}
public double getHumidity() {
return humidity;
}
public void setHumidity(double humidity) {
this.humidity = humidity;
}
public Timestamp getTimestamp() {
return timestamp;
}
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
private int id;
private Timestamp timestamp;
private double temperature;
private double humidity;
@Override
public String toString() {
return "SensorBean{" +
"id=" + id +
", date=" + timestamp +
", temperature=" + temperature +
", humidity=" + humidity +
'}';
}
}
写一个DAO类用来实现数据库操作的接口,用注解的方式实现数据库的操作(正规还是要用xml映射方法,但是这种比较简单好理解)
package com.example.demo.mybatis.dao;
import com.example.demo.mybatis.entry.SensorBean;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface SensorDao {
@Select("select * from sensordata")
List<SensorBean> getAllSensorData(); // 返回所有传感器数据
@Insert("insert into sensordata(id,temperature,humidity,timestamp) values (#{id}, #{temperature}, #{humidity}, #{date})")
void insertUser(SensorBean sensor);
}
写一个service层代码用来实现功能,例如将查询到结果存入链表里
package com.example.demo.mybatis.controller;
import com.example.demo.mybatis.dao.SensorDao;
import com.example.demo.mybatis.entry.SensorBean;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Service;
import java.util.LinkedList;
import java.util.List;
@Service
public class SensorServiceImpl {
private final SqlSessionFactory sqlSessionFactory;
public SensorServiceImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public LinkedList<SensorBean> fetchAndStoreSensorData() {
try (SqlSession session = sqlSessionFactory.openSession()) {
SensorDao sensorDao = session.getMapper(SensorDao.class);
List<SensorBean> sensorDataList = sensorDao.getAllSensorData(); // 获取所有数据
// 将查询结果转换为LinkedList(如果有必要的话,通常List已经足够使用)
LinkedList<SensorBean> sensorDataLinkedList = new LinkedList<>(sensorDataList);
return sensorDataLinkedList;
}
}
}
接下来写一个控制层程序用来实现功能,例如用来实现查询数据和插入数据
package com.example.demo.mybatis.controller;
import com.example.demo.mybatis.dao.SensorDao;
import com.example.demo.mybatis.entry.SensorBean;
import com.example.demo.mybatis.entry.UserBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Controller
@RequestMapping(value = "/sensorbean")
public class SensorController {
private final SensorServiceImpl sensorService;
private final SensorDao sensorDao;
@Autowired
public SensorController(SensorServiceImpl sensorService, SensorDao sensorDao) {
this.sensorService = sensorService;
this.sensorDao = sensorDao;
}
@GetMapping("/getData")
public ResponseEntity<List<SensorBean>> getData() {
List<SensorBean> sensorBeans = sensorService.fetchAndStoreSensorData();
return ResponseEntity.ok(sensorBeans);
}
public Response<List<SensorBean>> getAllSensorData() {
List <SensorBean> sensorList =sensorDao.getAllSensorData();
return Response.newSuccess(sensorList);
}
@PostMapping("/data")
@ResponseBody
public String receiveData(@RequestBody Map<String, Double> payload) {
double humidity = payload.get("humidity");
double temperature = payload.get("temperature");
SensorBean sensor = new SensorBean();
//user.setId(UUID.randomUUID().toString()); // 生成唯一ID
sensor.setTemperature(temperature);
sensor.setHumidity(humidity);
// 获取当前日期和时间
LocalDateTime currentDateTime = LocalDateTime.now();
// 将日期和时间格式化为只到秒的精度
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = currentDateTime.format(formatter);
// 将格式化后的日期和时间转换为 LocalDateTime(因为 Timestamp.valueOf 需要 LocalDateTime)
LocalDateTime truncatedDateTime = LocalDateTime.parse(formattedDateTime, formatter);
// 将 LocalDateTime 转换为 Timestamp
Timestamp timestamp = Timestamp.valueOf(truncatedDateTime);
// 设置给 sensor 对象
sensor.setDate(timestamp);
sensorDao.insertUser(sensor);
// 构建响应消息
String responseMessage = String.format("Received data - temperature: %s, humidity: %s,time:%s", temperature, humidity,timestamp);
//SensorBean userBean = sensorDao.getUserById();
// 返回包含接收到的数据的响应
return responseMessage;
}
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<String> handleHttpMessageNotReadable(HttpMessageNotReadableException e) {
// 记录日志或其他处理
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid request body");
}
}
到这里差不多就配置完成了,运行项目(里面包含main的文件右击运行)
注意:不能直接运行HTML文件,端口会错误,一定要手动输入地址,还有看代码里面的API接口地址是什么,例如现在查看数据库里面的数据
数据库配置成功,现在可以开始你的项目
总结
以上就是简单的配置过程,本文仅仅简单介绍了项目框架配置,而如果是大型项目可能不适用。