用于select语句的Mybatis内联类型处理程序

时间:2015-05-26 18:00:38

标签: java mybatis

有简单的选择

<select id = "getWidgetConfig" resultType="com.comp.entity.widgets.cnfg.Widget">
    SELECT `json_config`
    FROM   `widget_config`
    WHERE  `widget_id` = #{widgetId} 
</select>

其中json_config是字符串值。

我可以绑定类型/结果处理程序(内联)以使用我的处理程序将json_config值转换为我的实体Widget吗?

我可以内联更新/插入语句

INSERT INTO `widget_config` 
    (
        `json_config`
    ) 
VALUES 
    ( 
        #{widget,typeHandler=com.comp.mybatis.handlers.widget.WidgetTypeHandler} 
    )

我如何为select语句做类似的事情? 感谢

1 个答案:

答案 0 :(得分:1)

我认为在select中可以在顶层使用类型处理程序。但是你可以通过使用带有构造函数的结果映射来解决这个问题:

<resultMap id="widgetMap" type="Widget">
  <constructor>
     <arg column="json_config" javaType="string"/>
  </constructor>
</resultMap>

<select id="getWidgetConfig" resultMap="widgetMap">
   SELECT `json_config`
    FROM   `widget_config`
    WHERE  `widget_id` = #{widgetId} 
</select>

潜在的缺点是你需要在Widget的构造函数中使用解析逻辑。如果这不是一个选项,那么解决这个问题的一种方法是为Widget创建复制构造函数并更改这样的映射:

<resultMap id="widgetMap" type="Widget">
  <constructor>
     <arg column="json_config" javaHandler="com.comp.mybatis.handlers.widget.WidgetTypeHandler"/>
  </constructor>
</resultMap>

您需要确保Widget具有适当的复制构造函数,该构造函数采用类型Widget的值并创建一个副本(如果它们是不可变的,它可能会重用传递的Widget的内部构件)。