这里写自定义目录标题
需求
遇到一个mybatis批量更新oracle数据库的问题,在这里记录一下免得以后忘记。
具体实现
不多废话,直接上代码!
1.serviceImpl层
被我注释掉的部分是一开始写的单挑更新语句。对应mapper接口的updateUserHome方法。
/**
* 批量更新用户首页信息
*/
public int updateUserPage(List<UserPagePO> list) {
int count = userPageDao.updateBatch(list);
// int count = 0;
// for(int i=0;i<list.size();i++) {
// Dto inDto = Dtos.newDto();
// inDto.put("enable", list.get(i).getEnable());
// inDto.put("userid", list.get(i).getUserid());
// inDto.put("menuid", list.get(i).getMenuid());
// count = userPageDao.updateUserHome(inDto);
// }
return count;
}
2.Mapper接口
@Dao("UserPageDao")
public interface UserPageDao {
int updateUserHome(Dto inDto);
int updateBatch(List<UserPagePO> list);
}
3.对应xml文件
- 单条语句更新
<update id="updateUserHome" parameterType="UserPagePo">
update t_app_home
<set>
<if test="enable != null">
enable = #{enable, jdbcType=NUMERIC}, <!-- 导入人员 -->
</if>
</set>
where userid = #{userid}
and menuid = #{menuid}
</update>
- 批量更新
<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
update t_app_home
<set>
<if test="item.enable != null">
enable = #{item.enable,jdbcType=NUMERIC},
</if>
</set>
where userid = #{item.userid,jdbcType=VARCHAR}
and menuid = #{item.menuid,jdbcType=VARCHAR}
</foreach>
</update>
特别需要注意:open=“begin” close=";end;" separator=";"这一句代码,千万不能写错!
大家在使用的时候把相应的字段换成自己的就行了,特别要字段问题,比如:#{item.enable,jdbcType=NUMERIC},假设字段根本不存在于表里面,肯定会报错的。经常会遇到本地库和测试库表字段不一样的问题,可能某位同事在测试库中把某个字段改了,你自己在本地测试的时候报错找bug找半天,最后发现是表里面根本没有这个字段!!!
- 至此,功能实现