嵌套 mybatis 映射

2024-02-16

我不知道如何在复杂的对象中使用 mybatis 结果。

我有以下映射器类:

public interface StationMapper {
   @MapKey("stationId")
   Map<Integer,Station> getStations();
}

它是根据以下 resultMap 构建的:

<resultMap id="stationMap" type="Station">
   <result column="station_id" property="stationId" />
   <result column="another_id" property="notUniqueId" />
   <result column="name" property="name" />
</resultMap>

我希望 getStations() 的返回类型不是地图,而是一个将地图(或集合)作为构造函数的对象,以便我可以在对象构造上执行一些代码。

public class FancyStationMapHolder {
   public FancyStationMapHolder(Map<Integer,Station> stations) {
      executeSpecialCode(stations);
   }
   // OR
   public FancyStationMapHolder(Collection<Station> stations) {
      executeSpecialCode(stations);
   }
}
public interface StationMapper {
   FancyStationMapHolder getStations();
}

我认为我不能使用 元素(我已经尝试过),因为没有实际的数据关系。

或者,我想要一个具有以下签名的 StationMapper 方法:

@MapKey("notUniqueId")
Map<String,Collection<Station>> getStationsByNotUniqueId();

Edit:如果我根据某些列限制它并设置属性而不是使用构造函数,我可以得到这个复杂的对象,但是在没有关系限制的情况下如何才能做到这一点呢?

<resultMap id="fancyMap" type="sample.FancyStationMapHolder">
  <result column="someId" property="someId"/>
  <collection property="stations" column="someId" resultMap="stationMap"
   select="stations" javaType="ArrayList" />
</resultMap>

