繁体   English   中英

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

[英]MyBatis update if a field in the source object is not null

使用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。 只有在record.description不为null ,我才尝试更新description字段。

方法1,即使record.description == null ,也未通过测试#{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的解决方案也可以),我将不胜感激。

以下应该工作。

<if test='description != null'>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM