使用MyBatis批注和动态SQL,仅当源对象中的对应字段不为null时,我才尝试更新表的字段。例如,如果#{srcField}不为null,则设置field =#{srcField}。我不在乎数据库中的字段是否为空。
但是,我未能提出正确的动态SQL。
我尝试了两种动态sql方法。我的程序可以采用方法1,但是无法检查源对象中的特定字段是否为空。方法2会导致一些运行时错误。
我的带有setter / getter的DAO对象(用于更新表的源对象):
@Data
public class CityDO {
private Long id;
private String name;
private String description;
}
使用注释和动态sql的映射程序。仅当description
不是record.description
时,我才尝试更新null
字段。
方法1,即使record.description == #{description}!=null
也未通过测试null
。每次生成的sql包含SET description = ?
。
@Update({
"<script>",
"update city",
"<set>",
"<if test='#{description} != null'>description = #{description,jdbcType=VARCHAR},</if>",
"</set>",
"where name = #{name,jdbcType=VARCHAR}",
"</script>"
})
@Override
int update(CityDO record);
方法2,唯一的区别是我在测试条件下添加了jdbcType。 Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'VARCHAR' in 'class com.mycode.CityDO'
"<if test='#{description,jdbcType=VARCHAR} != null'>description = #{description,jdbcType=VARCHAR},</if>",
我很高兴有人能告诉我如何使其工作,是否有参考解决方案(即使是基于xml的解决方案也可以)。
答案 0 :(得分:0)
以下应能工作。
<if test='description != null'>
test
属性的值由OGNL评估,而#{}
是MyBatis引用参数/属性的方式。
而且,根据您的情况,jdbcType
可能是不必要的(尽管没有危害)。