除了@Select @Insert @Update @Delete四种注解可以使用简单的SQL外,MyBatis还提供了4中Provider注解,分别是 @SelectProvider @InsertProvider @UpdateProvider @DeleteProvider .同样可以实现CRUD操作。
下面通过@SelectProvider来了解下Provider注解方式的基本用法
package com.artisan.mybatis.xml.provider;
/**
*
*
* @ClassName: PrivilegeProvider
*
* @Description: 权限Mapper对应的Provider实现
*
* @author: Mr.Yang
*
* @date: 2018年4月19日 上午3:30:41
*/
public class PrivilegeProvider {
/**
*
*
* @Title: selectSysPrivilegeById
*
* @Description: 记得数据库字段和Java实体类属性映射,否则取出的来的是null
*
* @param id
* @return
*
* @return: String
*/
public String selectSysPrivilegeById(Long id) {
return "SELECT id, privilege_name privilegeName, privilege_url privilegeUrl FROM sys_privilege WHERE id = #{id} ";
}
}
Provider注解中提供了两个必填属性 type和method.
type配置的是一个包含method属性指定方法的类,这个类必须有空的构造函数。 这个方法的值就是要执行的SQL,并且method属性指定的方法返回值必须是String类型。
如果SQL较长后者需要拼接,推荐使用 new SQL(){…}.toString()方法
比如
public String selectSysPrivilegeById(final Long id){
return new SQL(){
{
SELECT("id, privilege_name privilegeName, privilege_url privilegeUrl");
FROM("sys_privilege");
WHERE("id = #{id}");
}
}.toString();
}
package com.artisan.mybatis.xml.mapper;
import org.apache.ibatis.annotations.SelectProvider;
import com.artisan.mybatis.xml.domain.SysPrivilege;
import com.artisan.mybatis.xml.provider.PrivilegeProvider;
/**
*
*
* @ClassName: PrivilegeMapper
*
* @Description: 演示Provider方式
*
* @author: Mr.Yang
*
* @date: 2018年4月19日 上午3:26:13
*/
public interface PrivilegeMapper {
@SelectProvider(type = PrivilegeProvider.class, method = "selectSysPrivilegeById")
SysPrivilege selectSysPrivilegeById(Long id);
}
package com.artisan.mybatis.xml.mapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.junit.Test;
import com.artisan.mybatis.xml.domain.SysPrivilege;
public class PrivilegeMapperTest extends BaseMapperTest {
private static final Logger logger = Logger.getLogger(PrivilegeMapperTest.class);
SqlSession sqlSession;
@Test
public void selectSysPrivilegeByIdTest() {
logger.info("selectSysPrivilegeByIdTest");
try {
// 获取SqlSession
sqlSession = getSqlSession();
// 获取接口
PrivilegeMapper privilegeMapper = sqlSession.getMapper(PrivilegeMapper.class);
// 调用接口方法
SysPrivilege sysPrivilege = privilegeMapper.selectSysPrivilegeById((long) 1);
// 期待不为空
Assert.assertNotNull(sysPrivilege);
// 期望为PrivilegeName为"用户管理"
Assert.assertEquals("用户管理", sysPrivilege.getPrivilegeName());
logger.info("sysPrivilege Info:" + sysPrivilege);
} finally {
sqlSession.close();
}
}
}
2018-04-19 03:45:47,408 INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-19 03:45:47,412 INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-19 03:45:47,415 INFO [main] (PrivilegeMapperTest.java:19) - selectSysPrivilegeByIdTest
2018-04-19 03:45:47,904 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Preparing: SELECT id, privilege_name privilegeName, privilege_url privilegeUrl FROM sys_privilege WHERE id = ?
2018-04-19 03:45:47,979 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 1(Long)
2018-04-19 03:45:48,011 TRACE [main] (BaseJdbcLogger.java:151) - <== Columns: id, privilegeName, privilegeUrl
2018-04-19 03:45:48,011 TRACE [main] (BaseJdbcLogger.java:151) - <== Row: 1, 用户管理, /users
2018-04-19 03:45:48,015 DEBUG [main] (BaseJdbcLogger.java:145) - <== Total: 1
2018-04-19 03:45:48,016 INFO [main] (PrivilegeMapperTest.java:32) - sysPrivilege Info:SysPrivilege [id=1, privilegeName=用户管理, privilegeUrl=/users]
最常用的注解我们简单的介绍了下使用方式,但是注解方式并不是主流,因此不深究,更多用法请参考MyBatis官方项目的测试用例 11.4章节。