【问题标题】:nested mybatis map嵌套的mybatis地图
【发布时间】:2015-09-25 02:03:03
【问题描述】:

我不知道如何使用 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();

编辑: 如果我基于某些列限制它并设置属性而不是使用构造函数,我可以获得这个复杂的对象,但是如果没有关系限制,我怎么能做到呢?

<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>

【问题讨论】:

    标签: java mybatis


    【解决方案1】:

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

    因此,只需从您的映射器方法中获取 List&lt;Station&gt;,然后在需要这些东西的 DAO 或控制器或服务中放置一个私有转换器方法将其转换为所需的模型。使用至少一个抽象层来覆盖映射器几乎总是更好,该抽象层将多个更新组合到单个事务中、处理乐观锁、隐藏内部辅助容器、高级缓存逻辑等。

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

    如果List&lt;Station&gt; 占用过多资源并且查询处于关键性能路径上,请使用 MyBatis ResultHandler 迭代 JDBS ResultSet。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      相关资源
      最近更新 更多