API统一包装返回结果,增加分页,排序等JPA常规操作

oracle
hwf453 1 year ago
parent 573bb62cf7
commit 40c352084b

@ -3,8 +3,10 @@
<output-path>$PROJECT_DIR$/target</output-path> <output-path>$PROJECT_DIR$/target</output-path>
<properties id="maven-jee-properties"> <properties id="maven-jee-properties">
<options> <options>
<exploded>false</exploded>
<module>admin-client-temperature</module> <module>admin-client-temperature</module>
<packaging>war</packaging> <packaging>war</packaging>
<unpackNestedArchives>false</unpackNestedArchives>
</options> </options>
</properties> </properties>
<root id="archive" name="admin-client-temperature.war"> <root id="archive" name="admin-client-temperature.war">

@ -6,6 +6,7 @@
<exploded>true</exploded> <exploded>true</exploded>
<module>admin-client-temperature</module> <module>admin-client-temperature</module>
<packaging>war</packaging> <packaging>war</packaging>
<unpackNestedArchives>false</unpackNestedArchives>
</options> </options>
</properties> </properties>
<root id="root"> <root id="root">
@ -63,7 +64,6 @@
<element id="library" level="project" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.12.4" /> <element id="library" level="project" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.12.4" />
<element id="library" level="project" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.5.3" /> <element id="library" level="project" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.5.3" />
<element id="library" level="project" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.50" /> <element id="library" level="project" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.50" />
<element id="library" level="project" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.50" />
<element id="library" level="project" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.50" /> <element id="library" level="project" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.50" />
<element id="library" level="project" name="Maven: org.springframework:spring-web:5.3.9" /> <element id="library" level="project" name="Maven: org.springframework:spring-web:5.3.9" />
<element id="library" level="project" name="Maven: org.springframework:spring-webmvc:5.3.9" /> <element id="library" level="project" name="Maven: org.springframework:spring-webmvc:5.3.9" />
@ -92,6 +92,10 @@
<element id="library" level="project" name="Maven: org.javassist:javassist:3.25.0-GA" /> <element id="library" level="project" name="Maven: org.javassist:javassist:3.25.0-GA" />
<element id="library" level="project" name="Maven: commons-io:commons-io:2.4" /> <element id="library" level="project" name="Maven: commons-io:commons-io:2.4" />
<element id="library" level="project" name="Maven: javax.validation:validation-api:2.0.1.Final" /> <element id="library" level="project" name="Maven: javax.validation:validation-api:2.0.1.Final" />
<element id="library" level="project" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.5.3" />
<element id="library" level="project" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.50" />
<element id="library" level="project" name="Maven: org.hibernate.validator:hibernate-validator:6.2.0.Final" />
<element id="library" level="project" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" />
<element id="library" level="project" name="Maven: com.oracle:ojdbc6:11.2.0.1.0" /> <element id="library" level="project" name="Maven: com.oracle:ojdbc6:11.2.0.1.0" />
<element id="library" level="project" name="Maven: io.swagger:swagger-annotations:1.5.20" /> <element id="library" level="project" name="Maven: io.swagger:swagger-annotations:1.5.20" />
<element id="library" level="project" name="Maven: com.alibaba:fastjson:1.2.47" /> <element id="library" level="project" name="Maven: com.alibaba:fastjson:1.2.47" />

