Mybatis-5-映射文件详解3

简介: Mybatis的结果映射

简单的结果映射

       一般情况下,结果映射我们可以使用默认的resultType="map",不需要去显示的指定结果类型。

<selectid="getOne"resultType="map">select*fromuserwhereid=#{id}
</select>

       大部分情况下都够用,但是 HashMap 并不是一个很好的领域模型。我们更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为领域模型。

比如建一个实体,然后把字段作为结果映射到实体字段里:

<selectid="getOne"resultType="com.xing.entity.UserEntity">select*fromuserwhereid=#{id}
</select>

       这个实体我们还可以使用类型别名标签,避免每次使用都用全类名

(类的全限定名):

<typeAliastype="com.xing.entity.UserEntity"alias="User"/><selectid="getOne"resultType="User">select*fromuserwhereid=#{id}
</select>

       MyBatis 会自动创建一个 ResultMap,再根据属性名来映射列到 JavaBean 的属性上。如果列名和属性名不能匹配上,可以在 SELECT 语句中设置列别名(这是一个基本的 SQL 特性)来完成匹配。比如:

<selectid="selectUsers"resultType="User">selectuser_idas"id",
user_nameas"userName",
hashed_passwordas"hashedPassword"fromsome_tablewhereid=#{id}
</select>

       上面的例子没有一个需要显式配置 ResultMap,这就是 ResultMap 的优秀之处:你完全可以不用显式地配置它们,约定大于配置。

       如果要将上面的ResultMap显示配置,这么写:

<resultMapid="userResultMap"type="User"><idproperty="id"column="user_id"/><resultproperty="username"column="user_name"/><resultproperty="password"column="hashed_password"/></resultMap>

       然后在引用它的语句中设置 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

<selectid="selectUsers"resultMap="userResultMap">selectuser_id, user_name, hashed_passwordfromsome_tablewhereid=#{id}
</select>

高级结果映射(比如多表联查)

       这玩意在几年前用过后再没用过,懒得看,就是resultMap各种子元素的使用,有兴趣的可以去官网看看。

<resultMapid="detailedBlogResultMap"type="Blog"><constructor><idArgcolumn="blog_id"javaType="int"/></constructor><resultproperty="title"column="blog_title"/><associationproperty="author"javaType="Author"><idproperty="id"column="author_id"/><resultproperty="username"column="author_username"/><resultproperty="password"column="author_password"/><resultproperty="email"column="author_email"/><resultproperty="bio"column="author_bio"/><resultproperty="favouriteSection"column="author_favourite_section"/></association><collectionproperty="posts"ofType="Post"><idproperty="id"column="post_id"/><resultproperty="subject"column="post_subject"/><associationproperty="author"javaType="Author"/><collectionproperty="comments"ofType="Comment"><idproperty="id"column="comment_id"/></collection><collectionproperty="tags"ofType="Tag"><idproperty="id"column="tag_id"/></collection><discriminatorjavaType="int"column="draft"><casevalue="1"resultType="DraftPost"/></discriminator></collection></resultMap>

       还有支持的JDBC的类型,这个还是比较常用的。


自动映射

       可以通过在结果映射上设置 autoMapping 属性来为指定的结果映射设置启用/禁用自动映射。

<resultMapid="userResultMap"type="User"autoMapping="false">#这里可以不一一手动映射每个字段啦,当然也可以映射个别特殊字段  ...
</resultMap>

       mybatis判断某个resultMap是否开启自动映射配置的时候,会先查找自身的autoMapping属性,如果这个属性设置值了,就直接用这个属性的值,如果resultMap元素的autoMapping属性没有配置,则走全局配置的自动映射规则。

       当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性。

       通常数据库列使用大写字母组成的单词命名,单词间用下划线分隔;而 Java 属性一般遵循驼峰命名法约定。为了在这两种命名方式之间启用自动映射,需要将 mapUnderscoreToCamelCase 设置为 true。

mybatis:
configuration:
map-underscore-to-camel-case: true

       甚至在提供了结果映射后,自动映射也能工作。在这种情况下,对于每一个结果映射,在 ResultSet 出现的列,如果没有设置手动映射,将被自动映射。在自动映射处理完毕后,再处理手动映射。在下面的例子中,id 和 userName 列将被自动映射,hashed_password 列将根据配置进行映射。

<selectid="selectUsers"resultMap="userResultMap">selectuser_idas"id",
user_nameas"userName",
hashed_passwordfromsome_tablewhereid=#{id}
</select>

# 全局配置

<resultMapid="userResultMap"type="User"><resultproperty="password"column="hashed_password"/></resultMap>

# 或者

<settings><!--关闭自动映射开关--><settingname="autoMappingBehavior"value="NONE"/></settings>

有三种自动映射等级:

NONE-禁用自动映射。仅对手动映射的属性进行映射。PARTIAL-对除在内部定义了嵌套结果映射(也就是连接的属性)以外的属性进行映射FULL-自动映射所有属性。autoMappingBehavior值来源于枚举:org.apache.ibatis.session.AutoMappingBehavior

全局配置:

<settings><!--关闭自动映射开关--><settingname="autoMappingBehavior"value="NONE"/></settings>

       默认值是 PARTIAL,这是有原因的。当对连接查询的结果使用 FULL 时,连接查询会在同一行中获取多个不同实体的数据,因此可能导致非预期的映射。下面的例子将展示这种风险:

<selectid="selectBlog"resultMap="blogResult">selectB.id,
B.title,
A.username,
fromBlogBleftouterjoinAuthorAonB.author_id=A.idwhereB.id=#{id}
</select><resultMapid="blogResult"type="Blog"><associationproperty="author"resultMap="authorResult"/></resultMap><resultMapid="authorResult"type="Author"><resultproperty="username"column="author_username"/></resultMap>

       在该结果映射中,Blog 和 Author 均将被自动映射。但是注意 Author 有一个 id 属性,在 ResultSet 中也有一个名为 id 的列,所以 Author 的 id 将填入 Blog 的 id,这可不是你期望的行为。所以,要谨慎使用 FULL。


总结:

      一般情况下只需要简单映射即可,也可以使用自动映射,然后个别特殊字段手动映射。

建议可以去官网学习下。。。


END

目录
相关文章
|
10月前
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
516 0
|
10月前
|
SQL
Mybatis.xml文件中大于小于等于
Mybatis.xml文件中大于小于等于
102 0
|
4天前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
4天前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
25天前
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
43 6
|
4月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
6月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
6月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
108 1
|
8月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
212 3
|
9月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
113 3