MyBatis将查询出的两列数据装配成键值对的操作方法

目录
  • 描述:
  • 操作:
    • 1. 实现 ResultHandler 接口
    • 2. 对应 DAO 层
    • 3. 使用

描述:

MyBatis 直接查询出的格式是 List 套 Map 的结构,当然利用 Stream 流进行转换也非常便捷,但如果这样的操作很多的话,不如利用 MyBatis 提供的 ResultHandler 接口进行实现,做成工具类使用。

此外,如果用 MyBatis 提供的 @MapKey ,也只是对应值有冗余,因为 MapKey取一个字段为键,取出的所有字段为值。

操作:

1. 实现 ResultHandler 接口

/**
 * 用于MyBatis查询库表中两列映射为键值对
 */
@Component
public class MapResultHandler implements ResultHandler {

    private final HashMap mapResults = new HashMap<String,String>();

    private String key;

    private String value;

    @Override
    public void handleResult(ResultContext resultContext) {
        HashMap map = (HashMap)resultContext.getResultObject();
        mapResults.put(map.get("key"), map.get("value"));
    }

    /**
     * 返回映射
     * @return 结果
     */
    public HashMap getMapResults() {
        return mapResults;
    }

    /**
     * @param key key
     * @param value value
     */
    public MapResultHandler(String key, String value) {
        this.key = key;
        this.value = value;
    }

    /**
     * 空构造
     */
    public MapResultHandler() {
    }

}

2. 对应 DAO 层

对应 mapper 查询接口中,在查询的方法里将 ResultHandler 实现类(MapResultHandler)以参数形式传入。

由于使用实现类拿取装配好的Map,此处的返回类型为 void 。

 /**
     * 提取<图片名,创建时间>的Map,对应创建时间进行处理
     * @param imageLength 上传图片的个数
     * @return
     */
    void selectImageNameAndCreatetime(MapResultHandler mapResultHandler, int imageLength);

对应 xml 文件中,定义返回类型为 map 。

其中注意给我们需要的键值取别名,对应别名与 ResultHandler 实现类(MapResultHandler)中定义的相对应,这样在ResultHandler 实现类(MapResultHandler)中 map.get() 才能取到。

<select id="selectImageNameAndCreatetime" resultType="map">
    select name as 'key',time as 'value' from house_pic_info order by id desc limit #{imageLength}
</select>

3. 使用

先实例化 ResultHandler 实现类(MapResultHandler),作为参数传入。

取 Map 时依然从 ResultHandler 实现类(MapResultHandler)中取。

MapResultHandler handler = new MapResultHandler();
housePicInfoMapper.selectImageNameAndCreatetime(handler, length);
Map imageMap = handler.getMapResults();

思考:对应 ResultHandler 接口只需实现一个 handleResult 方法,在 MyBatis 中 @MapKey 的实现也应该是有对应实现。

/**
 * MyBatis 中 DefaultMapResultHandler 实现
 * @author Clinton Begin
 */
public class DefaultMapResultHandler<K, V> implements ResultHandler<V> {

  private final Map<K, V> mappedResults;
  private final String mapKey;
  private final ObjectFactory objectFactory;
  private final ObjectWrapperFactory objectWrapperFactory;
  private final ReflectorFactory reflectorFactory;

  @SuppressWarnings("unchecked")
  public DefaultMapResultHandler(String mapKey, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
    this.objectFactory = objectFactory;
    this.objectWrapperFactory = objectWrapperFactory;
    this.reflectorFactory = reflectorFactory;
    this.mappedResults = objectFactory.create(Map.class);
    this.mapKey = mapKey;
  }

  @Override
  public void handleResult(ResultContext<? extends V> context) {
    final V value = context.getResultObject();
    final MetaObject mo = MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory);
    // TODO is that assignment always true?
    final K key = (K) mo.getValue(mapKey);
    mappedResults.put(key, value);
  }

  public Map<K, V> getMappedResults() {
    return mappedResults;
  }
}

