简单说下MongoDB 他是非关系型数据库NoSQL 特点就是便于储存:数据结构不规则或不完整,没有任何预定义的数据 不需要我们每次存储都建库建字段,对于业务逻辑不多的数据简直不要太爽。
缺点:就是不支持连表查询,复杂的查询也不支持,网上资料比较少
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
yml配置
spring:
data:
mongodb:
uri: mongodb://root:root@localhost:27017/test
简单说下连接格式:
mongodb:// [username:password@] host:[port] [/[database]]
mongodb:// 固定格式
username:password@ 可选项
host 必须填
port可选的指定端口,如果不填,默认为27017
/database 可选 如果指定username:password@,连接并验证登录指定数据库。若不指定,默认打开 test 数据库。
其实可以简化为
mongodb://localhost
创建实体类
package me.hekr.iotos.softgateway.subsystem.dto;
import com.fasterxml.jackson.annotation.JsonAlias;
import java.util.Date;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.format.annotation.DateTimeFormat;
/**
* @Author: yipeng.liu
* @Date: 2022/2/24 16:14
* @Description: AlarmDTO 告警信息
*/
@Data
@Document(collection = "alarm")
public class AlarmDTO {
@Id
private String id;
private String eventDesc;
private String eventType;
private String eventSecurity;
private String activeName;
private int alarmStatus;
private String deviceCode;
private String securityColor;
private String securityName;
private String deviceName;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date eventTime;
}
创建接口继承MongoRepository接口实现对数据库的操作 这只是已经集成好的功能
我们还可以继承MongoTemplate以完成更为复杂的查询 如聚合查询等 这个我下边会记录一下MongoDB聚合查询
Repository接口
这里会用到SpringFramework Data包提供的Page类 会储存数据分页信息
package me.hekr.iotos.softgateway.subsystem.repository;
import java.util.Date;
import me.hekr.iotos.softgateway.subsystem.dto.AlarmDTO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
/** @Author: yipeng.liu @Date: 2022/2/24 16:14 @Description: AlramRepository 报警数据库操作类 */
public interface AlarmRepository extends MongoRepository<AlarmDTO, String>{
/** 分页查询报警信息 */
Page<AlarmDTO> findByDeviceCodeLike(String deviceCode, Pageable pageable);
/** 根据设备ID查询告警信息 */
AlarmDTO findByDeviceCode(String deviceCode);
}
创建Service进行逻辑操作
package me.hekr.iotos.softgateway.subsystem.service;
import java.util.Date;
import lombok.extern.log4j.Log4j2;
import me.hekr.iotos.softgateway.subsystem.dto.AlarmDTO;
import me.hekr.iotos.softgateway.subsystem.repository.AlarmRepository;
import me.hekr.iotos.softgateway.subsystem.util.Pagec;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
/** @Author: yipeng.liu @Date: 2022/2/24 16:51 @Description: AlarmService 告警服务 */
@Log4j2
@Service
public class AlarmService {
@Autowired private AlarmRepository alarmRepository;
/** 插入/修改数据 */
public AlarmDTO save(AlarmDTO alarmDTO) {
return alarmRepository.save(alarmDTO);
}
/** 分页查询告警信息 */
public Pagec<AlarmDTO> pagingQuery(
String deviceCode, String eventType, Date startTime, Date endTime, Pageable pageable) {
return Pagec.transFrom(
alarmRepository.findByDeviceCodeLike(deviceCode,pageable));
}
}
创建Controller 进行接口调试
package me.hekr.iotos.softgateway.subsystem.controller;
import java.util.Date;
import me.hekr.iotos.softgateway.core.config.DeviceRemoteConfig;
import me.hekr.iotos.softgateway.subsystem.dto.*;
import me.hekr.iotos.softgateway.subsystem.service.AlarmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.*;
/** @Author: yipeng.liu @Date: 2021/11/3 10:54 @Description: AlarmController */
@RestController
public class AlarmController {
@GetMapping("/alarmList")
public WebResp findAlarm(
@RequestParam(defaultValue = "") String deviceCode,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
return WebResp.success(alarmService.pagingQuery(deviceCode, PageRequest.of(page, size)));
}
}
WebResp.class
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WebResp<T> {
private Object code;
private String message;
private T data;
public static <T> WebResp<T> success(T data) {
return new WebResp<>(0, "success", data);
}
public static <T> WebResp<T> error(Object code, String message) {
return new WebResp<>(code, message, null);
}
}
Pagec.class
import java.util.Collections;
import java.util.List;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
/** @Author: yipeng.liu @Date: 2022/2/24 17:11 @Description: Pagec */
@Data
public class Pagec<T> {
private long totalElements;
private int page;
private int size;
private List<T> content;
public static <T> Pagec<T> transFrom(Page<T> page) {
Pagec<T> pagec = new Pagec();
pagec.setContent(page.getContent());
pagec.setPage(page.getPageable().getPageNumber());
pagec.setSize(page.getPageable().getPageSize());
pagec.setTotalElements(page.getTotalElements());
return pagec;
}
}
数据库数据
!
接口查询示例!