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节),通过这些测试用例可以学习注解的基本用法,至于更复杂更高级的用法就需要大家自己去摸索验证了。