@ -1,13 +0,0 @@
<component name="libraryTable">
<library name="Maven: javax.validation:validation-api:2.0.1.Final">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -1,15 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="eacd3dd8-1e95-428c-a6af-1aadb9921989" name="Default Changelist" comment=""> <list default="true" id="eacd3dd8-1e95-428c-a6af-1aadb9921989" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" /> <change afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/controller/TemperatureController.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/controller/api/TemperatureApiController.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/dto/RequestNowTemperatureDto.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/dto/RequestTemperatureDto.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/response/GlobalExceptionHandler.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/response/IResult.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/response/ResponseAdvice.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/response/Result.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/response/ResultEnum.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/artifacts/admin_client_temperature_war.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/artifacts/admin_client_temperature_war.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/artifacts/admin_client_temperature_war_exploded.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/artifacts/admin_client_temperature_war_exploded.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/admin-client-temperature.iml" beforeDir="false" afterPath="$PROJECT_DIR$/admin-client-temperature.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/MqttRSAClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/MqttRSAClient.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/dao/TemperatureRepository.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/dao/TemperatureRepository.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/entity/Temperature.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/entity/Temperature.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/service/TemperatureService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/service/TemperatureService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/service/impl/TemperatureServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/rehome/mqttclienttemperature/service/impl/TemperatureServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/application.yml" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" /> <option name="LAST_RESOLUTION" value="IGNORE" />
</component> </component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Enum" />
<option value="Interface" />
<option value="Class" />
</list>
</option>
</component>
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component> </component>
@ -36,6 +67,11 @@
<property name="project.structure.side.proportion" value="0.0" /> <property name="project.structure.side.proportion" value="0.0" />
<property name="settings.editor.selected.configurable" value="reference.projectsettings.compiler.javacompiler" /> <property name="settings.editor.selected.configurable" value="reference.projectsettings.compiler.javacompiler" />
</component> </component>
<component name="RecentsManager">
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="com.rehome.mqttclienttemperature.controller.api" />
</key>
</component>
<component name="RunManager"> <component name="RunManager">
<configuration name="AdminClientTemperatureApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot"> <configuration name="AdminClientTemperatureApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
<module name="admin-client-temperature" /> <module name="admin-client-temperature" />
@ -45,6 +81,7 @@
</method> </method>
</configuration> </configuration>
</component> </component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="SshConsoleOptionsProvider"> <component name="SshConsoleOptionsProvider">
<option name="myEncoding" value="UTF-8" /> <option name="myEncoding" value="UTF-8" />
</component> </component>
@ -67,48 +104,24 @@
<workItem from="1711955359433" duration="1952000" /> <workItem from="1711955359433" duration="1952000" />
<workItem from="1711962368857" duration="191000" /> <workItem from="1711962368857" duration="191000" />
<workItem from="1711962630863" duration="41000" /> <workItem from="1711962630863" duration="41000" />
<workItem from="1729042540045" duration="25874000" />
<workItem from="1729130149340" duration="736000" />
</task> </task>
<servers /> <servers />
</component> </component>
<component name="TypeScriptGeneratedFilesManager"> <component name="TypeScriptGeneratedFilesManager">
<option name="version" value="2" /> <option name="version" value="3" />
</component> </component>
<component name="WindowStateProjectService"> <component name="Vcs.Log.Tabs.Properties">
<state x="900" y="208" width="530" height="592" key="FileChooserDialogImpl" timestamp="1711942315728"> <option name="TAB_STATES">
<screen x="0" y="0" width="1920" height="1014" /> <map>
</state> <entry key="MAIN">
<state x="900" y="208" width="530" height="592" key="FileChooserDialogImpl/0.0.1920.1014@0.0.1920.1014" timestamp="1711942315728" /> <value>
<state width="1862" height="214" key="GridCell.Tab.0.bottom" timestamp="1711954660552"> <State />
<screen x="0" y="0" width="1920" height="1014" /> </value>
</state> </entry>
<state width="1862" height="214" key="GridCell.Tab.0.bottom/0.0.1920.1014@0.0.1920.1014" timestamp="1711954660552" /> </map>
<state width="1862" height="214" key="GridCell.Tab.0.center" timestamp="1711954660552"> </option>
<screen x="0" y="0" width="1920" height="1014" /> <option name="oldMeFiltersMigrated" value="true" />
</state>
<state width="1862" height="214" key="GridCell.Tab.0.center/0.0.1920.1014@0.0.1920.1014" timestamp="1711954660552" />
<state width="1862" height="214" key="GridCell.Tab.0.left" timestamp="1711954660552">
<screen x="0" y="0" width="1920" height="1014" />
</state>
<state width="1862" height="214" key="GridCell.Tab.0.left/0.0.1920.1014@0.0.1920.1014" timestamp="1711954660552" />
<state width="1862" height="214" key="GridCell.Tab.0.right" timestamp="1711954660552">
<screen x="0" y="0" width="1920" height="1014" />
</state>
<state width="1862" height="214" key="GridCell.Tab.0.right/0.0.1920.1014@0.0.1920.1014" timestamp="1711954660552" />
<state width="1442" height="214" key="GridCell.Tab.1.bottom" timestamp="1711952959307">
<screen x="0" y="0" width="1920" height="1014" />
</state>
<state width="1442" height="214" key="GridCell.Tab.1.bottom/0.0.1920.1014@0.0.1920.1014" timestamp="1711952959307" />
<state width="1442" height="214" key="GridCell.Tab.1.center" timestamp="1711952959307">
<screen x="0" y="0" width="1920" height="1014" />
</state>
<state width="1442" height="214" key="GridCell.Tab.1.center/0.0.1920.1014@0.0.1920.1014" timestamp="1711952959307" />
<state width="1442" height="214" key="GridCell.Tab.1.left" timestamp="1711952959307">
<screen x="0" y="0" width="1920" height="1014" />
</state>
<state width="1442" height="214" key="GridCell.Tab.1.left/0.0.1920.1014@0.0.1920.1014" timestamp="1711952959307" />
<state width="1442" height="214" key="GridCell.Tab.1.right" timestamp="1711952959307">
<screen x="0" y="0" width="1920" height="1014" />
</state>
<state width="1442" height="214" key="GridCell.Tab.1.right/0.0.1920.1014@0.0.1920.1014" timestamp="1711952959307" />
</component> </component>
</project> </project>

