mybatis @result和@many注解
先来看一组代码:
@results(id="groupwithusers",
value = {
@result(property = "groupid", column = "group_id", id = true),
@result(property = "name", column = "name"),
@result(property = "accountid", column = "account_id"),
@result(property = "deleteflag", column = "delete_flag"),
@result(property = "parentid", column = "parent_id"),
@result(property = "userlist", javatype=list.class, many =@many(select="selectusersbygroupid"), column = "group_id")})
//查询
@select({"select * from group where account_id=#{accountid} and delete_flag=0"})
list<group> selectgroupwithusers(@param("accountid") string accountid);
@select({"select u.* from user u",
"inner join user_group ug on u.user_id = ug.user_id",
"where ug.group_id=#{groupid} and u.delete_flag=0"
})
list<user> selectusersbygroupid(@param("groupid") string groupid);我们的接受的对象group中的字段:(user类中的映射关系这里就不再赘述)
@data
public class group {
private string groupid;
private string name;
private string accountid;
private string parentid;
private string type;
private list<user> userlist;
}调用list<group> selectgroupwithusers(@param("accountid") string accountid);查出的结果为:

从结果中可以看出,查询出的列和group中属性信息的映射关系是在@results中value属性的@result注解进行配置的,这里与mybatis的xml配置文件开发基本相同。
再看一下userlist包含了user信息,也就是selectusersbygroupid方法被调用,查询结果被封装在group类中的userlist字段中。而selectusersbygroupid方法被调用的配置在@many注解中。
下面我们来卓层分析一下@results注解及注解中的属性信息:
@results注解
@documented
@retention(retentionpolicy.runtime)
@target({elementtype.method})
public @interface results {
string id() default ""; //当前results注解的唯一标识
result[] value() default {}; //value值为result[]数组
}@results中只有两个属性,id和value,id作为当前@results注解的唯一标识很好理解;value值为@result数组,下面我们看一下@result的信息:
@result
@documented
@retention(retentionpolicy.runtime)
@target({})
public @interface result {
boolean id() default false; //id唯一标识
string column() default ""; //对应数据库中的列名
string property() default ""; //对应类中的属性名
class<?> javatype() default void.class; //数据类型
jdbctype jdbctype() default jdbctype.undefined; //jdbc类型
class<? extends typehandler> typehandler() default unknowntypehandler.class;
one one() default @one; //一对一配置
many many() default @many; //一对多配置
}@result中常用的属性是column和property,用于配置数据库中的列名和类中的属性名之间的映射关系。另外one和many用于关联查询。
比如上面列子中提到的group类中包含属性list<user> userlist,这时集合类型数据,与group是一对多的关系,需要用many配置,如果group中需要对象类型数据user user,那么就需要使用one进行配置。
这里我们以many为例进行说明:
@result中many的应用
@many:
@documented
@retention(retentionpolicy.runtime)
@target({})
public @interface many {
string select() default ""; //选择要执行的方法
fetchtype fetchtype() default fetchtype.default; //枚举值,懒加载、及时加载、默认
}@many中常用的属性只有selet,用于指定关联查询的方法
但是存在many属性的@result注解的使用就有些变化:如下面的这段代码中,column属性的值为"group_id",是group表中的列,也是作为参数传递到selectusersbygroupid中进行查询的参数。
@result(property = "userlist", javatype=list.class, many =@many(select="selectusersbygroupid"), column = "group_id")})
如果select属性指定的方法需要的参数是一个对象,要如何传递参数?比如select属性绑定的是如下方法:
public list<user> selectusers(map<string,object> map);
需要的参数是一个map对象,这时column属性的值要设置为:
column = "{groupid=group_id, username=user_name}"这时,就相当于我们在map中传入了两个值map.put("groupid",value) ,map.put("username",value),而column中,“groupid=group_id”,相当于将库中的列group_id映射到groupid中,user_name也一样。
至此,@resuts和@result的使用大致就这些,那么@resultmap注解的使用,其实就是引用已定义好的@results
@resultmap
@documented
@retention(retentionpolicy.runtime)
@target({elementtype.method})
public @interface resultmap {
string[] value();
}@resultmap中只有一个属性value,用于指定要引用的@results,value值为@results的id值,如下所示:
@resultmap("resultsid")
@select("......")
list<object> select();总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论