delete用法

delete 同 update 类似,下面也用一个简单的例子说明。在 UserMapper 中添加一个简单的例子,代码如下。

/**
 * 根据主键删除
 * @param userId 用户ID
 */
void deleteById(Long userId);

根据主键删除数据的时候,如果主键只有一个字段,那么就可以像这个方法一样使用一个参数 id,这个方法对应 UserMapper.xml 中的代码如下。

<delete id="deleteById">
    delete from sys_user where id = #{id}
</delete>

注意接口中 int deleteById(Long id); 方法的参数类型为 Long id,如果将参数类型修改如下,也是正确的。

/**
 * 根据主键删除
 */
int deleteById(SysUser sysUser);

接口这样修改后,对应的 XML 中的方法不需要做任何修改。

对于以上两个接口,在 UserMapperTest 中编写一个测试,代码如下。

@Test
public void testDeleteById(){
    SqlSession sqlSession = getSqlSession();
    try {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 从数据库查询1个user对象,根据id=1查询
        SysUser user1 = userMapper.selectById(1L);
        // 现在还能查询出user对象
        Assert.assertNotNull(user1);
        // 调用方法删除
        Assert.assertEquals(1, userMapper.deleteById(1L));
        // 再次查询,这时应该没有值,为null
        Assert.assertNull(userMapper.selectById(1L));

        // 使用SysUser参数再进行一次测试,根据id=1001查询
        SysUser user2 = userMapper.selectById(1001L);
        // 现在还能查询出user对象
        Assert.assertNotNull(user2);
        // 调用方法删除,注意这里使用参数为 user2
        Assert.assertEquals(1, userMapper.deleteById(user2));
        // 再次查询,这时应该没有值,为null
        Assert.assertNull(userMapper.selectById(1001L));
        // 使用SysUser参数再进行一次测试
    }finally {
        // 为了不影响其它测试,这里选择回滚
        // 由于默认的 sqlSessionFactory.openSession() 是不自动提交的
        // 因此不手动执行 commit 也不会提交到数据库
        sqlSession.rollback();
        // 不要忘记关闭sqlSession
        sqlSession.close();
    }
}

这部分测试代码中的数据库操作较多,下面只列出了第一个 deleteById 方法输出的操作日志。

以上是一个简单的 delete 方法示例,在动态 SQL 章节中还会介绍一些更复杂的用法。