@ -86,7 +86,6 @@
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.12.4" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.12.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.5.3" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.50" level="project" /> <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.50" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.50" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.50" level="project" /> <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.50" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.9" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.9" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.9" level="project" />
@ -138,6 +137,10 @@
<orderEntry type="library" name="Maven: org.javassist:javassist:3.25.0-GA" level="project" /> <orderEntry type="library" name="Maven: org.javassist:javassist:3.25.0-GA" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.4" level="project" /> <orderEntry type="library" name="Maven: commons-io:commons-io:2.4" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" /> <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.50" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.2.0.Final" level="project" />
<orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
<orderEntry type="library" name="Maven: com.oracle:ojdbc6:11.2.0.1.0" level="project" /> <orderEntry type="library" name="Maven: com.oracle:ojdbc6:11.2.0.1.0" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" /> <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.47" level="project" /> <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.47" level="project" />

@ -101,6 +101,10 @@
<artifactId>validation-api</artifactId> <artifactId>validation-api</artifactId>
<version>2.0.1.Final</version> <version>2.0.1.Final</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.oracle</groupId> <groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId> <artifactId>ojdbc6</artifactId>

@ -103,7 +103,7 @@ public class MqttRSAClient {
System.out.println("topic:"+s); System.out.println("topic:"+s);
System.out.println("Qos:"+mqttMessage.getQos()); System.out.println("Qos:"+mqttMessage.getQos());
System.out.println("message RSA:"+strData); System.out.println("message RSA:"+strData);
temperatureService.saveTemperature(strData,s); //temperatureService.saveTemperature(strData,s);
} }
@Override @Override

@ -0,0 +1,62 @@
package com.rehome.mqttclienttemperature.controller;
import com.rehome.mqttclienttemperature.dto.RequestNowTemperatureDto;
import com.rehome.mqttclienttemperature.dto.RequestTemperatureDto;
import com.rehome.mqttclienttemperature.entity.Temperature;
import com.rehome.mqttclienttemperature.response.Result;
import com.rehome.mqttclienttemperature.service.TemperatureService;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @author HuangWenfei
* App
* 2024-10-16 11:11
*/
@RestController
@CrossOrigin
@RequestMapping("/web/temperature")
public class TemperatureController {
@Resource
private TemperatureService temperatureService;
/**
* APP
*/
@PostMapping("/getHistoryTemperatureByTen")
private List<Temperature> getHistoryTemperatureByTen(@RequestBody @Validated RequestTemperatureDto dto) {
return temperatureService.findFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
}
/**
* APP
*/
@PostMapping("/getRealTemperatureByTen")
private List<Temperature> getRealTemperatureByTen(@RequestBody @Validated RequestNowTemperatureDto dto) {
return temperatureService.findFirst10ByLocationDesc(dto.getLocationDesc());
}
/**
*
*/
@PostMapping("/findFirstByOrderByLocationDescAsc")
private Temperature findFirstByOrderByLocationDescAsc(@RequestBody @Validated RequestNowTemperatureDto dto) {
return temperatureService.findFirstByOrderByLocationDescAsc(dto.getLocationDesc());
}
/**
* APP
*/
@PostMapping("/queryFirst10ByDataDateAndLocationDesc")
private List<Temperature> queryFirst10ByDataDateAndLocationDesc(@RequestBody @Validated RequestTemperatureDto dto) {
return temperatureService.queryFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
}
}

