ylbtech-Java-MyBatis-MyBatis3-XML映射文件:自动映射
1.返回顶部
1、

自动映射

正如你在前面一节看到的,在简单的场景下,MyBatis 可以为你自动映射查询结果。但如果遇到复杂的场景,你需要构建一个结果映射。 但是在本节中,你将看到,你可以混合使用这两种策略。让我们深入了解一下自动映射是怎样工作的。

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

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

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

<select id="selectUsers" resultMap="userResultMap">
select
user_id as "id",
user_name as "userName",
hashed_password
from some_table
where id = #{id}
</select>
<resultMap id="userResultMap" type="User">
<result property="password" column="hashed_password"/>
</resultMap>

有三种自动映射等级:

  • NONE - 禁用自动映射。仅对手动映射的属性进行映射。
  • PARTIAL - 对除在内部定义了嵌套结果映射(也就是连接的属性)以外的属性进行映射
  • FULL - 自动映射所有属性

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

<select id="selectBlog" resultMap="blogResult">
select
B.id,
B.title,
A.username,
from Blog B left outer join Author A on B.author_id = A.id
where B.id = #{id}
</select>
<resultMap id="blogResult" type="Blog">
<association property="author" resultMap="authorResult"/>
</resultMap> <resultMap id="authorResult" type="Author">
<result property="username" column="author_username"/>
</resultMap>

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

无论设置的自动映射等级是哪种,你都可以通过在结果映射上设置 autoMapping 属性来为指定的结果映射设置启用/禁用自动映射。

<resultMap id="userResultMap" type="User" autoMapping="false">
<result property="password" column="hashed_password"/>
</resultMap>
2、
2.返回顶部
 
3.返回顶部
 
4.返回顶部
 
5.返回顶部
1、
2、
 
6.返回顶部
 
作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

最新文章

  1. Shuffling Machine和双向链表
  2. MVC5-7 ValueProvider
  3. OpenGL Code Resources
  4. js Array 交集 并集 差集 去重
  5. TYVJ P1078 删数 Label:区间dp
  6. C++@重载函数
  7. ChineseCounter.cs 统计中文文本中常用字占比
  8. validatebox实现多重规则验证
  9. python安装setuptools和pip
  10. Pascal向C++的跨越
  11. LNK 2005 error 函数定义也是定义!!
  12. [Go] golang原子函数实现goroutine同步
  13. USM-V1.0
  14. tracert traceroute
  15. _npc
  16. PhoenixFD插件流体模拟——UI布局【Simulation】详解
  17. Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
  18. 潭州课堂25班:Ph201805201 WEB 之 JS 第六课 (课堂笔记)
  19. PE/ELF文件里面存的是什么呢?
  20. compile FFMPEG under windows

热门文章

  1. 使用CSS为图片添加更多趣味的5种方法
  2. 现代软件工程HW2:结对编程-生成五则运算式-Core10组 [PB16110698+PB16120162]
  3. C 删除字符串中某个指定的字符
  4. Ubuntu升级软件和ubuntu升级系统的命令
  5. Spring Boot环境搭建。
  6. P5390 [Cnoi2019]数学作业
  7. 记一次数据丢失(电脑硬盘closed to down)的经历
  8. case in
  9. hdu多校第二场 1005 (hdu6595) Everything Is Generated In Equal Probability
  10. bootstrap1总结