概述
除了@Select @Insert @Update @Delete四种注解可以使用简单的SQL外,MyBatis还提供了4中Provider注解,分别是 @SelectProvider @InsertProvider @UpdateProvider @DeleteProvider .同样可以实现CRUD操作。
下面通过@SelectProvider来了解下Provider注解方式的基本用法
@SelectProvider
1.开发PrivilegeProvider类
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(); }
2.PrivilegeMapper接口增加接口方法
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); }
3.单元测试
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章节。