pom.xml
@@ -38,7 +38,7 @@ <maven-shared-incremental.version>1.1</maven-shared-incremental.version> <spring-web.version>4.1.6.RELEASE</spring-web.version> <com.alibaba.druid.version>1.1.5</com.alibaba.druid.version> <org.mybatis-plus.spring.boot.version>3.4.1</org.mybatis-plus.spring.boot.version> <org.mybatis-plus.spring.boot.version>3.4.3.1</org.mybatis-plus.spring.boot.version> <org.projectlombok.version>1.16.18</org.projectlombok.version> <io.springfox.version>2.7.0</io.springfox.version> <swagger-bootstrap-ui.version>1.9.6</swagger-bootstrap-ui.version> screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java
@@ -1,9 +1,18 @@ package com.moral.api.config.mybatis; import com.baomidou.mybatisplus.core.parser.ISqlParser; import com.baomidou.mybatisplus.extension.parsers.DynamicTableNameParser; import com.baomidou.mybatisplus.extension.parsers.ITableNameHandler; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler; import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; import org.apache.ibatis.reflection.MetaObject; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.text.SimpleDateFormat; import java.util.*; @Configuration @@ -14,8 +23,30 @@ */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor page = new PaginationInterceptor(); return page; PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); return paginationInterceptor; } /** * @Description: 设置动态表名 * @Param: [] * @return: com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor * @Author: 陈凯裕 * @Date: 2021/7/15 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor(); HashMap<String, TableNameHandler> map = new HashMap<String, TableNameHandler>(); map.put("history_five_minutely",(sql,tableName)->{ Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM"); String month = sdf.format(date); return tableName+"_"+month;}); dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map); interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor); return interceptor; } screen-api/src/main/java/com/moral/api/controller/DeviceController.java
@@ -39,9 +39,5 @@ return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(), vo); } @GetMapping("queryFiveMinuteData") public ResultMessage queryFiveMinuteData(Integer regionCode,String sensorCode){ return null; } } screen-api/src/main/java/com/moral/api/controller/HistoryFiveMinutelyController.java
New file @@ -0,0 +1,54 @@ package com.moral.api.controller; import com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO; import com.moral.api.pojo.form.historyFiveMinutely.QueryDeviceAndFiveMinuteDataForm; import com.moral.api.pojo.vo.historyFiveMinutely.DeviceAndFiveMinuteDataVO; import com.moral.api.service.HistoryFiveMinutelyService; import com.moral.constant.ResponseCodeEnum; import com.moral.constant.ResultMessage; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * @ClassName HistoryFiveMinutely * @Description TODO * @Author 陈凯裕 * @Date 2021/7/15 16:42 * @Version TODO **/ @Slf4j @Api(tags = {"五分钟数据控制器"}) @RestController @CrossOrigin(origins = "*", maxAge = 3600) @RequestMapping("/historyFiveMinutely") public class HistoryFiveMinutelyController { @Autowired HistoryFiveMinutelyService historyFiveMinutelyService; @GetMapping("queryDeviceAndData") public ResultMessage queryDeviceAndData(QueryDeviceAndFiveMinuteDataForm form){ //18 110100 //判断是否缺少参数 if (!form.valid()) return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //处理查询业务 List<DeviceAndFiveMinuteDataDTO> dto = historyFiveMinutelyService.queryDeviceAndFiveMinuteData(form); //转换前端参数 DeviceAndFiveMinuteDataVO vo = DeviceAndFiveMinuteDataVO.convert(dto); return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(), vo); } } screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java
@@ -3,6 +3,7 @@ import com.moral.api.entity.MonitorPoint; import com.moral.api.pojo.form.device.MonitorPointQueryForm; import com.moral.api.pojo.vo.monitorPoint.MonitorPointsVO; import com.moral.api.pojo.vo.monitorPoint.StateControllerStationVO; import com.moral.api.service.MonitorPointService; import com.moral.api.service.OrganizationService; import com.moral.constant.ResponseCodeEnum; @@ -41,7 +42,7 @@ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //处理查询业务 List<MonitorPoint> monitorPoints = monitorPointService.query(form); List<MonitorPoint> monitorPoints = monitorPointService.queryByOrgIdAndRegionCode(form); //转换前端参数 MonitorPointsVO vo = MonitorPointsVO.convert(monitorPoints); @@ -49,5 +50,16 @@ return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(), vo); } @GetMapping("queryStateControlStation") public ResultMessage queryStateControlStation(Integer regionCode){ List<MonitorPoint> monitorPoints = monitorPointService.queryStateControlStationByRegionCode(regionCode); //转换前端所需参数 StateControllerStationVO vo = StateControllerStationVO.convert(monitorPoints); return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(),vo); } } screen-api/src/main/java/com/moral/api/controller/TestController.java
@@ -1,8 +1,12 @@ package com.moral.api.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.moral.api.entity.HistoryFiveMinutely; import com.moral.api.entity.Test; import com.moral.api.mapper.HistoryFiveMinutelyMapper; import com.moral.api.service.TestService; import com.moral.constant.Constants; import com.moral.constant.ResultMessage; import com.moral.redis.RedisUtil; import com.moral.util.PageResult; @@ -11,6 +15,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.web.bind.annotation.*; import java.util.List; @Slf4j @@ -24,6 +30,9 @@ @Autowired private TestService testService; @Autowired private HistoryFiveMinutelyMapper historyFiveMinutelyMapper; /** * name 姓名 * email 郵箱 @@ -96,4 +105,10 @@ kafkaTemplate.send("test_topic","test111111111111111"); } @GetMapping("test") public void test(){ QueryWrapper<HistoryFiveMinutely> queryWrapper = new QueryWrapper<>(); List<HistoryFiveMinutely> historyFiveMinutelies = historyFiveMinutelyMapper.selectList(queryWrapper); System.out.println(1111); } } screen-api/src/main/java/com/moral/api/entity/HistoryFiveMinutely.java
New file @@ -0,0 +1,41 @@ package com.moral.api.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import java.time.LocalDateTime; import java.io.Serializable; import java.util.Date; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * 5分钟数据表 * </p> * * @author moral * @since 2021-07-15 */ @Data @EqualsAndHashCode(callSuper = false) public class HistoryFiveMinutely extends Model<HistoryFiveMinutely> { /** * 设备mac */ private String mac; /** * 数据时间 */ private Date time; /** * 数据 */ private String value; } screen-api/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java
New file @@ -0,0 +1,16 @@ package com.moral.api.mapper; import com.moral.api.entity.HistoryFiveMinutely; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 5分钟数据表 Mapper 接口 * </p> * * @author moral * @since 2021-07-15 */ public interface HistoryFiveMinutelyMapper extends BaseMapper<HistoryFiveMinutely> { } screen-api/src/main/java/com/moral/api/pojo/dto/historyFiveMinutely/DeviceAndFiveMinuteDataDTO.java
New file @@ -0,0 +1,29 @@ package com.moral.api.pojo.dto.historyFiveMinutely; import com.moral.api.entity.Device; import com.moral.api.entity.HistoryFiveMinutely; import lombok.Data; import java.util.Map; /** * @ClassName DeviceAndFiveMinuteDataDTO * @Description TODO * @Author 陈凯裕 * @Date 2021/7/16 9:24 * @Version TODO **/ @Data public class DeviceAndFiveMinuteDataDTO { /* * 设备信息 * */ private Device device; /* * 对应因子数据 * */ private Map<String,Object> sensorValue; } screen-api/src/main/java/com/moral/api/pojo/form/device/MonitorPointQueryForm.java
@@ -1,5 +1,6 @@ package com.moral.api.pojo.form.device; import lombok.AllArgsConstructor; import lombok.Data; import org.springframework.util.ObjectUtils; @@ -11,6 +12,7 @@ * @Version TODO **/ @Data @AllArgsConstructor public class MonitorPointQueryForm { /* * 组织id screen-api/src/main/java/com/moral/api/pojo/form/historyFiveMinutely/QueryDeviceAndFiveMinuteDataForm.java
New file @@ -0,0 +1,29 @@ package com.moral.api.pojo.form.historyFiveMinutely; import lombok.Data; import org.springframework.util.ObjectUtils; /** * @ClassName QueryFiveMinuteData * @Description TODO * @Author 陈凯裕 * @Date 2021/7/15 16:46 * @Version TODO **/ @Data public class QueryDeviceAndFiveMinuteDataForm { private Integer organizationId; private Integer regionCode; private String sensorCode; public boolean valid(){ if(ObjectUtils.isEmpty(organizationId)|| ObjectUtils.isEmpty(regionCode)|| ObjectUtils.isEmpty(sensorCode)) return false; return true; } } screen-api/src/main/java/com/moral/api/pojo/vo/historyFiveMinutely/DeviceAndFiveMinuteDataVO.java
New file @@ -0,0 +1,41 @@ package com.moral.api.pojo.vo.historyFiveMinutely; import com.moral.api.entity.Device; import com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO; import lombok.AllArgsConstructor; import lombok.Data; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @ClassName DeviceAndFiveMinuteDataVO * @Description TODO * @Author 陈凯裕 * @Date 2021/7/16 11:17 * @Version TODO **/ @Data @AllArgsConstructor public class DeviceAndFiveMinuteDataVO { private List<Map<String, Object>> devices; public static DeviceAndFiveMinuteDataVO convert(List<DeviceAndFiveMinuteDataDTO> dtos) { List<Map<String, Object>> devices = new ArrayList<>(); for (DeviceAndFiveMinuteDataDTO dto : dtos) { Device device = dto.getDevice(); Map<String, Object> sensorValue = dto.getSensorValue(); Map<String, Object> deviceValue = new HashMap<>(); deviceValue.put("latitude",device.getLatitude()); deviceValue.put("longitude",device.getLongitude()); deviceValue.put("state",device.getState()); deviceValue.put("mac",device.getMac()); deviceValue.putAll(sensorValue); devices.add(deviceValue); } return new DeviceAndFiveMinuteDataVO(devices); } } screen-api/src/main/java/com/moral/api/pojo/vo/monitorPoint/StateControllerStationVO.java
New file @@ -0,0 +1,36 @@ package com.moral.api.pojo.vo.monitorPoint; import com.moral.api.entity.Device; import com.moral.api.entity.MonitorPoint; import com.moral.api.pojo.vo.device.DeviceVO; import lombok.Data; import java.util.ArrayList; import java.util.List; /** * @ClassName StateControllerStationVO * @Description TODO * @Author 陈凯裕 * @Date 2021/7/16 13:52 * @Version TODO **/ @Data public class StateControllerStationVO { private List<MonitorPointVO> stateControllerStations; public static StateControllerStationVO convert(List<MonitorPoint> monitorPoints){ StateControllerStationVO stateControllerStationVO = new StateControllerStationVO(); List<MonitorPointVO> stateControllerStations = new ArrayList<>(); for (MonitorPoint monitorPoint : monitorPoints) { MonitorPointVO monitorPointVO = new MonitorPointVO(); monitorPointVO.setName(monitorPoint.getName()); monitorPointVO.setLatitude(monitorPoint.getLatitude()); monitorPointVO.setLongitude(monitorPoint.getLongitude()); stateControllerStations.add(monitorPointVO); } stateControllerStationVO.setStateControllerStations(stateControllerStations); return stateControllerStationVO; } } screen-api/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java
New file @@ -0,0 +1,28 @@ package com.moral.api.service; import com.moral.api.entity.HistoryFiveMinutely; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO; import com.moral.api.pojo.form.historyFiveMinutely.QueryDeviceAndFiveMinuteDataForm; import java.util.List; /** * <p> * 5分钟数据表 服务类 * </p> * * @author moral * @since 2021-07-15 */ public interface HistoryFiveMinutelyService extends IService<HistoryFiveMinutely> { /** * @Description: 查询组织区域对应的设备以及对应因子的五分钟数据 * @Param: [form] * @return: java.util.List<com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO> * @Author: 陈凯裕 * @Date: 2021/7/16 */ List<DeviceAndFiveMinuteDataDTO> queryDeviceAndFiveMinuteData(QueryDeviceAndFiveMinuteDataForm form); } screen-api/src/main/java/com/moral/api/service/MonitorPointService.java
@@ -23,6 +23,15 @@ * @Author: 陈凯裕 * @Date: 2021/7/1 */ List<MonitorPoint> query(MonitorPointQueryForm form); List<MonitorPoint> queryByOrgIdAndRegionCode(MonitorPointQueryForm form); /** * @Description: 根据地区码查询国控站数据 * @Param: [regionCode] * @return: java.util.List<com.moral.api.entity.MonitorPoint> * @Author: 陈凯裕 * @Date: 2021/7/16 */ List<MonitorPoint> queryStateControlStationByRegionCode(Integer regionCode); } screen-api/src/main/java/com/moral/api/service/OrganizationService.java
@@ -23,4 +23,13 @@ * @Date: 2021/7/1 */ List<Organization> getChildrenOrganizationsById(Integer id); /** * @Description: 获取国控站组织 * @Param: [] * @return: com.moral.api.entity.Organization * @Author: 陈凯裕 * @Date: 2021/7/16 */ Organization getStateControlStation(); } screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
New file @@ -0,0 +1,72 @@ package com.moral.api.service.impl; import com.moral.api.entity.Device; import com.moral.api.entity.HistoryFiveMinutely; import com.moral.api.entity.MonitorPoint; import com.moral.api.mapper.HistoryFiveMinutelyMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO; import com.moral.api.pojo.form.device.MonitorPointQueryForm; import com.moral.api.pojo.form.historyFiveMinutely.QueryDeviceAndFiveMinuteDataForm; import com.moral.api.service.HistoryFiveMinutelyService; import com.moral.api.service.MonitorPointService; import com.moral.constant.RedisConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * <p> * 5分钟数据表 服务实现类 * </p> * * @author moral * @since 2021-07-15 */ @Service public class HistoryFiveMinutelyServiceImpl extends ServiceImpl<HistoryFiveMinutelyMapper, HistoryFiveMinutely> implements HistoryFiveMinutelyService { @Autowired MonitorPointService monitorPointService; @Autowired RedisTemplate redisTemplate; @Override public List<DeviceAndFiveMinuteDataDTO> queryDeviceAndFiveMinuteData(QueryDeviceAndFiveMinuteDataForm form) { //取参 Integer organizationId = form.getOrganizationId(); Integer regionCode = form.getRegionCode(); String sensorCode = form.getSensorCode(); //查询组织在对应地区下的站点以及设备 List<MonitorPoint> monitorPoints = monitorPointService.queryByOrgIdAndRegionCode(new MonitorPointQueryForm(organizationId, regionCode)); List<Device> devices = new ArrayList<>(); for (MonitorPoint monitorPoint : monitorPoints) { List<Device> monitorPointDevices = monitorPoint.getDevices(); if (!ObjectUtils.isEmpty(monitorPointDevices)) devices.addAll(monitorPointDevices); } //查询所有设备对应的数据 List<DeviceAndFiveMinuteDataDTO> dtos = new ArrayList<>(); for (Device device : devices) { DeviceAndFiveMinuteDataDTO dto = new DeviceAndFiveMinuteDataDTO(); String mac = device.getMac(); Map<String, Object> sensorValues = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DATA_FIVE_MINUTES, mac); Map<String,Object> value = new HashMap<>(); if (sensorValues!=null&&sensorValues.get(sensorCode) != null) value.put(sensorCode,sensorValues.get(sensorCode)); else value.put(sensorCode,null); dto.setDevice(device); dto.setSensorValue(value); dtos.add(dto); } return dtos; } } screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java
@@ -37,7 +37,7 @@ DeviceService deviceService; @Override public List<MonitorPoint> query(MonitorPointQueryForm form) { public List<MonitorPoint> queryByOrgIdAndRegionCode(MonitorPointQueryForm form) { //取参 Integer organizationId = form.getOrganizationId(); Integer regionCode = form.getRegionCode(); @@ -62,6 +62,18 @@ } return monitorPoints; } @Override public List<MonitorPoint> queryStateControlStationByRegionCode(Integer regionCode) { //获取国控站组织 Organization stateControlStationOrganization = organizationService.getStateControlStation(); //获取国控站组织下的所有站点 QueryWrapper<MonitorPoint> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("is_delete",Constants.NOT_DELETE); queryWrapper.eq("organization_id",stateControlStationOrganization.getId()); queryWrapper.eq(RegionCodeUtils.regionCodeConvertToName(regionCode),regionCode); return monitorPointMapper.selectList(queryWrapper); } } screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
@@ -34,6 +34,15 @@ return childrenOrganization; } @Override public Organization getStateControlStation() { QueryWrapper<Organization> wrapper = new QueryWrapper<>(); wrapper.eq("name","国控站"); wrapper.eq("is_delete",Constants.NOT_DELETE); Organization organization = organizationMapper.selectOne(wrapper); return organization; } /** * @Description: 通过父组织查询下面所有的子组织放到children中 * @Param: [parentId, children] screen-api/src/main/resources/application-local.yml
New file @@ -0,0 +1,120 @@ server: port: 8081 tomcat: uri-encoding: UTF-8 #最小线程数 min-spare-threads: 500 #最大线程数 max-threads: 2500 #最大链接数 max-connections: 6500 #最大等待队列长度 accept-count: 1000 spring: profiles: active: dev application: name: screen-manage redis: host: r-bp1xdlb9wfc6zt0msppd.redis.rds.aliyuncs.com port: 6379 password: moral_123456 timeout: 30000 jedis: pool: max-active: 256 max-wait: 30000 max-idle: 64 min-idle: 32 lettuce: pool: max-active: 256 max-idle: 64 max-wait: 30000 min-idle: 32 tokenRedis: host: r-bp1xdlb9wfc6zt0msppd.redis.rds.aliyuncs.com port: 6379 password: moral_123456 timeout: 30000 database: 15 pool: max-active: 256 max-wait: 30000 max-idle: 64 min-idle: 32 datasource: minIdle: 1 time-between-eviction-runs-millis: 60000 max-active: 20 test-while-idle: true validation-query: select 'x' filters: stat type: com.alibaba.druid.pool.DruidDataSource max-wait: 60000 url: jdbc:mysql://rm-bp1pr3rx9m3fnkwsk8o.mysql.rds.aliyuncs.com:3306/moral?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: moral_123456 test-on-borrow: false sql-script-encoding: utf-8 pool-prepared-statements: true min-evictable-idle-time-millis: 300000 initial-size: 1 driver-class-name: com.mysql.cj.jdbc.Driver max-conn-lifetime-millis: 20 test-on-return: false mybatis-plus: mapper-locations: classpath:mapper/*.xml global-config: db-config: id-type: auto field-strategy: NOT_EMPTY db-type: MYSQL configuration: map-underscore-to-camel-case: true call-setters-on-nulls: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl kafka: listener: ack-mode: manual_immediate consumer: auto: offset: reset: latest concurrency: 3 enable: auto: commit: false servers: 47.99.145.48:9092,47.111.116.38:9092,47.111.124.159:9092 session: timeout: 6000 zookeeper: connect: 47.99.145.48:2181,47.111.116.38:2181,47.111.124.159:2181 producer: batch: size: 4096 buffer: memory: 40960 linger: 1 retries: 0 servers: 47.99.145.48:9092,47.111.116.38:9092,47.111.124.159:9092 mvc: interceptor: exclude: - /login - /swagger-ui.html - /swagger-resources/** - /swagger-ui.html/** - /webjars/** - /verificationCode/** AES: KEY: AD42F7787B035B7580000EF93BE20BAD TOKEN: KEY: foh3wi2ooghiCh5 screen-api/src/main/resources/mapper/HistoryFiveMinutely202107Mapper.xml
New file @@ -0,0 +1,12 @@ <?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.moral.api.mapper.HistoryFiveMinutely202107Mapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.HistoryFiveMinutely"> <result column="mac" property="mac" /> <result column="time" property="time" /> <result column="value" property="value" /> </resultMap> </mapper>