update用法

先来看一个简单的通过主键更新数据的 update 方法的例子。在 UserMapper 接口中添加以下方法。

/**
 * 根据主键更新
 * @param sysUser 用户
 */
void updateById(SysUser sysUser);

这里的参数 sysUser 就是要更新的数据,在接口对应的 UserMapper.xml 中添加如下代码。

<update id="updateById">
    update sys_user
    set user_name = #{userName},
        user_password = #{userPassword},
        user_email = #{userEmail},
        user_info = #{userInfo},
        head_img = #{headImg,jdbcType=BLOB},
        create_time = #{createTime,jdbcType=TIMESTAMP}
    where id = #{id}
</update>

这个方法的 SQL 很简单,下面写一个简单的测试来验证一下。在 UserMapperTest 中添加如下代码。

@Test
public void testUpdateById(){
    SqlSession sqlSession = getSqlSession();
    try {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 从数据库查询1个user对象
        SysUser user = userMapper.selectById(1L);
        Assert.assertNotNull(user);
        // 当前userName为admin
        Assert.assertEquals("admin",user.getUserName());
        // 修改用户名
        user.setUserName("admin_test");
        // 修改邮箱
        user.setUserEmail("test@qq.com");
        // 更新数据,特别注意,这里的返回值 result 是执行的SQL影响的行数
        int result = userMapper.updateById(user);
        // 只更新1条数据
        Assert.assertEquals(1, result);
        // 根据当前id查询修改后的数据
        user = userMapper.selectById(1L);
        // 修改后的名字是 admin_test
        Assert.assertEquals("admin_test", user.getUserName());
    }finally {
        // 为了不影响其它测试,这里选择回滚
        // 由于默认的 sqlSessionFactory.openSession() 是不自动提交的
        // 因此不手动执行 commit 也不会提交到数据库
        sqlSession.rollback();
        // 不要忘记关闭sqlSession
        sqlSession.close();
    }
}

执行该测试,输出日志内容如下。

还可以通过修改 UPDATE 语句中的 WHERE 条件来更新一条或一批数据。基本的 update 用法就这么简单,更复杂的情况在后面的动态 SQL 章节中会进行讲解。