commit
d2d6e406a6
18 changed files with 595 additions and 0 deletions
-
103pom.xml
-
18src/main/java/com/whhj/Application.java
-
25src/main/java/com/whhj/config/ChannelInitializerImpl.java
-
10src/main/java/com/whhj/constant/CommonConstant.java
-
13src/main/java/com/whhj/dao/YlSmartMattressMapper.java
-
41src/main/java/com/whhj/entity/DeviceInfo.java
-
35src/main/java/com/whhj/entity/YlSmartMattress.java
-
60src/main/java/com/whhj/handler/NettyServerHandler.java
-
67src/main/java/com/whhj/handler/QuantumDecoder.java
-
52src/main/java/com/whhj/server/IotServer.java
-
15src/main/java/com/whhj/service/YlSmartMattressService.java
-
25src/main/java/com/whhj/util/ApplicationContextUtil.java
-
20src/main/java/com/whhj/util/HexUtil.java
-
26src/main/resources/application-test.yml
-
3src/main/resources/application.yml
-
47src/main/resources/logback-spring.xml
-
5src/main/resources/mapper/YlSmartMattressMapper.xml
-
30src/test/java/ApplicationTest.java
@ -0,0 +1,103 @@ |
|||
<?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 http://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.7.18</version> |
|||
<relativePath/> <!-- lookup parent from repository --> |
|||
</parent> |
|||
<groupId>com.whhz</groupId> |
|||
<artifactId>quantum-iot</artifactId> |
|||
<version>1.0-SNAPSHOT</version> |
|||
|
|||
<properties> |
|||
<maven.compiler.source>8</maven.compiler.source> |
|||
<maven.compiler.target>8</maven.compiler.target> |
|||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
|||
<netty.version>4.1.42.Final</netty.version> |
|||
</properties> |
|||
|
|||
<dependencies> |
|||
<dependency> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-starter</artifactId> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>io.netty</groupId> |
|||
<artifactId>netty-all</artifactId> |
|||
<version>${netty.version}</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.projectlombok</groupId> |
|||
<artifactId>lombok</artifactId> |
|||
<version>1.18.32</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>com.alibaba</groupId> |
|||
<artifactId>fastjson</artifactId> |
|||
<version>1.2.83</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>mysql</groupId> |
|||
<artifactId>mysql-connector-java</artifactId> |
|||
<version>5.1.40</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>com.baomidou</groupId> |
|||
<artifactId>mybatis-plus-boot-starter</artifactId> |
|||
<version>3.4.3</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>cn.hutool</groupId> |
|||
<artifactId>hutool-core</artifactId> |
|||
<version>5.7.16</version> |
|||
</dependency> |
|||
|
|||
<!-- Test --> |
|||
<dependency> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-starter-test</artifactId> |
|||
<scope>test</scope> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>junit</groupId> |
|||
<artifactId>junit</artifactId> |
|||
<version>4.13.2</version> |
|||
<scope>test</scope> |
|||
</dependency> |
|||
|
|||
<!-- 日志 --> |
|||
<dependency> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-starter-logging</artifactId> |
|||
</dependency> |
|||
|
|||
</dependencies> |
|||
|
|||
<build> |
|||
<plugins> |
|||
<plugin> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-maven-plugin</artifactId> |
|||
<configuration> |
|||
<mainClass>com.whhj.Application</mainClass> |
|||
</configuration> |
|||
</plugin> |
|||
<plugin> |
|||
<groupId>org.apache.maven.plugins</groupId> |
|||
<artifactId>maven-jar-plugin</artifactId> |
|||
<configuration> |
|||
<archive> |
|||
<manifest> |
|||
<mainClass>com.whhj.Application</mainClass> |
|||
</manifest> |
|||
</archive> |
|||
</configuration> |
|||
</plugin> |
|||
</plugins> |
|||
</build> |
|||
|
|||
</project> |
|||
@ -0,0 +1,18 @@ |
|||
package com.whhj; |
|||
|
|||
import org.mybatis.spring.annotation.MapperScan; |
|||
import org.springframework.boot.SpringApplication; |
|||
import org.springframework.boot.autoconfigure.SpringBootApplication; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/20 17:35 |
|||
**/ |
|||
@MapperScan("com.whhj.dao") |
|||
@SpringBootApplication |
|||
public class Application { |
|||
|
|||
public static void main(String[] args) { |
|||
SpringApplication.run(Application.class, args); |
|||
} |
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
package com.whhj.config; |
|||
|
|||
import com.whhj.handler.NettyServerHandler; |
|||
import com.whhj.handler.QuantumDecoder; |
|||
import io.netty.channel.ChannelInitializer; |
|||
import io.netty.channel.ChannelPipeline; |
|||
import io.netty.channel.socket.SocketChannel; |
|||
import io.netty.handler.codec.string.StringEncoder; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/20 19:33 |
|||
**/ |
|||
|
|||
|
|||
public class ChannelInitializerImpl extends ChannelInitializer<SocketChannel> { |
|||
|
|||
@Override |
|||
protected void initChannel(SocketChannel ch) { |
|||
ChannelPipeline pipeline = ch.pipeline(); |
|||
pipeline.addLast( new QuantumDecoder()); |
|||
pipeline.addLast(new StringEncoder()); |
|||
pipeline.addLast(new NettyServerHandler()); // 自定义处理器 |
|||
} |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
package com.whhj.constant; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/30 23:26 |
|||
**/ |
|||
public interface CommonConstant { |
|||
|
|||
String DEVICE_BRAND_CODE = "4"; |
|||
} |
|||
@ -0,0 +1,13 @@ |
|||
package com.whhj.dao; |
|||
|
|||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
|||
import com.whhj.entity.YlSmartMattress; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/22 23:28 |
|||
**/ |
|||
@Mapper |
|||
public interface YlSmartMattressMapper extends BaseMapper<YlSmartMattress> { |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
package com.whhj.entity; |
|||
|
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/20 22:08 |
|||
**/ |
|||
@Getter |
|||
@Setter |
|||
public class DeviceInfo{ |
|||
/** |
|||
* 命令类型 |
|||
*/ |
|||
private Integer commandType; |
|||
/** |
|||
* 设备sn |
|||
*/ |
|||
private String sn; |
|||
/** |
|||
* 上报时间 |
|||
*/ |
|||
private Integer reportTime; |
|||
/** |
|||
* 心率 |
|||
*/ |
|||
private Integer heartRate; |
|||
/** |
|||
* 呼吸值 |
|||
*/ |
|||
private Integer breath; |
|||
/** |
|||
* 状态 |
|||
*/ |
|||
private Integer status; |
|||
/** |
|||
* 电量 |
|||
*/ |
|||
private Integer electricity; |
|||
} |
|||
@ -0,0 +1,35 @@ |
|||
package com.whhj.entity; |
|||
|
|||
import com.baomidou.mybatisplus.annotation.IdType; |
|||
import com.baomidou.mybatisplus.annotation.TableId; |
|||
import com.baomidou.mybatisplus.annotation.TableName; |
|||
import lombok.Data; |
|||
|
|||
import java.util.Date; |
|||
|
|||
@Data |
|||
@TableName("yl_smart_mattress") |
|||
public class YlSmartMattress { |
|||
|
|||
@TableId(type = IdType.AUTO) |
|||
private Long id; |
|||
|
|||
private String deviceId; |
|||
|
|||
private Integer heart; |
|||
|
|||
private Integer breathe; |
|||
|
|||
private String leaveBed; |
|||
|
|||
private Boolean move; |
|||
|
|||
private Boolean wifi; |
|||
|
|||
private Boolean m4g; |
|||
|
|||
private Date createTime; |
|||
|
|||
private String brand; |
|||
|
|||
} |
|||
@ -0,0 +1,60 @@ |
|||
package com.whhj.handler; |
|||
|
|||
import cn.hutool.core.date.DateUtil; |
|||
import com.alibaba.fastjson.JSON; |
|||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|||
import com.whhj.constant.CommonConstant; |
|||
import com.whhj.entity.DeviceInfo; |
|||
import com.whhj.entity.YlSmartMattress; |
|||
import com.whhj.service.YlSmartMattressService; |
|||
import com.whhj.util.ApplicationContextUtil; |
|||
import io.netty.channel.ChannelHandler; |
|||
import io.netty.channel.ChannelHandlerContext; |
|||
import io.netty.channel.ChannelInboundHandlerAdapter; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/20 19:34 |
|||
**/ |
|||
|
|||
@Slf4j |
|||
@ChannelHandler.Sharable |
|||
public class NettyServerHandler extends ChannelInboundHandlerAdapter { |
|||
|
|||
@Override |
|||
public void channelRead(ChannelHandlerContext ctx, Object msg) { |
|||
if (msg instanceof DeviceInfo) { |
|||
DeviceInfo reportInfo = (DeviceInfo) msg; |
|||
log.info("Received info: {}", JSON.toJSONString(reportInfo)); |
|||
YlSmartMattressService service = ApplicationContextUtil.getBean(YlSmartMattressService.class); |
|||
QueryWrapper<YlSmartMattress> queryWrapper = new QueryWrapper<>(); |
|||
queryWrapper.eq("device_id", reportInfo.getSn()); |
|||
queryWrapper.eq("brand", CommonConstant.DEVICE_BRAND_CODE); |
|||
YlSmartMattress originInfo = service.getOne(queryWrapper); |
|||
YlSmartMattress ylSmartMattress = new YlSmartMattress(); |
|||
if (originInfo != null) { |
|||
ylSmartMattress.setId(originInfo.getId()); |
|||
} |
|||
ylSmartMattress.setBrand(CommonConstant.DEVICE_BRAND_CODE); |
|||
ylSmartMattress.setDeviceId(reportInfo.getSn()); |
|||
ylSmartMattress.setHeart(reportInfo.getHeartRate()); |
|||
ylSmartMattress.setBreathe(reportInfo.getBreath()); |
|||
ylSmartMattress.setLeaveBed(reportInfo.getStatus() == 4 ? "1" : "0"); |
|||
ylSmartMattress.setCreateTime(DateUtil.date(Long.valueOf(reportInfo.getReportTime()) * 1000)); |
|||
service.saveOrUpdate(ylSmartMattress); |
|||
ctx.writeAndFlush("received data"); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { |
|||
cause.printStackTrace(); |
|||
ctx.close(); |
|||
} |
|||
|
|||
@Override |
|||
public void channelActive(ChannelHandlerContext ctx) { |
|||
log.info("Client:{} connected",ctx.channel().remoteAddress()); |
|||
} |
|||
} |
|||
@ -0,0 +1,67 @@ |
|||
package com.whhj.handler; |
|||
|
|||
import cn.hutool.core.util.StrUtil; |
|||
import com.whhj.entity.DeviceInfo; |
|||
import com.whhj.util.HexUtil; |
|||
import io.netty.buffer.ByteBuf; |
|||
import io.netty.channel.ChannelHandlerContext; |
|||
import io.netty.handler.codec.ByteToMessageDecoder; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import java.nio.ByteOrder; |
|||
import java.nio.ByteBuffer; |
|||
import java.nio.charset.StandardCharsets; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/20 22:04 |
|||
**/ |
|||
public class QuantumDecoder extends ByteToMessageDecoder { |
|||
|
|||
private static final Logger log = LoggerFactory.getLogger(QuantumDecoder.class); |
|||
|
|||
private static final int FRAME_LENGTH = 16; |
|||
private static final String START_MARKER = "cd"; |
|||
@Override |
|||
protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> list) { |
|||
// 检查是否有足够的字节来读取一个完整的消息 |
|||
if (in.readableBytes() < FRAME_LENGTH) { |
|||
return; |
|||
} |
|||
in.markReaderIndex(); |
|||
String frameHeader = Integer.toHexString(0xFF & in.readByte()); |
|||
|
|||
// 检查起始标识是否匹配 |
|||
if (!StrUtil.equals(frameHeader, START_MARKER)) { |
|||
in.resetReaderIndex(); |
|||
byte[] data = new byte[in.readableBytes()]; |
|||
in.readBytes(data); |
|||
try { |
|||
log.info("invalid data:{}",HexUtil.bytesToHexStr(data)); |
|||
}catch (Exception e){ |
|||
e.printStackTrace(); |
|||
} |
|||
return; |
|||
} |
|||
DeviceInfo deviceInfo = new DeviceInfo(); |
|||
int cmdType = in.readByte(); |
|||
deviceInfo.setCommandType(cmdType); |
|||
byte[] sn = new byte[6]; |
|||
in.readBytes(sn); |
|||
deviceInfo.setSn(HexUtil.bytesToHexStr(sn)); |
|||
byte[] reportTime = new byte[4]; |
|||
in.readBytes(reportTime); |
|||
deviceInfo.setReportTime(ByteBuffer.wrap(reportTime).order(ByteOrder.BIG_ENDIAN).getInt()); |
|||
int heartRate = in.readByte(); |
|||
deviceInfo.setHeartRate(heartRate); |
|||
int breath = in.readByte(); |
|||
deviceInfo.setBreath(breath); |
|||
int status = in.readByte(); |
|||
deviceInfo.setStatus(status); |
|||
int electricity = in.readByte(); |
|||
deviceInfo.setElectricity(electricity); |
|||
list.add(deviceInfo); |
|||
} |
|||
} |
|||
@ -0,0 +1,52 @@ |
|||
package com.whhj.server; |
|||
|
|||
import com.whhj.config.ChannelInitializerImpl; |
|||
import io.netty.channel.ChannelFuture; |
|||
import io.netty.channel.ChannelOption; |
|||
import io.netty.channel.EventLoopGroup; |
|||
import io.netty.channel.nio.*; |
|||
import io.netty.bootstrap.ServerBootstrap; |
|||
import io.netty.channel.socket.nio.NioServerSocketChannel; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.context.ApplicationListener; |
|||
import org.springframework.context.event.ContextClosedEvent; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/20 17:36 |
|||
**/ |
|||
@Slf4j |
|||
@Component |
|||
public class IotServer implements ApplicationListener<ContextClosedEvent> { |
|||
|
|||
private final EventLoopGroup bossGroup = new NioEventLoopGroup(); |
|||
private final EventLoopGroup workerGroup = new NioEventLoopGroup(); |
|||
private final ServerBootstrap bootstrap = new ServerBootstrap(); |
|||
|
|||
@Override |
|||
public void onApplicationEvent(ContextClosedEvent event) { |
|||
bootstrap.group(bossGroup, workerGroup) |
|||
.channel(NioServerSocketChannel.class) |
|||
.childHandler(new ChannelInitializerImpl()) |
|||
.option(ChannelOption.SO_BACKLOG, 128) |
|||
.childOption(ChannelOption.SO_KEEPALIVE, true); |
|||
try { |
|||
|
|||
ChannelFuture channelFuture = bootstrap.bind(8080).sync(); |
|||
log.info("服务启动:{}", channelFuture.channel().localAddress()); |
|||
channelFuture.channel().closeFuture().sync(); |
|||
log.info("服务关闭"); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} finally { |
|||
try { |
|||
bossGroup.shutdownGracefully().sync(); |
|||
workerGroup.shutdownGracefully().sync(); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
log.info("资源已释放"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,15 @@ |
|||
package com.whhj.service; |
|||
|
|||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|||
import com.whhj.dao.YlSmartMattressMapper; |
|||
import com.whhj.entity.YlSmartMattress; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/22 23:32 |
|||
**/ |
|||
@Service |
|||
public class YlSmartMattressService extends ServiceImpl<YlSmartMattressMapper, YlSmartMattress> { |
|||
|
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
package com.whhj.util; |
|||
|
|||
import org.springframework.beans.BeansException; |
|||
import org.springframework.context.ApplicationContext; |
|||
import org.springframework.context.ApplicationContextAware; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/23 22:09 |
|||
**/ |
|||
@Component |
|||
public class ApplicationContextUtil implements ApplicationContextAware { |
|||
|
|||
private static ApplicationContext context; |
|||
|
|||
@Override |
|||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { |
|||
context = applicationContext; |
|||
} |
|||
|
|||
public static <T> T getBean(Class<T> clazz) { |
|||
return context.getBean(clazz); |
|||
} |
|||
} |
|||
@ -0,0 +1,20 @@ |
|||
package com.whhj.util; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/21 22:43 |
|||
**/ |
|||
public class HexUtil { |
|||
|
|||
public static String bytesToHexStr(byte[] bytes) { |
|||
StringBuilder hexString = new StringBuilder(); |
|||
for (byte b : bytes) { |
|||
String hex = Integer.toHexString(0xFF & b); |
|||
if (hex.length() == 1) { |
|||
hexString.append('0'); |
|||
} |
|||
hexString.append(hex); |
|||
} |
|||
return hexString.toString(); |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
# 服务端口配置 |
|||
server: |
|||
port: 8088 |
|||
|
|||
spring: |
|||
datasource: |
|||
url: jdbc:mysql://119.23.39.166:3306/jjyl_test?useUnicode=true&&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitlsBoolean=true |
|||
username: root |
|||
password: rootWHJ2018 |
|||
driver-class-name: com.mysql.jdbc.Driver |
|||
type: com.zaxxer.hikari.HikariDataSource |
|||
hikari: |
|||
connection-timeout: 30000 # 连接超时时间(毫秒) |
|||
maximum-pool-size: 10 # 最大连接池大小 |
|||
minimum-idle: 5 # 最小空闲连接数 |
|||
idle-timeout: 600000 # 空闲连接超时时间(毫秒) |
|||
max-lifetime: 1800000 # 连接的最大生命周期(毫秒) |
|||
pool-name: HikariCPDemoPool # 连接池名称 |
|||
auto-commit: true # 是否自动提交 |
|||
connection-test-query: SELECT 1 # 连接测试查询 |
|||
validation-timeout: 5000 # 连接验证超时时间(毫秒) |
|||
|
|||
mybatis-plus: |
|||
configuration: |
|||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl |
|||
mapper-locations: classpath:mapper/*.xml |
|||
@ -0,0 +1,3 @@ |
|||
spring: |
|||
profiles: |
|||
active: test |
|||
@ -0,0 +1,47 @@ |
|||
<configuration> |
|||
<!-- 定义日志文件的存储路径 --> |
|||
<property name="LOG_PATH" value="logs" /> |
|||
<property name="LOG_FILE" value="${LOG_PATH}/quantum-iot.log" /> |
|||
<property name="LOG_FILE_MAX_HISTORY" value="7" /> |
|||
<property name="LOG_FILE_MAX_SIZE" value="100MB" /> |
|||
|
|||
<!-- 控制台输出格式 --> |
|||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> |
|||
<encoder> |
|||
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern> |
|||
</encoder> |
|||
</appender> |
|||
|
|||
<!-- 文件输出格式 --> |
|||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
|||
<file>${LOG_FILE}</file> |
|||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
|||
<!-- 按天滚动 --> |
|||
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern> |
|||
<!-- 保留7天的日志文件 --> |
|||
<maxHistory>${LOG_FILE_MAX_HISTORY}</maxHistory> |
|||
<!-- 单个日志文件的最大大小 --> |
|||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
|||
<maxFileSize>${LOG_FILE_MAX_SIZE}</maxFileSize> |
|||
</timeBasedFileNamingAndTriggeringPolicy> |
|||
</rollingPolicy> |
|||
<encoder> |
|||
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern> |
|||
</encoder> |
|||
</appender> |
|||
|
|||
<!-- 配置根日志级别 --> |
|||
<root level="info"> |
|||
<appender-ref ref="STDOUT" /> |
|||
<appender-ref ref="FILE" /> |
|||
</root> |
|||
|
|||
<!-- 配置特定包的日志级别 --> |
|||
<logger name="com.example" level="debug" additivity="false"> |
|||
<appender-ref ref="FILE" /> |
|||
</logger> |
|||
|
|||
<!-- 配置Spring Boot的日志级别 --> |
|||
<logger name="org.springframework" level="info" /> |
|||
<logger name="org.hibernate" level="info" /> |
|||
</configuration> |
|||
@ -0,0 +1,5 @@ |
|||
<?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.whhz.dao.YlSmartMattressMapper"> |
|||
|
|||
</mapper> |
|||
@ -0,0 +1,30 @@ |
|||
import com.whhj.Application; |
|||
import com.whhj.service.YlSmartMattressService; |
|||
import com.whhj.util.ApplicationContextUtil; |
|||
import org.junit.Test; |
|||
import org.junit.runner.RunWith; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.boot.test.context.SpringBootTest; |
|||
import org.springframework.test.context.junit4.SpringRunner; |
|||
|
|||
/** |
|||
* @author lxg |
|||
* @date 2024/10/23 21:34 |
|||
**/ |
|||
@RunWith(SpringRunner.class) |
|||
@SpringBootTest(classes = Application.class) |
|||
public class ApplicationTest { |
|||
|
|||
@Autowired |
|||
private YlSmartMattressService ylSmartMattressService; |
|||
|
|||
@Autowired |
|||
private ApplicationContextUtil applicationContextUtil; |
|||
|
|||
@Test |
|||
public void test_01() { |
|||
Integer cnt = ylSmartMattressService.count(); |
|||
System.out.println(cnt); |
|||
} |
|||
|
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue