MyBatis-10MyBatis注解方式之Provider注解

简介: MyBatis-10MyBatis注解方式之Provider注解

概述


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

相关文章
|
8月前
|
SQL XML Java
【mybatis】第二篇:@Select注解中加入字段判断
【mybatis】第二篇:@Select注解中加入字段判断
|
2月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
2月前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
86 5
|
2月前
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
59 3
|
2月前
|
SQL 存储 数据库
深入理解@TableField注解的使用-MybatisPlus教程
`@TableField`注解在MyBatis-Plus中是一个非常灵活和强大的工具,能够帮助开发者精细控制实体类与数据库表字段之间的映射关系。通过合理使用 `@TableField`注解,可以实现字段名称映射、自动填充、条件查询以及自定义类型处理等高级功能。这些功能在实际开发中,可以显著提高代码的可读性和维护性。如果需要进一步优化和管理你的MyBatis-Plus应用程
200 3
|
2月前
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
148 1
|
4月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
4月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
5月前
|
SQL Java 数据库
5、Mybatis-Plus 常用注解
这篇文章详细介绍了Mybatis-Plus中常用的注解,包括解决实体类与数据库表名不一致、字段不匹配的问题,主键生成策略的配置,以及逻辑删除的实现方法。
5、Mybatis-Plus 常用注解
|
5月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。