mybatis中返回HashMap,并在spring MVC中作为ModelAttribute使用

2023-12-24

我想使用 spring mvc @modelAttribute 在 Jsp 页面中显示类别列表。

在我的 mapper.xml 文件中是

<select id="selectAllCategories" resultMap="BaseResultMap">
  select id, name from categories  
</select>

在我的 Mapper.java 类中我有方法

List<Map<String, String>> selectAllCategories();

我想要一个这样的方法:

Map<Integer, String>`selectAllCategories();

代替List<Map<>>, 那可能吗?


你想得到一个Map<Integer,String>其中整数是id字符串是name。如果表中有 200 个类别,则您的地图中需要 200 个条目,而不是包含 200 个地图的列表。

MyBatis 不能直接做到这一点,但您可以使用它的设施来做到这一点。我看到两个选择。

选项1:

第一个不完全符合您的要求,但值得展示。它给你一个Map<Integer,Category>其中 Category 是类别表的域对象,具有 id、名称(以及类别表中可能的其他字段)。创建类别域对象后,在 MyBatis 中使用以下命令可以很容易地做到这一点:@MapKey注解:

@Select("SELECT id, name FROM categories")
@MapKey("id")
Map<Integer,Category> getAllCategories();

在您的代码中您将执行以下操作:

MyMapper mapper = session.getMapper(MyMapper.class);
Map<Integer,Category> m = mapper.getAllCategories();

这可能适用于您的用例,也可能不适用于您的用例,具体取决于您是否可以将名称提取为 Category 对象的属性。


选项2:

为了得到Map<Integer,String>你要求的,我知道的最简单的方法是创建一个实现 MyBatis 的类结果处理器 http://www.mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/session/ResultHandler.html界面。

您的 ResultHandler 将使用 MyBatis 创建的默认 hashmap(column-name => column-value)并创建单个主 Map。这是代码:

public class CategoryResultHandler implements ResultHandler {

  Map<Integer,String> inMap = new HashMap<Integer,String>(); 

  public Map<Integer, String> getIdNameMap() {
    return inMap;
  }

  @Override
  public void handleResult(ResultContext rc) {
    @SuppressWarnings("unchecked")
    Map<String,Object> m = (Map<String,Object>)rc.getResultObject();
    inMap.put((Integer)getFromMap(m, "id"), 
              (String)getFromMap(m, "name"));
  }

  // see note at bottom of answer as to why I include this method
  private Object getFromMap(Map<String, Object> map, String key) {
    if (map.containsKey(key.toLowerCase())) {
      return map.get(key.toLowerCase());
    } else {
      return map.get(key.toUpperCase());
    }
  }
}

类别表中的每行都会调用一次handleResult 方法。您告诉 MyBatis 使用 ResultHandler,然后像这样提取您的主映射:

CategoryResultHandler rh = new CategoryResultHandler();
session.select("getAllCategories", rh);
Map<Integer,String> m = rh.getIdNameMap();

这两者之一应该适合你。

最后一些注意事项:

  1. 为什么我包括getFromMap()辅助方法?因为你不能总是控制MyBatis返回的hashmap中列名的大小写。更多详细信息请参见此处:mybatis-3.1.1。如何覆盖mybatis返回的resultmap https://stackoverflow.com/questions/11720856/mybatis-3-1-1-how-to-override-the-resultmap-returned-from-mybatis/11732674#11732674

  2. 我在 mybatis-koans 的 Koan26 中有这些解决方案的工作示例(我根据您的问题添加了它):https://github.com/midpeter444/mybatis-koans https://github.com/midpeter444/mybatis-koans

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis中返回HashMap,并在spring MVC中作为ModelAttribute使用 的相关文章

随机推荐

  • 如何登录 postgresql 数据库 - 会话终止后(用于复制数据库)

    我尝试使用 postgresql 服务器在同一服务器中复制数据库 我尝试了以下查询 CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser 并得到以下错误 ERROR sour
  • Ruby on Rails:从数据库列获取最大值

    目前我可以在我的数据库上进行直接的 SQL 查询 SELECT MAX bar FROM table name 它返回该表中的最大值 然而 当我在 Rails 中进行我认为等效的调用时 它不起作用 我正在打电话 Bar all select
  • 如何使用 ts-loader 忽略 webpack 中的测试文件

    我有一个项目 使用 jest 和 ts jest 运行名为 test ts 的测试文件 这很好 但是当我启动 webpack 时 测试文件出现错误 ERROR in some path note test ts 27 3 error TS2
  • 使用 ctypes 和 Windll 的带有图标的 Python MessageBox

    因此 我正在寻找一种仅使用本机库在 Python 中创建简单消息框的方法 并遇到了几篇文章 但即this one https stackoverflow com questions 2963263 how can i create a si
  • 检测 PATH 中是否有特定的目录条目

    With bin bash 我如何检测用户的 PATH 变量中是否有特定目录 例如 if p HOME bin then echo Your path is missing bin you might want to add it else
  • 如何设置 databinder 调度以在 Eclipse 中使用?

    我想在Scala中编写一些简单的HTTP请求 但是Databinder Dispatch库只有sbt的指令 由于我是 Eclipse 的相对新手 有人可以提供有关如何在 Eclipse 中的 Scala 项目中使用它的说明吗 我正在使用 S
  • 默认时间戳显示 oracle 中的本地时间

    我创建了一个带有created time 列的表 该表的默认时间为systimestamp 当我向其中插入一行时 时间显示的是我的当地时间 23 02 18 08 49 05 430419000 上午 但是当我查询 select sysst
  • Windows Phone 7:如何打开网络浏览器?

    如何在 Windows Phone 7 中打开 Web 浏览器 我不在乎它是默认浏览器还是嵌入式浏览器 但如果两者都可能 我想知道 Windows Phone 论坛 gt Windows Phone 7 gt 打开网络浏览器 http so
  • 如何更改 unordered_map 中的键?

    我需要使用平均支持恒定时间查找的数据结构 我认为使用std unordered map是一个好方法 我的数据是数字的 集合 115 190 380 265 这些数字不必按特定顺序排列 我需要有关于O 1 确定该数据结构中是否存在给定数字的时
  • 如何在 Laravel 中启用错误报告?

    我正在使用 Laravel 5 2 我正在尝试导入包含超过 18000 条记录的 Excel 工作表 出现了下面的错误 本地主机页面无法正常工作 localhost is currently unable to handle this re
  • Terminfo smkx 和应用程序光标键与应用程序键盘

    XTerm 控制序列 http invisible island net xterm ctlseqs ctlseqs html指定以下按键序列 CSI 1 h Application Cursor Keys DECCKM CSI 1 l N
  • 如何判断 AVAudioPlayer 已经播放完毕

    我正在开发一个使用以下方式播放声音的应用程序AVAudioPlayer 我想知道声音何时播放完毕 我想在声音停止播放时更改图像 这是我用来创建播放器的代码 NSURL url NSBundle mainBundle URLForResour
  • 显示带有键类型和引用的 MYSQL 表列

    我需要一个查询 INFORMATION SCHEMA 它将针对给定的模式和表名称向我显示具有以下属性的所有表列 它是什么键类型 PK gt 主键 UQ gt 唯一键 FK gt 外键 什么是键名称 如果是外键 则引用 schema tabl
  • 具有 ModelIO 的混合拓扑(四路/三路)

    我正在使用 ModelIO 导入一些简单的 OBJ 资源 如下所示 let mdlAsset MDLAsset url url vertexDescriptor nil bufferAllocator nil preserveTopolog
  • Windows 上的通用 ctag

    我是 ctags 新手 在阅读了有关该程序的一些信息后 我得出的结论是 Universal ctags 是最新版本 exhuberant ctags 的后继者 并且仍在积极开发中 https ctags io https ctags io
  • JAXB 编组声明的父类与实际运行时子类

    我正在使用 JAXB 来编组一个类 该类具有声明为类 Foo 的实例变量 在运行时 该实例变量被设置为 Foo 子类的实例 比如说 FooBar 类 Foo 和 FooBar 上都有基本的 JAXB 注释 XML 输出显示正在封送 Foo
  • 设置 PHP 的默认时区

    在我的网络应用程序中 我让用户从列表中选择他们喜欢的时区 其中包含PHP 支持的所有时区 http www php net manual en timezones php 这么说吧 POST timezone 是所选时区 e g Ameri
  • 如何向 topojson 文件添加属性?

    给定一个 data tsv 文件 例如 id code name 1 AL Alabama 2 AK Alaska 4 AZ Arizona 5 AR Arkansas 6 CA California 给定一个 topojson json
  • Google 脚本中的字符串以以下开头

    我正在为我们正在进行的一些选举编写数据转换脚本 第一部分将所有名称更改为大写 这部分脚本工作正常 但是 我对脚本的第二部分有疑问 有些 ID 会有 S S123456 有些则没有 S 123456 出于我的目的 我需要所有 ID 开头都没有
  • mybatis中返回HashMap,并在spring MVC中作为ModelAttribute使用

    我想使用 spring mvc modelAttribute 在 Jsp 页面中显示类别列表 在我的 mapper xml 文件中是