先来看一组代码:

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

Mybatis注解@Results、@Result、@ResultMap相关推荐

  1. mybatis注解详解

    mybatis注解详解 首 先当然得下载mybatis-3.0.5.jar和mybatis-spring-1.0.1.jar两个JAR包,并放在WEB-INF的lib目录下 (如果你使用maven,则 ...

  2. Mybatis注解开发之@Results

    写在前面:在使用mybatis注解开发的时候,数据库返回的结果集和实体类字段不对应,我们就需要手动指定映射关系: 一种是使用在xml文件中指定resultMap,指定id,下面需要的直接引用id就可以 ...

  3. MyBatis 实现多表查询、resultMap 标签、MyBatis 注解、mybatis运行原理

    内容 Auto Mapping 单表实现(别名方式) 实现单表配置 单个对象关联查询(N+1,外连接) 集合对象关联查询 注解开发 MyBatis 运行原理 一.MyBatis 实现多表查询 Myba ...

  4. Maven使用注解配置SQL映射器(@Results,@ResultMap)

    工程目录: 一.@Results映射 Client.java package client;import java.io.*; import java.util.List; import org.ap ...

  5. Mybatis注解学习记录

    Mybatis注解使用 1. SQL语句映射 1.1 @Select注解:实现查询功能 1.1.1 用法 1.2 @Insert注解:实现新增功能 1.2.1 用法 1.3 @Update注解:实现更 ...

  6. SpringBoot + MyBatis(注解版),常用的SQL方法

    一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...

  7. Mybatis注解开发指北

    Mybatis注解开发指北 目录 文章目录 Mybatis注解开发指北 @[toc] 0. Mybatis注解开发步骤 1. 导入相关配置文件 2. 配置数据库连接 3. 创建数据库对应的实体类(en ...

  8. Mybatis注解开发笔记

    Mybatis注解开发(笔记) 欢迎来到菜鸟研究所 创建新的Maven项目 配置文件 prom.xml log4j.properties jdbcConfig.properties SqlMapCom ...

  9. 【Mybatis】Mybatis 注解开发

    文章目录 Mybatis的注解开发 MyBatis用注解实现增删改查 MyBatis的注解实现复杂映射开发 一对一查询 一对多查询 多对多查询 Mybatis的注解开发 这几年来注解开发越来越流行,M ...

  10. Mybatis注解的基本用法

    Mybatis注解方式就是将SQL语句直接写在接口上,而省略了去XML文件中写查询的SQL语句.这种方法的优点是对于需求比较简单的系统,效率较高.缺点是当SQL语句有变化时都需要重新编译代码.所以一般 ...

最新文章

  1. 数学知识--Unconstrained Optimization(第二章)
  2. 图片压缩大小java_压缩图片大小(Java源码)
  3. java 同步 变量,在java中的对象上同步,然后更改同步的变量的值
  4. 从零开始的服务器配置
  5. 视频批量消重 短视频解析去水印在线
  6. macOS Monterey 2K 屏开 HiDPI
  7. Python沪深300成分股价值分析
  8. Python学习笔记之疑问 1:def 是什么意思
  9. JPG如何免费压缩大小并且保证清晰度
  10. Next.js基本使用
  11. Linux下进入PostgresSQL数据库有哪些比较常用的操作命令
  12. iOS中给图片加水印或文字的几种方法
  13. Undefined symbols for architecture i386: _OBJC_CLASS_$_JPUSHService
  14. chrome浏览器插件SwitchyOmega的安装(离线安装)
  15. matlab如何使用slice,Matlab的slice命令
  16. WebGL 手撸3d贺卡+小草飘动滤镜
  17. Git的标签:tag
  18. 怎么解决微信不支持下载app(apk/ipa)软件
  19. mysql的real类型_MSSQL数据类型-浮点数据类型 (real、float、decimal、numeric)
  20. JavaScript fontsize() 方法

热门文章

  1. Windows服务器tomcat日志拆分(cronolog )
  2. 计算机键盘上除在哪里,backspace键在哪里
  3. Java编程思想学习(五)----第5章:初始化与清理
  4. Transformer t5代码relative_position计算
  5. 韩版三星s20 5g使用
  6. oracle服务启动哪几项,Oracle服务启动项
  7. 什么是软件工程?它有哪些本质特征?怎样用软件工程消除软件危机?
  8. 光刻机巨头ASML爆料:芯片太缺,都开始拆洗衣机了!
  9. k8s常见问题大收集
  10. F5 LTM ping 数据包丢包解决过程