MyBatis之高级关联和集合映射(一、基础知识)
来源:互联网 发布:应届生求职网站知乎 编辑:程序博客网 时间:2024/05/21 00:53
<association property="author" column="blog_author_id" javaType=" Author"><id property="id" column="author_id"/><result property="username" column="author_username"/></association>
关联元素处理“有一个”类型的关系。比如,在我们的示例中,一个博客有一个用户。关联映射就工作于这种结果之上。你指定了目标属性,来获取值的列,属性的java类型(很多情况下MyBatis可以自己算出来),如果需要的话还有jdbc类型,如果你想覆盖或获取的结果值还需要类型控制器。
关联中不同的是你需要告诉MyBatis如何加载关联。MyBatis在这方面会有两种不同的方式:
- 嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型。
- 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集。
首先,然让我们来查看这个元素的属性。所有的你都会看到,它和普通的只由select和resultMap属性的结果映射不同。
property:映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的
JavaBeans的属性,那么就会使用。否则MyBatis将会寻找给定名称的字段。这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一些东西:“username”,或者映射到一些复杂的东西:“address.street.number”。column:来自数据库的列名,或重命名的列标签。这和通常传递给resultSet.getString(columnName)方法的字符串是相同的。
注意:要处理复合主键,你可以指定多个列名通过column=”{prop1=col1,prop2=col2}”这种语法来传递给嵌套查询语句。这会引起prop1和prop2以参数对象形式来设置给目标嵌套查询语句。javaType:一个Java类的完全限定名,或一个类型别名(参加上面内建类型别名的列表)。如果你映射到一个JavaBean,MyBatis通常可以断定类型。然而,如果你映射到的是HashMap,那么你应该明确地指定javaType来保证所需的行为。
jdbcType:在这个表格之前的所支持的JDBC类型列表中的类型。JDBC类型是仅仅需要对插入,更新和删除操作可能为空的列进行处理。这是JDBC的需要,而不是MyBatis的。如果你直接使用JDBC编程,你需要指定这个类型-但仅仅对可能为空的值。
typeHandler:使用这个属性,你可以覆盖默认的类型处理器。这个属性值是类的完全限定名或者是一个类型处理器的实现,或者是类型别名。
关联的嵌套查询
另外一个映射语句的ID,可以加载这个属性映射需要的复杂类型。获取的在列属性中指定的列的值将被传递给目标select语句作为参数。注意:要处理复合主键,你可以指定多个列名通过column=”{prop1=col1,prop2=col2}”这种语法来传递给嵌套查询语句。这会引起prop1和prop2以参数对象形式来设置给目标嵌套查询语句。
案例:
<resultMap id=”blogResult” type=”Blog”><association property="author" column="blog_author_id"javaType="Author" select=”selectAuthor”/></resultMap><select id=”selectBlog” parameterType=”int” resultMap=”blogResult”>SELECT * FROM BLOG WHERE ID = #{id}</select><select id=”selectAuthor” parameterType=”int” resultType="Author">SELECT * FROM AUTHOR WHERE ID = #{id}</select>
这个问题会导致成百上千的SQL语句被执行。这通常不是期望的。
MyBatis能延迟加载这样的查询就是一个好处,因此你可以分散这些语句同时运行的消耗。然而,如果你加载一个列表,之后迅速迭代来访问嵌套的数据,你会调用所有的延迟加载,这样的行为可能是很糟糕的。下面我们来看 关联的嵌套结果:
- resultMap:这是结果映射的ID,可以映射关联的嵌套结果到一个合适的对象图中。这是一种替代方法来调用另外一个查询语句。这允许你联合多个表来合成到一个单独的结果集。这样的结果集可能包含重复,数据的重复组需要被分解,合理映射到一个嵌套的对象图。为了使它变得容易,MyBatis让你“链接”结果映射,来处理嵌套结果。
<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" resultMap=”authorResult”/></resultMap><resultMap id="authorResult" type="Author"><id property="id" column="author_id"/><result property="username" column="author_username"/><result property="password" column="author_password"/><result property="email" column="author_email"/><result property="bio" column="author_bio"/></resultMap>
非常重要:在嵌套结果映射中id元素扮演了非常重要的角色。应该通常指定一个或多个属性,它们可以用来唯一标识结果。实际上就是如果你不使用它(id元素),但是会产生一个严重的性能问题,不过MyBatis仍然可以正常工作。选择的属性越少越好,它们可以唯一地标识结果。主键就是一个显而易见的选择(即便是联合主键)。
上面你已经看到了如何处理“有一个”类型关联。但是“有很多个”是怎样的?下面这个部分就是来讨论这个主题的。
集合
<collection property="posts" ofType="domain.blog.Post"><id property="id" column="post_id"/><result property="subject" column="post_subject"/><result property="body" column="post_body"/></collection>
注意那个新的“ofType”属性。这个属性用来区分JavaBean(或字段)属性类型和集合包含的类型来说是很重要的。我们这里只写嵌套结果的案例:
<resultMap id="blogResult" type="Blog"><id property=”id” column="blog_id" /><result property="title" column="blog_title"/><collection property="posts" ofType="Post" resultMap=”blogPostResult”/></resultMap><resultMap id="blogPostResult" type="Post"><id property="id" column="post_id"/><result property="subject" column="post_subject"/><result property="body" column="post_body"/></resultMap>
- MyBatis之高级关联和集合映射(一、基础知识)
- MyBatis之高级关联和集合映射(二、嵌套查询和嵌套结果小案例)
- MyBatis之高级关联和集合映射(二、嵌套结果综合案例)
- MyBatis高级映射之-一对一(一对多)关联映射
- 浅谈MyBatis 之 高级映射/关联查询(四)
- MyBatis之关联映射
- Mybatis之关联映射
- mybatis 高级映射和spring整合之高级映射(4)
- Mybatis深入了解(六)----关联查询(高级映射)
- Mybatis深入了解(六)----关联查询(高级映射)
- MyBatis学习(一)之一对一关联映射查询
- MyBatis学习(一)之一对一关联映射查询
- MyBatis 关联映射之一对一
- JPA实体的映射之 一对多关联映射 和 多对一关联映射
- 初识Hibernate之关联映射(一)
- 初识Hibernate之关联映射(一)
- Mybatis系列之集合映射
- Hibernate 关联映射 之 一对多单项关联 (一)
- C语言中,头文件和源文件的关系
- 缓存管理
- C#实现看门狗监控tomcat运行、定制任务计划
- 设置UIlabel的行高
- hdoj-1869-六度分离(迪杰斯特拉)
- MyBatis之高级关联和集合映射(一、基础知识)
- 一键下载M3U8/HLS 并保存为TS文件
- Discuz avatar上传头像,上传完后刷新当前页面
- 11.1 Matlab 的入门1——如何运行M文件
- ContentProvider内容介绍(1)
- Android快速开发不可或缺的11个工具类
- java处理json
- HTTP长连接与短连接
- mysql进阶(三)游标简易教程