springBoot集成mybatis使用ResultHandler返回map数据类型

您所在的位置:网站首页 mapper返回类型 springBoot集成mybatis使用ResultHandler返回map数据类型

springBoot集成mybatis使用ResultHandler返回map数据类型

2023-12-22 01:37| 来源: 网络整理| 查看: 265

在 springBoot 的 web 项目中,平时查询数据返回都是:集合 list 、实体类 bean 、数量 int / long 。如果返回 map ,也是Map或Map,直接返回Map或Map会报错,通过查询得知,可以使用 ResultHandler 实现。 ResultHandler,对返回的结果进行处理,最终得到自己想要的数据格式或类型。就是说,可以自定义返回类型。

参考

mybatis之ResultHandler如何使用 Spring Boot 下 MyBatis 的几种使用方式 mybatis中resulthandler的用法 Mybatis源码分析:MapperMethod中内部静态类MethodSignature的作用 springboot整合Mybatis 之 创建对象SqlSessionFactory和SqlSession(一) Mybatis select返回值为map时,选取表字段的两列作为key,value mybatis 中的 ResultHandler(传入map返回map) MyBatis 核心配置综述之 ResultSetHandler

操作 代码 pom 1.8 UTF-8 UTF-8 2.3.1.RELEASE org.springframework.boot spring-boot-starter-web cn.hutool hutool-core 5.3.8 cn.hutool hutool-crypto 5.3.8 org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.3 mysql mysql-connector-java org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import 配置 server: port: 8080 spring: datasource: password: 'xxxxxx' username: 'root' driver-class-name: com.mysql.cj.jdbc.Driver url: 'jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai' jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: xx.xxx.pojo configuration: map-underscore-to-camel-case: true #使用驼峰命名法转换字段 java

启动类增加mybatis的扫描注解@MapperScan(basePackages = "xx.xxx.dao")

controller

import xx.xxx.common.MapResultHandler; import xx.xxx.dao.DicTypeDao; import xx.xxx.pojo.DicType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.util.List; import java.util.Map; /** * 测试数据接口 * * @author z.y.l * @version v1.0 * @date 2020-09-10 */ @Controller @RequestMapping("/db") public class TestDbController { private final Logger logger = LoggerFactory.getLogger(TestDbController.class); @Resource private DicTypeDao dicTypeDao; @RequestMapping("") @ResponseBody public String root(){ return "Hello Spring Boot DB demo."; } @RequestMapping("/all") @ResponseBody public List all(){ logger.info("查询 全部 数据"); return dicTypeDao.selectAll(); } @RequestMapping("/map") @ResponseBody public Map map(){ logger.info("查询 全部 数据"); MapResultHandler handler = new MapResultHandler("DIC_TYPE","DIC_NAME"); dicTypeDao.selectMap(handler); Map map = handler.getResultMap(); logger.info("map >> {}",map); return map; } }

dao

import xx.xxx.DicType; import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.ResultType; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.session.ResultHandler; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Map; /** * DicTypeDao 接口说明: * * @author z.y.l * @version v1.0 * @date 2022/10/9 */ @Mapper @Repository public interface DicTypeDao { /** * 查询全部 * @return 集合 */ List selectAll(); /** * 查询结果map * @param handler 自定义结果处理器 */ @ResultType(Map.class) @Select("select DIC_TYPE, DIC_NAME from test.dic_type_b") void selectMap(ResultHandler handler); }

测试表

import java.util.Date; /** * 字典类型表 * * CREATE TABLE `dic_type_b` ( * `ID` int NOT NULL COMMENT '主键', * `DIC_TYPE` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', * `DIC_NAME` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型名称', * `VALID` varchar(2) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '有效标志', * `MEMO` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型说明', * `CREATE_TIME` datetime DEFAULT NULL COMMENT '新增时间', * `UPDATE_TIME` datetime DEFAULT NULL COMMENT '修改时间', * `VERSION` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '版本', * PRIMARY KEY (`ID`) * ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典类型表'; * * @author z.y.l * @version v1.0 * @date 2022/10/9 */ public class DicType { private Integer id; private String dicType; private String dicName; private String valid; private String memo; private Date createTime; private Date updateTime; private String version; set... get... }

mapper

DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> select ID, DIC_TYPE, DIC_NAME,VALID,MEMO,CREATE_TIME,UPDATE_TIME,VERSION from test.dic_type_b 自定义ResultHandler import org.apache.ibatis.session.ResultContext; import org.apache.ibatis.session.ResultHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; /** * mybatis 返回 map 结果处理器 * * @author z.y.l * @version v1.0 * @date 2022/10/9 */ public class MapResultHandler implements ResultHandler { private final Logger logger = LoggerFactory.getLogger(MapResultHandler.class); private final Map resultMap = new HashMap(); private final String key,val; @Override public void handleResult(ResultContext resultContext) { Map map = resultContext.getResultObject(); logger.debug("自定义查询处理器-行-map,{}",map); Object value = map.get(key); if (null != value && !resultMap.containsKey(value.toString())) { resultMap.put(map.get(key).toString(),map.get(val)); }else{ logger.debug("自定义查询处理器-行异常-map,{}",value); } } public MapResultHandler(String key,String val){ this.key = key; this.val = val; } public Map getResultMap() { return resultMap; } } 测试

访问:http://localhost:8080/db/map 在这里插入图片描述

{ "STATUS": "状态", "GEND": "性别", "TYPE": "类型" }

日志

TestDbController [TestDbController.java:46] =.= map >> {STATUS=状态, GEND=性别, TYPE=类型} 其他

通过查询的网络文章得知,执行自定义ResultHandler的代码位置。org.apache.ibatis.binding.MapperMethod类方法

public Object execute(SqlSession sqlSession, Object[] args) { Object result; switch (command.getType()) { case INSERT: { Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult(sqlSession.insert(command.getName(), param)); break; } case UPDATE: { Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult(sqlSession.update(command.getName(), param)); break; } case DELETE: { Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult(sqlSession.delete(command.getName(), param)); break; } case SELECT: // 查询的处理 if (method.returnsVoid() && method.hasResultHandler()) { // 只有符合这个判断的才能使用自定义ResultHandler // 方法返回void,并且 入参含 ResultHandler 实现 executeWithResultHandler(sqlSession, args); result = null; } else if (method.returnsMany()) { result = executeForMany(sqlSession, args); } else if (method.returnsMap()) { result = executeForMap(sqlSession, args); } else if (method.returnsCursor()) { result = executeForCursor(sqlSession, args); } else { Object param = method.convertArgsToSqlCommandParam(args); result = sqlSession.selectOne(command.getName(), param); if (method.returnsOptional() && (result == null || !method.getReturnType().equals(result.getClass()))) { result = Optional.ofNullable(result); } } break; case FLUSH: result = sqlSession.flushStatements(); break; default: throw new BindingException("Unknown execution method for: " + command.getName()); } if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) { throw new BindingException("Mapper method '" + command.getName() + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ")."); } return result; } 自定义 DefaultSqlSession 未成功实现

再看了 mybatis 的查询返回 map 源码(太菜买看完),如果要想通过扩展 mybatis 来支持Map ,但是因为部分核心bean(org.apache.ibatis.mapping.ResultMap)不太好处理内部字段,故放弃。 本标题只做记录,可以不用看。 重写的类有: org.apache.ibatis.session.defaults.DefaultSqlSessionFactory方法SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit); org.apache.ibatis.session.defaults.DefaultSqlSessio方法SqlSession Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds); org.apache.ibatis.executor.result.DefaultMapResultHandler方法void handleResult(ResultContext



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3