概述

除了@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章节。