一.项目搭建
1.pom.xml 引入
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bannad927</groupId>
<artifactId>es</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>es</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
</project>
2.yml配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/xxx?serverTimezone=Asia/Shanghai&useUnicode=true&useAffectedRows=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
hikari:
maximum-pool-size: 20
minimum-idle: 5
devtools:
livereload:
enabled: true
restart:
additional-paths: static/**
jackson:
date-format: yyyy-MM-dd HH:mm:ss
elasticsearch:
rest:
uris: "http://192.168.33.88:9200"
server:
port: 3333
3.logback-spring.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="true">
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 这是是logstash服务器地址 端口-->
<destination>192.168.33.88:7788</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<providers>
<timestamp/>
<version/>
<message/>
<loggerName/>
<threadName/>
<logLevel/>
<callerData/>
</providers>
</encoder>
</appender>
<!--设置上下文名称:默认为"default" 会出现在控制台上-->
<contextName>es</contextName>
<!--输出到文件的路径-->
<property name="log.path" value="logs" />
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 过滤器设置输出的级别 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<!--日志输出编码格式化-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器设置输出的级别 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径/文件夹名称-->
<fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<!--%d{HH: mm:ss.SSS}——日志输出时间
%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
%-5level——日志级别,并且使用5个字符靠左对齐
%logger{36}——日志输出者的名字
%msg——日志消息
%n——平台的换行符
-->
<!--日志输出编码格式化-->
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--指定最基础的日志输出级别-->
<root level="INFO">
<!--appender将会添加到这个loger-->
<appender-ref ref="console" />
<appender-ref ref="stash"/>
<appender-ref ref="file" />
</root>
</configuration>
二.mybatis-plus
4.MybatisPlusConfig配置
@Configuration
@EnableTransactionManagement
@MapperScan("com.bannad927.es.mapper")
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
//你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制
paginationInterceptor.setLimit(-1);
return paginationInterceptor;
}
}
5.AreaDetailMapper.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bannad927.es.mapper.AreaDetailMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.bannad927.es.entity.AreaDetail">
<id column="id" property="id"/>
<result column="contract_id" property="contractId"/>
<result column="area_code" property="areaCode"/>
<result column="floor" property="floor"/>
<result column="room_num" property="roomNum"/>
<result column="human_num" property="humanNum"/>
<result column="construction_batch_code" property="constructionBatchCode"/>
<result column="install_batch_code" property="installBatchCode"/>
<result column="construction_cost" property="constructionCost"/>
<result column="is_private" property="isPrivate"/>
<result column="is_extra" property="isExtra"/>
<result column="state" property="state"/>
<result column="device_id" property="deviceId"/>
<result column="operator" property="operator"/>
<result column="is_del" property="isDel"/>
<result column="update_time" property="updateTime"/>
<result column="create_time" property="createTime"/>
<result column="washer_id" property="washerId"/>
<result column="log_id" property="logId"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, contract_id, area_code, floor, room_num, human_num, construction_batch_code, install_batch_code, construction_cost, is_private, is_extra, state, device_id, operator, is_del, update_time, create_time, washer_id, log_id
</sql>
<select id="findByDeviceId" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM t_area_detail
WHERE is_del = 0 AND device_id = #{deviceId}
</select>
</mapper>
6.AreaDetailMapper
@Mapper
public interface AreaDetailMapper extends BaseMapper<AreaDetail> {
/**
* 根据设备id查询数据
*
* @param deviceId
* @return
*/
AreaDetail findByDeviceId(@Param("deviceId") Integer deviceId);
}
7.AreaDetailService
public interface AreaDetailService extends IService<AreaDetail> {
Result insert(AreaDetail areaDetail);
Result update(AreaDetail areaDetail);
Result delete(Integer id);
Result findById(Integer id);
Result findByAll();
}
8.AreaDetailServiceImpl
@Service
public class AreaDetailServiceImpl extends ServiceImpl<AreaDetailMapper, AreaDetail> implements AreaDetailService {
@Autowired
AreaDetailMapper areaDetailMapper;
@Override
public Result insert(AreaDetail areaDetail) {
return Result.getSuccessResult(areaDetailMapper.insert(areaDetail));
}
@Override
public Result update(AreaDetail areaDetail) {
return Result.getSuccessResult(areaDetailMapper.updateById(areaDetail));
}
@Override
public Result delete(Integer id) {
return Result.getSuccessResult(areaDetailMapper.deleteById(id));
}
@Override
public Result findById(Integer id) {
return Result.getSuccessResult(areaDetailMapper.selectById(id));
}
@Override
public Result findByAll() {
StopWatch watch = new StopWatch();
watch.start();
QueryWrapper<AreaDetail> queryWrapper = new QueryWrapper<>();
Iterable<AreaDetail> all = areaDetailMapper.selectList(queryWrapper);
watch.stop();
long millis = watch.getTotalTimeMillis();
return Result.getSuccessResult(all, String.valueOf(millis));
}
}
@RestController
@RequestMapping("/areaDetail")
public class AreaDetailControllern {
@Autowired
private AreaDetailService areaDetailService;
@RequestMapping("/insert")
public Result insert(@RequestBody AreaDetail areaDetail) {
return areaDetailService.insert(areaDetail);
}
@RequestMapping("/update")
public Result update(@RequestBody AreaDetail areaDetail) {
return areaDetailService.update(areaDetail);
}
@RequestMapping("/delete")
public Result delete(@RequestParam("id") Integer id) {
return areaDetailService.delete(id);
}
@RequestMapping("/findById")
public Result findById(@RequestParam("id") Integer id) {
return areaDetailService.findById(id);
}
@RequestMapping("/findByAll")
public Result findByAll() {
return areaDetailService.findByAll();
}
}
10.校验数据
三.elasticsearch
先配置同步 https://www.chengbinbin.cn//archives/logstashmysql
1.EsAreaDetail实体类
@Data
@Document(indexName = "t_area_detail", type = "_doc", useServerConfiguration = true, createIndex = false)
public class EsAreaDetail implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 流水号
*/
@Id()
private Integer id;
/**
* 合同ID
*/
@Field(type=FieldType.Integer)
private Integer contractId;
/**
* 地区码
*/
@Field
private String areaCode;
/**
* 楼层
*/
@Field(type=FieldType.Integer)
private Integer floor;
/**
* 宿舍号
*/
@Field
private String roomNum;
/**
* 宿舍人数
*/
@Field(type=FieldType.Integer)
private Integer humanNum;
/**
* 水电改造批次号(空为未改造)
*/
@Field
private String constructionBatchCode;
/**
* 安装批次号(空为未安装)
*/
@Field
private String installBatchCode;
/**
* 单间水电改造花费
*/
@Field
private BigDecimal constructionCost;
/**
* 是否私有?0:公有1:私有
*/
@Field
private Integer isPrivate;
/**
* 是否额外设备?0:非额外设备1:额外设备
*/
@Field
private Integer isExtra;
/**
* 状态0:正常1:禁用
*/
@Field
private Integer state;
/**
* 设备ID
*/
@Field
private Integer deviceId;
@Field
private Integer operator;
/**
* 是否删除?0:未删除1:已删除
*/
@Field
private Integer isDel;
/**
* 更新时间
*/
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@Field
private Date updateTime;
/**
* 创建时间
*/
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@Field
private Date createTime;
@Field
private Long washerId;
@Field
private Long logId;
}
2.Repository Dao
public interface AreaDetailRepository extends ElasticsearchRepository<EsAreaDetail, Integer> {
}
3.EsAreaDetailService
public interface EsAreaDetailService {
Result insert(EsAreaDetail areaDetail);
Result update(EsAreaDetail areaDetail);
Result delete(Integer id);
Result findById(Integer id);
Result findByAll();
}
4.EsAreaDetailServiceImpl
@Service
public class EsAreaDetailServiceImpl implements EsAreaDetailService {
@Autowired
private AreaDetailRepository areaDetailRepository;
@Override
public Result insert(EsAreaDetail areaDetail) {
return Result.getSuccessResult(areaDetailRepository.save(areaDetail));
}
@Override
public Result update(EsAreaDetail areaDetail) {
return Result.getSuccessResult(areaDetailRepository.save(areaDetail));
}
@Override
public Result delete(Integer id) {
areaDetailRepository.deleteById(id);
return Result.getSuccessResult();
}
@Override
public Result findById(Integer id) {
Optional<EsAreaDetail> result = areaDetailRepository.findById(id);
if (result.isPresent()) {
return Result.getSuccessResult(result.get());
}
return Result.getFailResult("查无数据");
}
@Override
public Result findByAll() {
StopWatch watch = new StopWatch();
watch.start();
List<EsAreaDetail> areaDetailList = new ArrayList<>();
Iterable<EsAreaDetail> areaDetailIterable = areaDetailRepository.findAll();
areaDetailIterable.forEach(areaDetailList::add);
watch.stop();
long millis = watch.getTotalTimeMillis();
return Result.getSuccessResult(areaDetailList, String.valueOf(millis));
}
}
@RestController
@RequestMapping("/es/areaDetail")
public class EsAreaDetailControllern {
@Autowired
private EsAreaDetailService areaDetailService;
@RequestMapping("/insert")
public Result insert(@RequestBody EsAreaDetail areaDetail) {
return areaDetailService.insert(areaDetail);
}
@RequestMapping("/update")
public Result update(@RequestBody EsAreaDetail areaDetail) {
return areaDetailService.update(areaDetail);
}
@RequestMapping("/delete")
public Result delete(@RequestParam("id") Integer id) {
return areaDetailService.delete(id);
}
@RequestMapping("/findById")
public Result findById(@RequestParam("id") Integer id) {
return areaDetailService.findById(id);
}
@RequestMapping("/findByAll")
public Result findByAll() {
return areaDetailService.findByAll();
}
}
6.校验数据
评论区