Mybatis常用注解中的SQL注入实例详解

前言

MyBatis3提供了新的基于注解的配置。主要在MapperAnnotationBuilder中,定义了相关的注解:

public MapperAnnotationBuilder(Configuration configuration, Class type) {
    ...
    sqlAnnotationTypes.add(Select.class);
    sqlAnnotationTypes.add(Insert.class);
    sqlAnnotationTypes.add(Update.class);
    sqlAnnotationTypes.add(Delete.class);
    ......
    sqlProviderAnnotationTypes.add(SelectProvider.class);
    sqlProviderAnnotationTypes.add(InsertProvider.class);
    sqlProviderAnnotationTypes.add(UpdateProvider.class);
    sqlProviderAnnotationTypes.add(DeleteProvider.class);
}

增删改查占据了绝大部分的业务操作,通过注解不在需要配置繁杂的xml文件,越来越多的sql交互均通过注解来实现。从MapperAnnotationBuilder可以看到Mybatis提供了以下相关的注解:

  • @Select
  • @Insert
  • @Update
  • @Delete
  • @SelectProvider
  • @InsertProvider
  • @UpdateProvider
  • @DeleteProvider

例如如下例子,使用@Select注解直接编写SQL完成数据查询:

@Mapper
public interface UserMapper {    
@Select("select * from t_user")    
List list();
}

使用类似@SelectProvider高级注解可以指定某个工具类的方法来动态编写SQL,以应对复杂的业务需求。
以@SelectProvider 为例,查看具体的实现,主要包含两个注解属性,其中type表示工具类,method 表示工具类的某个方法,用于返回具体的SQL:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface InsertProvider {
    // 用于指定获取 sql 语句的指定类
    Class type();
    // 指定类中要执行获取 sql 语句的方法
    String method();
}

使用方法如下,在ProjectSql类的getContentByProjectIds方法定义相关的sql即可,sql的定义可以通过org.apache.ibatis.jdbc.SQL来快速实现:
@SelectProvider(type = ProjectSql.class, method = "getContentByProjectIds")
List getContentByProjectIds(List projectIds);

常见注入场景

2.1普通注解

实际上跟xml配置中对应的标签语法是一样的(例如@Select对应