有简单的选择
<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语句做类似的事情? 感谢
答案 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
的内部构件)。