mybatis动态SQL<if>标签问题

aijfanta 发布于 2016/03/08 23:29
阅读 7K+
收藏 0

mybatis使用动态SQL中<if>标签使用困惑

<update id="update" parameterType="com.zyt.entity.system.UserEntity">
		UPDATE T_USER 
		<trim prefix="SET" suffixOverrides=",">
			<if test="nickname!=null and nickname!=''">
				nickname = #{nickname, jdbcType=VARCHAR},
			</if>
			<if test="head!=null and head!=''">
				head = #{head, jdbcType=VARCHAR},
			</if>
			<if test="name!=null and name!=''">
				name = #{name, jdbcType=VARCHAR},
			</if>
			<if test="age!=null and age!='' or age==0">
				AGE = #{age, jdbcType=INTEGER},
			</if>
			<if test="sex!=null and sex!=''">
				SEX = #{sex, jdbcType=VARCHAR},
			</if>
		</trim>
		WHERE ID = #{id, jdbcType=INTEGER}
	</update>



这是之前Mapper里面写的内容

public ApiResult update(UserEntity entity)
  {
    ApiResult apiResult = new ApiResult(ApiStatus.FAILED, "操作失败");
    if (this.userMapper.update(entity) > 0)
    {
      if (!StrKit.isBlank(entity.getNickname())) {
        this.chatManager.modifyNickname(String.valueOf(entity.getId()), 
          entity.getNickname());
      }
      this.userMapper.update(entity);
      apiResult.setResult(ApiStatus.SUCCESS);
      apiResult.setMsg("操作");
    }
    return apiResult;
  }
}



这是Manager里面的内容

//上传头像通用接口
  @ResponseBody
  @RequestMapping(value={"/upload_head"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
  public ApiResult uploadHead(HttpServletRequest request, @RequestParam int userid, @RequestParam MultipartFile head)
  {
    ApiResult apiResult = new ApiResult(ApiStatus.FAILED);
    String path = UploadKit.uploadHead(request, String.valueOf(userid), 
      head);
    if (!StrKit.isBlank(path))
    {
      UserEntity entity = new UserEntity();
      entity.setId(userid);
      entity.setHead(path);
      this.userManager.update(entity);
      apiResult.setResult(ApiStatus.SUCCESS);
      apiResult.setMsg(entity.getHead());
    }
    else
    {
      apiResult.setMsg("上传出错");
    }
    return apiResult;
  }
}



这是Controller的内容


问题就是:使用这种Mapper的方法,前端只传了status字段 ,数据库这边会同时更改Age字段内容,变为0

解决问题:更改了Mapper

<if test="age!=null and age!='' or age==0">
				AGE = #{age, jdbcType=INTEGER},
			</if>

<if test="age!=null and age!=''">
				AGE = #{age, jdbcType=INTEGER},
			</if>
将if test里面的判断or age==0就可以了.

请问这是为什么?我的想法是age是int类型,加个判断为不0

为什么加上or判断,会在更新时把age字段设置为0.


加载中
0
公孙二狗
公孙二狗
int 成员变量 默认初始化为 0
aijfanta
aijfanta
update这个动作,算初始化一次吗?没有新的实例啊
0
李玉珏
李玉珏
你把age的类型改成Integer试试看?
aijfanta
aijfanta
谢谢 改为Integer确实没问题了,那为什么用int类型,会有默认初始化的动作呢,这不是个update动作吗
0
aijfanta
aijfanta
哦明白了,传入的是个实体类型,age是实体属性,没赋值当然为0了...
0
學無止境
學無止境
加的or有问题。应该是(xx and xx) or xx
aijfanta
aijfanta
是的 发现问题了.这个判断本身也有问题 改成xx and xx and age!=0
返回顶部
顶部