重用 mybatis 中的 @Results 注解

使用 mybatis 时,我习惯用注解的方式来完成数据库操作而不是 xml, 因为这样后端的代码可以全部在 java 完成,不过随着查询语句的增多, 重复的注解也变得越来越多,今天找到了解决的办法,记录一下

1 问题

使用注解绑定的数据库操作会类似下面:

@Select("SELECT * FROM data")
@Results({
	@Result(column = "column name1", property = "property name1"),
	@Result(column = "column name2", property = "property name2"),
	@Result(column = "column name3", property = "property name3"),
})
List<Data> getAllData();

如果我们针对同一个表有多个查询方法, 那么 @Results 这段我们就要写好多次,如果表格的字段发生增删就更麻烦, 所有相关方法的注解都需要修改,这就是我们的问题, 有没有办法给这段注解起一个别名或是创建一个新注解来代替这段注解, 这样就避免了修改字段带来的重复性工作。

2 解决

首先看一看 Results 的定义:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Results {
	String id() default "";
	Result[] value() default {};
}

那么是不是仿照 Results 创建一个新的注解, 然后返回定义好的 Results 就可以呢:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface DataResults {
	String id() default "";
	Results value() default @Results({
		@Result(column = "column name1", property = "property name1"),
		@Result(column = "column name2", property = "property name2"),
		@Result(column = "column name3", property = "property name3"),
	});
}

看着没毛病,但是跑一下发现,这个注解并没有被 mybatis 认出来, 这条路看来是行不通

一直很好奇 @Results 里面还有一个 id 不晓得是怎么用的,后来发现, mybatis 就是用这个 id 完成了注解重用, 首先我们在定义 @Results 时定义它的 id:

@Select("SELECT * FROM data")
@Results( id = "DataResults", value = {
	@Result(column = "column name1", property = "property name1"),
	@Result(column = "column name2", property = "property name2"),
	@Result(column = "column name3", property = "property name3"),
})
List<Data> getAllData();

下次使用时只要使用 @ResultMap 就可以重用上面的定义了:

@Select("SELECT * FROM data LIMIT 1")
@ResultMap("DataResults")
Data getData();

这样一来重复代码是不是又减少了很多