目录
- 前言
- 常见注入场景
- 2.1普通注解
- 2.2 动态sql
- 2.2.1 使用< script>
- 2.2.2 使用Provider注解
- 总结
前言
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对应