@ -0,0 +1,75 @@
package com.rehome.mqttclienttemperature.controller.api;
import com.rehome.mqttclienttemperature.dto.RequestNowTemperatureDto;
import com.rehome.mqttclienttemperature.dto.RequestTemperatureDto;
import com.rehome.mqttclienttemperature.entity.Temperature;
import com.rehome.mqttclienttemperature.response.Result;
import com.rehome.mqttclienttemperature.service.TemperatureService;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @author HuangWenfei
* App
* 2024-10-16 11:11
*/
@RestController
@CrossOrigin
@RequestMapping("/api/temperature")
public class TemperatureApiController {
@Resource
private TemperatureService temperatureService;
/**
* APP
*/
@PostMapping("/getHistoryTemperatureByTen")
private List<Temperature> getHistoryTemperatureByTen(@RequestBody @Validated RequestTemperatureDto dto) {
return temperatureService.findFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
}
/**
* APP
*/
@PostMapping("/getRealTemperatureByTen")
private List<Temperature> getRealTemperatureByTen(@RequestBody @Validated RequestNowTemperatureDto dto) {
return temperatureService.findFirst10ByLocationDesc(dto.getLocationDesc());
}
/**
*
*/
@PostMapping("/findFirstByOrderByLocationDescAsc")
private Temperature findFirstByOrderByLocationDescAsc(@RequestBody @Validated RequestNowTemperatureDto dto) {
return temperatureService.findFirstByOrderByLocationDescAsc(dto.getLocationDesc());
}
/**
* APP
*/
@PostMapping("/queryFirst10ByDataDateAndLocationDesc")
private List<Temperature> queryFirst10ByDataDateAndLocationDesc(@RequestBody @Validated RequestTemperatureDto dto) {
return temperatureService.queryFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
}
/**
* APP
*/
@PostMapping("/queryFirst10ByDataDateAndLocationDescBindingResult")
private Result queryFirst10ByDataDateAndLocationDescBindingResult(@RequestBody @Validated RequestTemperatureDto dto, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
//处理参数校验失败错误信息,有种处理方式。
//1.通过捕获异常处理校验结果,详情见 com.rehome.mqttclienttemperature.response.GlobalExceptionHandler
//2.通过在方法形参里加入BindingResult
return Result.failedByParamValidated(bindingResult);
}
List<Temperature> listResult = temperatureService.queryFirst10ByDataDateAndLocationDesc(dto.getDataDate(),dto.getLocationDesc());
return Result.success(listResult);
}
}