到此这篇关于MyBatis将查询出的两列数据装配成键值对的文章就介绍到这了,更多相关MyBatis查询数据装配成键值对内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis查询数据赋值到model里面为空的解决

    目录 查询数据赋值到model里为空 查询无数据的时候问题 查询数据赋值到model里为空 因为数据多所以在查询中使用分页,但是发现直接执行sql语句是可以获取到数据,而list里面却是空的 <select id="list" resultType="DaliyDO">         select a1.* from (             select                 id ,rownum             from dua

  • Mybatis结果生成键值对的实例代码

    下面给大家介绍下mybatis结果生成键值对的实例代码,具体内容如下所示: 在实际应用中我们经常会遇到这样的情况,需要给下拉框赋值,这个时候就需要键值对了,具体使用方法如下 1,在maper.xml文件中定义结果类型(resultType)定义为hashmap,如下所示 <select id="selectSuperUnitInfo" resultType="hashmap"> SELECT unit_id ,unit_name from unit_in

  • Mybatis-plus使用selectList查询数据为null的问题及解决办法

    目录 概述 原因 解决方案 概述 使用mybatis-plus的selectList查询数据封装进list 打印为null javaben和数据库字段也能对应上 原因 可以从图片看的出来  数据其实已经查询出来 三条数据 打印list集合 打印了三个null 说明数据没有封装进去 那就是javaben的问题 mybatis-plus默认开启了驼峰命名规则 而mybatis则默认没有开启 解决方案 方法一:可以使用@TableField注解,指定数据库表字段名: 方法二:在配置文件中配置mybai

  • MyBatis查询数据,赋值给List集合时,数据缺少的问题及解决

    目录 MyBatis查询数据赋值给List集合数据缺少 解决办法 Mybatis查询时数据丢失的问题 经过排查得出结论 解决办法 MyBatis查询数据赋值给List集合数据缺少 今天在使用MyBatis查询数据时,发现查出来的数据和List集合的大小不一致,如下图所示,Total为3,但是list集合size为2.   List<ArticleCommentToShow> commentsByArticleId = articleCommentService.getCommentsByArt

  • 一文教会你用mybatis查询数据库数据

    目录 一.新建数据库和表 二.新建maven项目,添加mybatis依赖 三.新建实体类.接口(Mapper) 四.新建实现类(使用.xml映射文件) 五.新建全局配置文件(mybatis-config.xml) 六.编写demo类,进行测试查询数据库 总结 一.新建数据库和表 建一个数据库mybatis,建一个表person,然后填充一些数据(这里我是使用了图形化工具Navicat for MySQL,就不写原生的数据库代码了) 二.新建maven项目,添加mybatis依赖 新建一个mave

  • MyBatis将查询出的两列数据装配成键值对的操作方法

    目录 描述: 操作: 1. 实现 ResultHandler 接口 2. 对应 DAO 层 3. 使用 描述: MyBatis 直接查询出的格式是 List 套 Map 的结构,当然利用 Stream 流进行转换也非常便捷,但如果这样的操作很多的话,不如利用 MyBatis 提供的 ResultHandler 接口进行实现,做成工具类使用. 此外,如果用 MyBatis 提供的 @MapKey ,也只是对应值有冗余,因为 MapKey取一个字段为键,取出的所有字段为值. 操作: 1. 实现 Re

  • 使用mybatis格式化查询出的日期

    mybatis格式化查询出的日期 1.格式符说明 %Y:年 示例:2019 %m:月 示例:08 %d:日 示例:05 %H:时 示例:15 %I:分 示例:47 %S:秒 示例:56 2.使用示例 DATE_FORMAT(NOW(),'%Y-%m-%d %H:%I:%S') 格式化Mybatis返回的Date时间 在实体类的日期属性上添加 @JsonFormat和@DateTimeFormat注解. import java.util.Date; public class Test { @Dat

  • mysql 实现互换表中两列数据方法简单实例

    由于最近项目,有这样一个需求,是把数据库中的两列数据互换,经过好久才搞定,这里写个简单实例,做过记录. 1.创建表及记录用于测试 CREATE TABLE `product` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '产品id', `name` varchar(50) NOT NULL COMMENT '产品名称', `original_price` decimal(5,2) unsigned NOT NULL COMMEN

  • pandas 使用apply同时处理两列数据的方法

    多的不说,看了代码就懂了! df = pd.DataFrame ({'a' : np.random.randn(6), 'b' : ['foo', 'bar'] * 3, 'c' : np.random.randn(6)}) def my_test(a, b): return a + b df['Value'] = df.apply(lambda row: my_test(row['a'], row['c']), axis=1) print df 以上这篇pandas 使用apply同时处理两列

  • R语言实现用cbind合并两列数据

    我有两个数据文件,分别只有一列,这两列数据行数一行,我想把这两列合并到一个数据文件中,方便使用. 我的两个数据文件分别是1.txt,2.txt,保存后的文件名是3.txt. // 代码如下 gow1<-read.table("1.txt",header = FALSE) gow2<-read.table("2.txt",header = FALSE) View(gow1) View(gow2) gow<-cbind(gow1,gow2) View(

  • 详解Pandas如何高效对比处理DataFrame的两列数据

    目录 楔子 combine_first combine update 楔子 我们在用 pandas 处理数据的时候,经常会遇到用其中一列数据替换另一列数据的场景.比如 A 列和 B 列,对 A 列中不为空的数据不作处理,对 A 列中为空的数据使用 B 列对应索引的数据进行替换.这一类的需求估计很多人都遇到,当然还有其它更复杂的. 解决这类需求的办法有很多,这里我们来推荐几个. combine_first 这个方法是专门用来针对空值处理的,我们来看一下用法. import pandas as pd

  • pandas 实现将两列中的较大值组成新的一列

    最近一个开发需求中要求用pandas实现该需求: 逐行对比两列,选出每行两列中较大的值加到第三列 翻了下好像没有类似的函数,所以没办法要自己造轮子,直接上代码和注释 # 需要对比的值为value_x和value_y # 新家的列名为value_final # 1.设置一个flag,值为value_y-value_x,为正代表y较大,负代表x较大 df_test['value_flag'] = df_test['Value_y'] - df_test['Value_x'] # 2.分别取得y较大的

  • 在sql中对两列数据进行运算作为新的列操作

    如下所示: select a1,a2,a1+a2 a,a1*a2 b,a1*1.0/a2 c from bb_sb 把a表的a1,a2列相加作为新列a,把a1,a2相乘作为新列b,注意: 相除的时候得进行类型转换处理,否则结果为0. select a.a1,b.b1,a.a1+b.b1 a from bb_sb a ,bb_cywzbrzb b 这是两个不同表之间的列进行运算. 补充知识:Sql语句实现不同记录同一属性列的差值计算 所使用的表的具体结构如下图所示 Table中主键是(plateN

  • pandas将DataFrame的几列数据合并成为一列

    目录 1.1 方法归纳 1.2 .str.cat函数详解 1.2.1 语法格式: 1.2.2 参数说明: 1.2.3 核心功能: 1.2.4 常见范例: 1.1 方法归纳 使用 + 直接将多列合并为一列(合并列较少): 使用pandas.Series.str.cat方法,将多列合并为一列(合并列较多): 范例如下: dataframe["newColumn"] = dataframe["age"].map(str) + dataframe["phone&q

  • postgresql数据库根据年月查询出本月的所有数据操作

    表里的所有数据: 现在我要根据创建时间的 年月查询 当月所有的数据 比如前台传给我一个年月的字段planTimeMonth,值为2018-06 那么我们需要查询创建时间为6月份的所有数据 sql: java代码中sql拼接: criteria.andCondition("to_char(crt_time, 'yyyy-mm')='"+query.get("planTimeMonth").toString()+"'"); 补充:postgresql

随机推荐