如果源对象中的字段不为空,则MyBatis更新

时间:2019-04-26 04:53:15

标签: java sql mybatis dynamic-sql

使用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的解决方案也可以)。

1 个答案:

答案 0 :(得分:0)

以下应能工作。

<if test='description != null'>

test属性的值由OGNL评估,而#{}是MyBatis引用参数/属性的方式。 而且,根据您的情况,jdbcType可能是不必要的(尽管没有危害)。