我更喜欢使用构造函数,所以我也很感激对此的建议。以下设置会导致此异常:

 org.mybatis.spring.MyBatisSystemException:
 nested exception is org.apache.ibatis.reflection.ReflectionException:
 Error instantiating class sample.FancyStationMapHolder with invalid types
     (ArrayList,) or values ([...

<resultMap id="fancyMap" type="sample.FancyStationMapHolder">
  <constructor>
    <arg column="someId" resultMap="stationMap" select="stations"
         javaType="ArrayList" />
  </constructor>
  <result column="someId" property="someId"/>
</resultMap>

MyBatis 在将列映射到 POJO 属性方面做得很好,并且为更高级的映射做了一些额外的工作。但总的来说,我建议不要尝试通过 MyBatis 将业务逻辑放入映射/编组中。我自己走过了这条路,大部分都是从地图制作者那里得到了我需要的东西,但后来把它们全部删除了。

所以,只需得到List<Station>从您的映射器方法中将其转换为放置在需要这些东西的 DAO 或控制器或服务中的私有转换器方法中所需的模型。最好用至少一个抽象层来覆盖映射器,该抽象层将多个更新组合成单​​个事务、处理乐观锁、隐藏内部辅助容器、高级缓存逻辑等。

一个好处是,这样的代码将更容易维护,并且下一个开发人员不必深入研究 MyBatis 映射的特殊性。还有,抢List<Station>还允许将相同的查询重新用于其他目的,将其缓存得相当好等。

If List<Station>占用太多资源并且查询处于关键性能路径上,请使用 MyBatis ResultHandler 迭代 JDBS ResultSet。

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

嵌套 mybatis 映射 的相关文章

随机推荐

  • 部署在iis上的asp.net core应用遇到500内部服务器错误

    哎呀 500内部服务器错误 启动应用程序时发生错误 当我将数据库功能添加到我的 asp net core 应用程序并将其部署到 iis 时 出现此消息 当我在 Visual Studio 中开发它时 一切都很顺利 但是部署之后就出现了这个错
  • Django 迁移添加默认字段作为模型函数

    我向 Django 模型添加了一个新的 不可为空的字段 并尝试使用迁移来部署该更改 我如何将现有模型使用的默认值设置为这些模型的某个函数而不是常量 举个例子 假设我以前有一个created on字段 我刚刚添加了一个updated on我想
  • 如何创建纵轴(Y 轴)为字符串的图表?

    我想要制作的图表是使用 Chart js 制作的折线图 纵轴为字符串 横轴为数字 例如 横轴是时间 纵轴是帽子的颜色 见下图 var myChart new Chart ctx type line data labels 1 2 3 4 5
  • Gridview动态添加新行

    我有一个文件上传控件 并且有一个按钮 上传 因此当单击通风口触发时 我希望在 gridview 中创建一个新行并获取文件名并绑定到列并将其显示在页面上 请问有什么想法该怎么做吗 这是代码 protected void Button1 Cli
  • Android - 将对象传递给另一个活动

    我正在利用以下类 我将其作为对象 http pastebin com rKmtbDgF http pastebin com rKmtbDgF 我正在尝试使用以下方式传递它 Intent booklist new Intent getBase
  • JDK 1.8.0_92 Nashorn JS 引擎indexOf 行为

    我在 java8 中使用 nashorn javascript 引擎在运行时评估一些表达式 我有一个 util 类 方法如下 public static String evaluateJavaScriptExpression String
  • Android向viewpager添加了圆圈指示器[重复]

    这个问题在这里已经有答案了 您好 我创建了一个视图寻呼机 但有谁知道我如何在页面视图上显示代表分页的圆圈 我认为它提供了一个指示器 但我不完全确定 这是迄今为止包含我的视图寻呼机的代码 public class LevelSelect ex
  • TFS 与 VSTS 的未来

    微软还在开发这两种产品吗 TFS 的开发是否已被放弃而转而支持 VSTS 就上下文而言 我们现在正在使用 TFS 而 VSTS 显然具有更好的集成性 特别是 Microsoft Teams 和 ZenDesk 这对于让我们的工作流程处于更易
  • (Android)如何填充ListView背景并保持标题透明度

    我有一个自定义图像背景 它填充 ListView 后面的整个屏幕 ListView 有一个包含一些数据的标题 然后是一个透明的 10dp 边距 允许我们看到一点背景图像 然后是更多数据 在这个标题下方 在 ListView 的 主体 中 我
  • Laravel 4 查询生成器 - 具有复杂的左连接

    我是 Laravel 4 的新手 我有这样的疑问 SELECT a id active name email img location IFNULL b Total 0 AS LeadTotal IFNULL c Total 0 AS In
  • 使用新的用户名和密码更新 vsts-npm-auth

    我已经安装了vsts npm auth使用以下命令进行打包 npm install g vsts npm auth registry https registry npmjs com 我跑了vsts npm auth config npmr
  • Nuget 4安装在哪里

    Visual Studio 2017 附带 Nuget 4 0 0 但是 它没有放置在路径上 在哪里可以找到使用 CLI 的 nuget 可执行文件 视觉工作室 2017不使用NuGet exe而是使用扩展名NuGet为了达成这个 您应该能
  • 正则表达式解析CSS选择器

    我想解析这个 CSS 选择器 以及其他类似形式的选择器 div class1 myid class2 key value 并让它匹配 class1 和 class2 但我不知道要使用什么正则表达式 例子 http www rubular c
  • 使用 gitlab runner 安装 hostpah 卷的正确方法是什么?

    我需要创建一个卷来公开 maven m2 文件夹 以便在我的所有项目中重用 但我根本无法做到这一点 我的 gitlab 运行程序作为容器在我的 kubernetes 集群中运行 遵循部署和配置图 apiVersion extensions
  • 如何使用 Ms Access 日期/时间扩展数据类型

    访问女士表明有一种名为 日期 时间扩展 的数据类型 其中 日期 时间扩展数据类型存储日期和时间信息 与日期 时间数据类型类似 但它提供更大的日期范围 更高的小数精度以及与 SQL Server datetime2 日期类型的兼容性 但是 我
  • 将一个目录和子目录中的所有文件复制到单个位置[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 以下是将所有 txt 文件从一个位置复制到另一个位置的代码
  • 使用 Objective-C/Cocoa 启动 Mac 应用程序

    使用命令行启动路径查找器应用程序时 我使用open a Path Finder app Users 基于这个想法 我使用以下代码来启动路径查找器 我可以在不使用的情况下启动应用程序吗open命令行 NSTask task task NSTa
  • 恒定值变化

    假设我有一个结构体定义 struct thing thing x int z thing x this z 0 void foo const this gt x gt z 请注意 我创建了一个指向我自己的可变指针 邪恶的笑 然后我可以像这样
  • React Router v4 - 使用不同的查询参数重定向到相同的路由

    设想 有一个主页 搜索用户将被重定向到带有查询参数 例如 q abc 的搜索页面 现在在搜索页面上 用户再次尝试搜索不同的值 因此他再次被重定向到相同的搜索页面 但具有不同的查询参数 例如 q xyz Problem 当我尝试使用不同的查询
  • 嵌套 mybatis 映射

    我不知道如何在复杂的对象中使用 mybatis 结果 我有以下映射器类 public interface StationMapper MapKey stationId Map