@ -2,7 +2,13 @@ package com.rehome.mqttclienttemperature.dao;
import com.rehome.mqttclienttemperature.entity.Temperature; import com.rehome.mqttclienttemperature.entity.Temperature;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/** /**
@ -16,4 +22,85 @@ public interface TemperatureRepository extends JpaRepository<Temperature,Long> {
Temperature findByDataDate(String dataDate); Temperature findByDataDate(String dataDate);
Temperature findByDataHour(String dataHour); Temperature findByDataHour(String dataHour);
Temperature findByDataMinute(String dataMinute); Temperature findByDataMinute(String dataMinute);
@Query(value = "select * from temperature t where t.data_date=?1 and t.location_desc=?2", nativeQuery = true)
List<Temperature> findByDataDateAndLocationDesc(String dataDate,String locationDesc);
List<Temperature> findFirst10ByDataDateAndLocationDesc(String dataDate,String locationDesc, Sort sort);
Page<Temperature> queryFirst10ByDataDateAndLocationDesc(String dataDate,String locationDesc, Pageable pageable);
Temperature findFirstByOrderByDataDateDesc();
// 五、分页查询
//
// Page<User> findALL(Pageable pageable);
// Page<User> findByUserName(String userName,Pageable pageable);
//
// 在查询的方法中需要传入参数Pageable ,
// 当查询中有多个参数的时候Pageable建议做为最后一个参数传入 。
// Pageable 是 Spring 封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则。
//
// int page=1,size=10;
// Sort sort = new Sort(Direction.DESC, "id");
// Pageable pageable = new PageRequest(page, size, sort);
// userRepository.findALL(pageable);
// userRepository.findByUserName("testName", pageable);
//
//
// 六、限制查询
//
// 查询前 N 个元素
//
// User findFirstByOrderByLastnameAsc();
// User findTopByOrderByAgeDesc();
// Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
// List<User> findFirst10ByLastname(String lastname, Sort sort);
// List<User> findTop10ByLastname(String lastname, Pageable pageable);
//
// 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序【专题】
//
// 首先来说一下分页和排序所用到的Page、Pageable接口和Sort类都是什么
//
// JpaRepository提供了两个和分页和排序有关的查询
//
// List findAllSort sort 返回所有实体,按照指定顺序排序返回
//
// List findAllPageable pageable 返回实体列表实体的offest和limit通过pageable来指定
//
// Sort对象用来指示排序最简单的Sort对象构造可以传入一个属性名列表不是数据库列名是属性名默认采用升序排序。例
//
// Sort sort = new Sort("id")
// //或 Sort sort = new Sort(Direction.ASC,"id");
// return userDao.findAll(sort);
// 程序将查询所有user并按照id进行生序排序。Sort还包括其他一些构造方法在这里就不一一赘述。
//
// Pageable接口用于构造翻页查询PageRequest是其实现类可以通过提供的工厂方法创建PageRequest
//
// public static PageRequest of(int page, int size)
// 也可以在PageRequest中加入排序
//
// public static PageRequest of(int page, int size, Sort sort)
// 方法中的参数page总是从0开始表示查询页size指每页的期望行数。
//
// Page接口可以获得当前页面的记录、总页数、总记录数、是否有上一页或下一页等。Spring Data翻页查询总是返回Page对象Page对象提供了以下常用的方法
//
// int getTotalPages() 总的页数
// long getTotalElements() 返回总数
// List getContent() 返回此次查询的结果集
// ————————————————
} }

@ -0,0 +1,11 @@
package com.rehome.mqttclienttemperature.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class RequestNowTemperatureDto {
@NotBlank(message = "位置描述不能为空")
private String locationDesc;
}

@ -0,0 +1,14 @@
package com.rehome.mqttclienttemperature.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
@Data
public class RequestTemperatureDto {
@NotEmpty(message = "查询日期不能为空")
private String dataDate;
@NotEmpty(message = "位置描述不能为空")
private String locationDesc;
}

@ -12,6 +12,18 @@ import java.util.Date;
@Proxy(lazy = false) @Proxy(lazy = false)
@Data @Data
@Entity @Entity
//普通索引,不指定索引名,表自动创建索引名
//@Table(indexes = {@Index(columnList = "dataDate"),@Index(columnList = "locationDesc")})
//普通索引,指定索引名,创建单个索引
//在这个例子中Temperature实体类通过@Table注解的indexes属性定义了一个名为idx_dataDate的索引它覆盖了dataDate字段。这意味着在数据库层面针对dataDate字段的查询将会利用这个索引从而提高查询效率。
//@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate")})
//同时创建多个普通索引,注意每个索引名都不同
//@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate"),@Index(name = "idx_locationDesc", columnList = "locationDesc")})
//@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate"),@Index(name = "idx_locationDesc", columnList = "locationDesc"),@Index(name = "idx_dataHour", columnList = "dataHour"),@Index(name = "idx_dataMinute", columnList = "dataMinute")})
//创建组合索引,注意每个索引名都相同
//@Table(indexes = {@Index(name = "data_date_location_desc", columnList = "dataDate"),@Index(name = "data_date_location_desc", columnList = "locationDesc")})
//同时创建普通索引和组合索引,注意普通索引每个索引名都不同,注意组合索引每个索引名都相同
@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate"),@Index(name = "idx_locationDesc", columnList = "locationDesc"),@Index(name = "idx_dataHour", columnList = "dataHour"),@Index(name = "idx_dataMinute", columnList = "dataMinute"),@Index(name = "data_date_location_desc", columnList = "dataDate"),@Index(name = "data_date_location_desc", columnList = "locationDesc")})
public class Temperature implements Serializable { public class Temperature implements Serializable {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)

@ -0,0 +1,70 @@
package com.rehome.mqttclienttemperature.response;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Optional;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BindException.class)
public Result handleValidationException(BindException ex) {
Result result = Result.failedByParamValidated();
for (FieldError error : ex.getBindingResult().getFieldErrors()) {
System.out.println(error.getField());
System.out.println(error.getDefaultMessage());
String baseErrorStr = result.getMessage();
if(error.getField()!=null){
baseErrorStr=baseErrorStr+","+error.getField();
result.setMessage(baseErrorStr);
}
if(error.getDefaultMessage()!=null){
baseErrorStr=baseErrorStr+":"+error.getDefaultMessage();
result.setMessage(baseErrorStr);
}
}
return result;
}
}
//@RestControllerAdvice
//public class GlobalExceptionHandler {
// @ExceptionHandler(BindException.class)
// public R handleValidationException(BindException ex) {
// R result = R.error();
// for (FieldError error : ex.getBindingResult().getFieldErrors()) {
// result.data(error.getField(), error.getDefaultMessage());
// }
// Optional<Object> firstError = result.getData().values().stream().findFirst();
// return result.msg("请完善信息: "+firstError.orElse("表单内容") +
// (ex.getErrorCount()>1?" 等多项问题":""));
// }
//}
//参考https://www.cnblogs.com/liuscraft/p/17366441.html
//<dependencies>
//<dependency>
//<groupId>org.springframework.boot</groupId>
//<artifactId>spring-boot-starter-validation</artifactId>
//</dependency>
//</dependencies>
//@RestController
//@RequestMapping("/users")
//@Validated
//public class UserController {
// @PostMapping
// public String createUser(@RequestBody User user, BindingResult result) {
// if (result.hasErrors()) {
// // 处理错误信息
// return "error";
// }
// // 处理用户信息
// return "success";
// }
//}

@ -0,0 +1,7 @@
package com.rehome.mqttclienttemperature.response;
//定义返回数据结构
public interface IResult {
Integer getCode();
String getMessage();
}

@ -0,0 +1,30 @@
package com.rehome.mqttclienttemperature.response;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
//统一包装处理,扫描需要包装返回数据的包
//如果引入了swagger或knife4j的文档生成组件这里需要仅扫描自己项目的包否则文档无法正常生成
@RestControllerAdvice(basePackages = "com.rehome.mqttclienttemperature.controller.api")
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
// 如果不需要进行封装的,可以添加一些校验手段,比如添加标记排除的注解
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
// 提供一定的灵活度如果body已经被包装了就不进行包装
if (body instanceof Result) {
return body;
}
return Result.success(body);
}
}

@ -0,0 +1,68 @@
package com.rehome.mqttclienttemperature.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
//统一返回数据结构
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
private Integer code;
private String message;
private T data;
public static <T> Result<T> success(T data) {
return new Result<>(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), data);
}
public static <T> Result<T> success(String message, T data) {
return new Result<>(ResultEnum.SUCCESS.getCode(), message, data);
}
public static Result<?> failed() {
return new Result<>(ResultEnum.COMMON_FAILED.getCode(), ResultEnum.COMMON_FAILED.getMessage(), null);
}
public static Result<?> failedByParamValidated() {
return new Result<>(ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getCode(), ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getMessage(), null);
}
public static Result<?> failedByParamValidated(BindingResult bindingResult) {
Result result = new Result<>(ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getCode(), ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getMessage(), null);
// 处理错误信息
for (FieldError error : bindingResult.getFieldErrors()) {
String baseErrorMessage = result.getMessage();
if(error.getField()!=null){
baseErrorMessage=baseErrorMessage+","+error.getField();
result.setMessage(baseErrorMessage);
}
if(error.getDefaultMessage()!=null){
baseErrorMessage=baseErrorMessage+":"+error.getDefaultMessage();
result.setMessage(baseErrorMessage);
}
}
return result;
}
public static Result<?> failed(String message) {
return new Result<>(ResultEnum.COMMON_FAILED.getCode(), message, null);
}
public static Result<?> failed(IResult errorResult) {
return new Result<>(errorResult.getCode(), errorResult.getMessage(), null);
}
public static <T> Result<T> instance(Integer code, String message, T data) {
Result<T> result = new Result<>();
result.setCode(code);
result.setMessage(message);
result.setData(data);
return result;
}
}

@ -0,0 +1,38 @@
package com.rehome.mqttclienttemperature.response;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
//常用结果的枚举
public enum ResultEnum implements IResult {
SUCCESS(2001, "接口调用成功"),
VALIDATE_FAILED(2002, "参数校验失败"),
COMMON_FAILED(2003, "接口调用失败"),
FORBIDDEN(2004, "没有权限访问资源"),
REQUEST_PARAM_VALIDATED_FAILED(2005, "请求参数校验失败");
private Integer code;
private String message;
@Override
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
//省略get、set方法和构造方法
}

@ -1,6 +1,15 @@
package com.rehome.mqttclienttemperature.service; package com.rehome.mqttclienttemperature.service;
import com.rehome.mqttclienttemperature.entity.Temperature;
import org.springframework.data.domain.Sort;
import java.util.List;
public interface TemperatureService { public interface TemperatureService {
//温度和湿度 //温度和湿度
void saveTemperature(String temperatureAndHumidityData,String topic); void saveTemperature(String temperatureAndHumidityData,String topic);
List<Temperature> findFirst10ByDataDateAndLocationDesc(String dataDate, String locationDesc);
List<Temperature> findFirst10ByLocationDesc(String locationDesc);
Temperature findFirstByOrderByLocationDescAsc(String locationDesc);
List<Temperature> queryFirst10ByDataDateAndLocationDesc(String dataDate, String locationDesc);
} }

@ -3,11 +3,18 @@ package com.rehome.mqttclienttemperature.service.impl;
import com.rehome.mqttclienttemperature.dao.TemperatureRepository; import com.rehome.mqttclienttemperature.dao.TemperatureRepository;
import com.rehome.mqttclienttemperature.entity.Temperature; import com.rehome.mqttclienttemperature.entity.Temperature;
import com.rehome.mqttclienttemperature.service.TemperatureService; import com.rehome.mqttclienttemperature.service.TemperatureService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.Optional;
@Service @Service
public class TemperatureServiceImpl implements TemperatureService { public class TemperatureServiceImpl implements TemperatureService {
@ -50,4 +57,75 @@ public class TemperatureServiceImpl implements TemperatureService {
this.temperatureRepository.save(temperature); this.temperatureRepository.save(temperature);
} }
} }
@Override
public List<Temperature> findFirst10ByDataDateAndLocationDesc(String dataDate, String locationDesc) {
int page=1,size=10;
Sort sort = Sort.by(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(page, size, sort);
// userRepository.findALL(pageable);
// userRepository.findByUserName("testName", pageable);
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdfHour = new SimpleDateFormat("yyyy-MM-dd HH");
SimpleDateFormat sdfMinute = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String nowDate = sdf.format(now);
Optional<List<Temperature>> listResult = Optional.ofNullable(temperatureRepository.findFirst10ByDataDateAndLocationDesc(dataDate, locationDesc, sort));
if(listResult.isPresent()){
return listResult.get();
}
return new ArrayList<>();
}
@Override
public List<Temperature> findFirst10ByLocationDesc(String locationDesc) {
int page=1,size=10;
Sort sort = Sort.by(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(page, size, sort);
// userRepository.findALL(pageable);
// userRepository.findByUserName("testName", pageable);
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdfHour = new SimpleDateFormat("yyyy-MM-dd HH");
SimpleDateFormat sdfMinute = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String nowDate = sdf.format(now);
Optional<List<Temperature>> listResult = Optional.ofNullable(temperatureRepository.findFirst10ByDataDateAndLocationDesc(nowDate, locationDesc, sort));
if(listResult.isPresent()){
return listResult.get();
}
return new ArrayList<>();
}
@Override
public Temperature findFirstByOrderByLocationDescAsc(String locationDesc) {
Optional<Temperature> temperatureResult = Optional.ofNullable(temperatureRepository.findFirstByOrderByDataDateDesc());
if(temperatureResult.isPresent()){
return temperatureResult.get();
}
return null;
}
@Override
public List<Temperature> queryFirst10ByDataDateAndLocationDesc(String dataDate, String locationDesc) {
int page=0,size=10;
Sort sort = Sort.by(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(page, size, sort);
Page<Temperature> listResult = temperatureRepository.queryFirst10ByDataDateAndLocationDesc(dataDate, locationDesc, pageable);
if(listResult.getTotalPages()>0){
return listResult.getContent();
}
return new ArrayList<>();
}
} }

@ -7,9 +7,9 @@ spring:
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=appserver;encrypt=false; # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=appserver;encrypt=false;
# username: sa # username: sa
# password: Skyinno251, # password: Skyinno251,
url: jdbc:mysql://127.0.0.1:3306/appserver?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true #url: jdbc:mysql://127.0.0.1:3306/appserver?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true
driverClassName: com.mysql.cj.jdbc.Driver #com.mysql.cj.jdbc.Driver com.mysql.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver #com.mysql.cj.jdbc.Driver com.mysql.jdbc.Driver
#url: jdbc:mysql://192.168.2.18:3306/appserver?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true url: jdbc:mysql://192.168.2.18:3306/appserver?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true
username: root username: root
password: Skyinno251, password: Skyinno251,
jpa: jpa:

Loading…
Cancel
Save