Provider注解

除了上面 4 种注解可以使用简单的 SQL 外,MyBatis 还提供了 4 种 Provider 注解,分别是 @SelectProvider、@InsertProvider、@UpdateProvider 和 @DeleteProvider。它们同样可以实现查询、插入、更新、删除操作。

下面通过 @SelectProvider 用法来了解 Provider 注解方式的基本用法。

创建 PrivilegeMapper 接口,添加 selectById 方法,代码如下。

@SelectProvider(type = PrivilegeProvider.class,method = "selectById")
SysPrivilege selectById(Long id);

其中 PrivilegeProvider 类代码如下。

public class PrivilegeProvider {

    /**
     * 查询权限-权限ID
     * @param id 权限ID
     * @return 权限
     */
    public String selectById(final Long id) {
        return new SQL() {
            {
                SELECT("id,privilege_name,privilege_url");
                FROM("sys_privilege");
                WHERE("id = #{id}");
            }
        }.toString();
    }
}

Provider 的注解中提供了两个必填属性 type 和 method。type 配置的是一个包含 method 属性指定方法的类,这个类必须有空的构造方法,这个方法的值就是要执行的 SQL 语句,并且 method 属性指定的方法的返回值必须是 String 类型。注意观察上面的代码,拼接 SQL 语句时使用了 new SQL(){...} 方法。

还可以直接返回 SQL 字符串,代码如下。

public String selectById(final Long id) {
    return "select id, privilege_name, privilege_url" +
            "from sys_privilege where id = #{id}";
}

对于以上两种写法,大家可以根据自己的需求来选择其中的任意一种,SQL 较长或需要拼接时推荐使用 new SQL() 的方式。以下是 selectById 方法的测试代码。

@Test
public void testSelectById(){
    // 获取 sqlSession
    SqlSession sqlSession = getSqlSession();

    try {
        // 获取 PrivilegeMapper 接口
        PrivilegeMapper privilegeMapper = (PrivilegeMapper)sqlSession.getMapper(PrivilegeMapper.class);
        // 调用 selectById 方法,查询 id = 1 的权限
        SysPrivilege sysPrivilege = privilegeMapper.selectById(1L);
        // privilege 不为空
        Assert.assertNotNull(sysPrivilege);
        Assert.assertEquals("用户管理", sysPrivilege.getPrivilegeName());
    } finally {
        // 不要忘记关闭 sqlSession
        sqlSession.close();
    }
}

最常用的注解基本介绍完毕,由于 MyBatis 的注解方式不是主流,因此不做过多讲解。如果大家有需要,可以参考 MyBatis 官方项目中的测试用例(具体参考11.4节),通过这些测试用例可以学习注解的基本用法,至于更复杂更高级的用法就需要大家自己去摸索验证了。