当前位置: 代码网 > it编程>编程语言>Java > MyBatis @Result和@Many注解详解:关联查询与映射配置教程

MyBatis @Result和@Many注解详解:关联查询与映射配置教程

2026年07月17日 Java 我要评论
mybatis @result和@many注解先来看一组代码:@results(id="groupwithusers", value = { @result(p

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();

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com