Mybatis注解@Results、@Result、@ResultMap
先来看一组代码:
@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相关推荐
- mybatis注解详解
mybatis注解详解 首 先当然得下载mybatis-3.0.5.jar和mybatis-spring-1.0.1.jar两个JAR包,并放在WEB-INF的lib目录下 (如果你使用maven,则 ...
- Mybatis注解开发之@Results
写在前面:在使用mybatis注解开发的时候,数据库返回的结果集和实体类字段不对应,我们就需要手动指定映射关系: 一种是使用在xml文件中指定resultMap,指定id,下面需要的直接引用id就可以 ...
- MyBatis 实现多表查询、resultMap 标签、MyBatis 注解、mybatis运行原理
内容 Auto Mapping 单表实现(别名方式) 实现单表配置 单个对象关联查询(N+1,外连接) 集合对象关联查询 注解开发 MyBatis 运行原理 一.MyBatis 实现多表查询 Myba ...
- Maven使用注解配置SQL映射器(@Results,@ResultMap)
工程目录: 一.@Results映射 Client.java package client;import java.io.*; import java.util.List; import org.ap ...
- Mybatis注解学习记录
Mybatis注解使用 1. SQL语句映射 1.1 @Select注解:实现查询功能 1.1.1 用法 1.2 @Insert注解:实现新增功能 1.2.1 用法 1.3 @Update注解:实现更 ...
- SpringBoot + MyBatis(注解版),常用的SQL方法
一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...
- Mybatis注解开发指北
Mybatis注解开发指北 目录 文章目录 Mybatis注解开发指北 @[toc] 0. Mybatis注解开发步骤 1. 导入相关配置文件 2. 配置数据库连接 3. 创建数据库对应的实体类(en ...
- Mybatis注解开发笔记
Mybatis注解开发(笔记) 欢迎来到菜鸟研究所 创建新的Maven项目 配置文件 prom.xml log4j.properties jdbcConfig.properties SqlMapCom ...
- 【Mybatis】Mybatis 注解开发
文章目录 Mybatis的注解开发 MyBatis用注解实现增删改查 MyBatis的注解实现复杂映射开发 一对一查询 一对多查询 多对多查询 Mybatis的注解开发 这几年来注解开发越来越流行,M ...
- Mybatis注解的基本用法
Mybatis注解方式就是将SQL语句直接写在接口上,而省略了去XML文件中写查询的SQL语句.这种方法的优点是对于需求比较简单的系统,效率较高.缺点是当SQL语句有变化时都需要重新编译代码.所以一般 ...
最新文章
- 数学知识--Unconstrained Optimization(第二章)
- 图片压缩大小java_压缩图片大小(Java源码)
- java 同步 变量,在java中的对象上同步,然后更改同步的变量的值
- 从零开始的服务器配置
- 视频批量消重 短视频解析去水印在线
- macOS Monterey 2K 屏开 HiDPI
- Python沪深300成分股价值分析
- Python学习笔记之疑问 1:def 是什么意思
- JPG如何免费压缩大小并且保证清晰度
- Next.js基本使用
- Linux下进入PostgresSQL数据库有哪些比较常用的操作命令
- iOS中给图片加水印或文字的几种方法
- Undefined symbols for architecture i386: _OBJC_CLASS_$_JPUSHService
- chrome浏览器插件SwitchyOmega的安装(离线安装)
- matlab如何使用slice,Matlab的slice命令
- WebGL 手撸3d贺卡+小草飘动滤镜
- Git的标签:tag
- 怎么解决微信不支持下载app(apk/ipa)软件
- mysql的real类型_MSSQL数据类型-浮点数据类型 (real、float、decimal、numeric)
- JavaScript fontsize() 方法