Mybatis ORM半自动映射框架对java开发工程师来说应该是必会的框架之一。它的好处这里不是我们讨论的重点。令很多刚刚入行的java开发小伙伴迷茫的是 resultType与resultMap的使用。今天来探讨一下这个问题。
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。 ①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。 ②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。 一、ResultMap 当返回类型直接是一个ResultMap的时候也是非常有用的,这主要用在进行复杂联合查询上,因为进行简单查询是没有什么必要的。先看看一个返回类型为ResultMap的简单查询,再看看复杂查询的用法。
如果你搜索只是返回一个值,比如说String ,或者是int,那你直接用resultType就行了。 但是你如果是返回一个复杂的对象,就必须定义好这个对象的resultMap的result map。 举个例子吧,例子以ibatis为例: 你有个User 对象, 拥有两个字段id,name。 1.你要获取id为123的name String name = (String) queryForObject(“getUserNameByID”, id); <select id=”getUserNameByID” resultType=”java.lang.String”> Select name from User where id =#id# </select> 2.你要获取整个User对象 User user = (User) queryForObject(“getUserByID”, id); <resultMap class=”包.User” id=”User”> <result property=”id” column=”ID” /> <result property=”name” column=”NAME” /> </resultMap> <select id=”getUserByID” resultMap=”User”> Select ID,NAME from User where id =#id# </select> 追问 但是,resultType 也可以返回一个对象 <select id=”getUserNameByID” resultType=”com.bean.User”> Select * from User where id =#id# </select>
resultMap:外部resultMap定义得引用,通过对应的外部resultMap的id,表示结果映射到哪个resultMap上,一般用于字段名和属性名不一致的情况,或者需要做复杂的联合查询以便自由控制映射 结果俩者的关链 当进行查询时,查询出来的每个字段都会放在一个Map里,当查询元素返回属性是resultType的时候,会根据键值对取出value来赋值给指定的属性。其实MyBatis的每个查询映射的返回类型都是resultMap,只是当我们使用resultType的时候,会自动把对应的值赋给所指定的对象属性,当使用resultMap时候,因为map不是很好的表示领域,我们就进一步的转化为对应的实体对象。resultMap主要作用于复杂的联合查询上。 注意:
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/51553225
养成习惯,先赞后看!!! 两者的区别主要就是在返回类型上. 在mybatis中我们可能返回的数据类型主要就是下面这两种: 单个集合----ResultType,ResultMap 多重集合--
resultType:将查询结果按照sql列名pojo属性名一致性映射到pojo中
Mybatis之ResultMap 本人独立博客https://chenjiabing666.github.io/ 实体类 通常实体类中的属性要和数据库表中的字段一致,包括类型,字段名称 因此我们在单表查询的时候不需要使用<resultMap>指定实体类和表中的字段对应关系,但是如果我们在查询的时候使用了别名,或者属性字段和表的字段不一致,那么我们就需要用<resultMap>指定对应关系了 准备 创建一个User类 public class User implements Serializable {
ResultMap和ResultType: 两者都是表示查询结果集与java对象之间的一种关系,处理查询结果集,映射到java对象。 resultMap:表示将查询结果集中的列一一映射到bean对象的各个属性。
原因其实蛮简单的,mybatis的xml中的resultMap标签规定了内标签的顺序,写错了就会直接解析不出来,从而报错。就和sql语句一样的,定义了自己的规则.
type:需要映射的类型(pojo类型或扩展类型)也是接口中方法的返回值类型或泛型。
(1)#{}会经过JDBC当中的PreparedStatement的预编译,会根据不同的数据类型来编译成对应数据库中所对应的数据,并放到SQL语句的占位符问号上。如下:
通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、POJO的包装类型。 举个栗子:完成用户信息的综合查询,需要传入条件很复杂(可能包括用户信息、其他信息,比如商品、订单)。传递POJO的包装类对象,看下面的实例:
resultType:使用resultType实现非常简单,如果POJO中没有包括查询的列名,可以新建扩展类继承父类,并在子类中添加列名对应的属性,即可完成映射。
Mybatis实际上隐藏了一个功能:Mapper.xml可以继承,这个在官方文档中并没有提到过,不过在这个issue (commit)里提到过。
返回一个list: public List<Employee> getEmpByLastNameLike(String lastname); <select id="getEmpByLastNameLike" resultType="Employee"> select * from tbl_employee where last_name like #{lastname} </
有时一个单独的数据库查询也许返回很多不同 (但是希望有些关联) 数据类型的结果集。鉴别器元素就是被设计来处理这个情况的, 还有包括类的继承层次结构。 鉴别器非常容易理 解,因为它的表现很像 Java 语言中的 switch 语句。
# MyBatis-Select # select 1. public List<Employee> getEmpsByLastNameLike(String lastName); //返回一条记录的map:key就是列名;值就是对应的值 2. public Map<String, Object> getEmpByIdReturnMap(Integer id); @MapKey("id") 3. public Map<Integer, Employee> getEmpMapByLastNameLikeR
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说ResultMap和ResultType在使用中的区别,希望能够帮助大家进步!!!
在 select 语句中查询得到的是一张二维表, 水平方向上看是一个个字段, 垂直方向上看是一条条记录。作为面向对象的语言, Java 中的的对象是根据类定义创建的。 类之间的引用关系可以认为是嵌套的关系。
上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的模型。你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为模型。
映射文件 配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapper.xml以statement为单位管理sql语句 Statement的实际位置就等于namespace+StatementId 占位符 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 主键生成策略 如果我们在Hibernate中,当我们插入数据的时候
1. association 查询结果的一对一关联: <resultMap id="blogResult" type="Blog"> <id property=”blog_id” column="id" /> <result property="title" column="blog_title"/> <association property="author" column="blog_author_id" javaType="Author"> <id property="id" co
除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句。
在数据库建表时,更习惯于使用下滑线连接不同单词,如某字段名称user_name,而在写代码时,却习惯于使用驼峰命名法定义变量,用Java举例,某个实体类的属性String userName;
上班就像打怪升级,拿着一把西瓜刀,从南天门砍到北天门。但时间长了,怪越来越凶了,西瓜刀也不得手了。咋办,在游戏里大家肯定是想办法换装备了、买武器了、学技能了,这样才能有机会打通更多的关卡。
(原创不易,你们对阿超的赞就是阿超持续更新的动力!) (以免丢失,建议收藏) (------------------------------------------------------------------------) 什么是MyBatis Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵活度高。 作为一个半ORM框架,MyBatis 可以使用
resultMap:当查询字段名与Bean对象属性名不一致时,需要配置resultMap与Bean属性的对应关系,才能映射
在 Mybatis 中,resultType 和 resultMap 都用于定义查询结果的映射关系。它们的使用场景如下:
第四章 Mybatis映射文件详解 4.1 映射文件概述 MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。 如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。 4.2 映射文件根标签 mapper标签 mapper中的namespace要求与接口的全类名一致 4.3 映射文件子标签 子标签共有9个,注意学习其中8大子标签 insert标签:定义添加SQL delete标签:定义删除SQL update标签:定义
resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。
resultMap 是MyBatis中最重要最强大的标签,它可以让你从90%的JDBC ResultSets代码中解脱,对复杂语句进行联合映射时,会非常方便
MyBatis 提供了XML配置和注解配置两种方式。今天就来搞搞这两种方式是如何实现的。
mybatis 高级映射和spring整合之高级映射 ————————————————学习结构———————————————————— 0.0 对订单商品数据模型进行分析 1.0 高级映射 1.1 一对一查询 1.2 一对多查询 1.3 多对多查询 1.4 resultMap总结 1.5 延迟加载 2.0 查询缓存 2.1 一级缓存 2.2 二级缓存(了解mybatis
原文:https://www.cnblogs.com/weijie4611/p/10450717.html
2020-05-14 11:56:25.887 ERROR 40074 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.builder.IncompleteElementException: **Could not find result map com.sukai.entity.Student] with root cause**
lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。
映射配置文件(mapper文件)中包含了要执行的 SQL 语句以及相应的数据和对象之间的映射关系。
这个语句被称作 selectPerson,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。 注意:
查询语句是 MyBatis 中最常用的元素之一,光能把数据存到数据库中价值并不大,只有还能重新取出来才有用,多数应用也都是查询比修改要频繁。对每个插入、更新或删除操作,通常间隔多个查询操作。这是 MyBatis 的基本原则之一,也是将焦点和努力放在查询和结果映射的原因。简单查询的 select 元素是非常简单的。比如:
上一章中实现的MyBatis对象映射较为简单,对象中的属性和数据库中的表字段是一一对应的(无论数量和名称都完全一样),如果对象中的属性名和表中的字段名不一致怎么办?又或者Java对象中存在复杂类型属性(即类似Hibernate中多对一、一对多关系对象时)怎么完成数据库表和对象的映射?本章来解决这样的问题。
lMyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单
命名空间 namespace和子元素的id联合保证唯一,区别不同的mapper 绑定DAO接口 namespace的命名必须跟某个接口同名 接口中的方法与映射文件中SQL语句id一一对应
在源码工程的test中以NestedQueryCacheTest测试类下的testThatNestedQueryItemsAreRetrievedFromCache为例:
- parameterMap – 已被废弃!老式风格的参数映射。更好的办法是使用内联参数,此元素可能在将来被移除。文档中不会介绍此元素。
引用它的语句使用 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:
mybatis-conf.xml配置文件中,需要把settings标签放在properties之后,environments之前,不然会报错。由于数据库字段last_name和java属性lastName不匹配。有三种解决方式,一种是在查询的时候取别名,第二种是配置驼峰命名法,配置之后会自动将数据库中的带有下划线的字段映射为lastName。第三种是自己利用resultMap自定义结果返回集,在其中进行映射。
关联查询(一对一) 场景:一个作者(Author)有一个博客(Blog) Blog.java public class Blog { private String id; private String authorId; private Author author; //get & set } BlogMapper.xml <resultMap id="blogResult" type="Blog"> <associatio
领取专属 10元无门槛券
手把手带您无忧上云