MyBatis学习(五)- ResultMap

官方文档地址:http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html     

  resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事 情。 事实上, 编写相似于对复杂语句联合映射这些等同的代码, 也许可以跨过上千行的代码。 ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们 的关系。

resultMap
  • constructor - 类在实例化时,用来注入结果到构造方法中
    • idArg - ID 参数;标记结果作为 ID 可以帮助提高整体效能
    • arg - 注入到构造方法的一个普通结果
  • id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能
  • result – 注入到字段或 JavaBean 属性的普通结果
  • association – 一个复杂的类型关联;许多结果将包成这种类型
    • 嵌入结果映射 – 结果映射自身的关联,或者参考一个
  • collection – 复杂类型的集
    • 嵌入结果映射 – 结果映射自身的集,或者参考一个
  • discriminator – 使用结果值来决定使用哪个结果映射
    • case – 基于某些值的结果映射
      • 嵌入结果映射 – 这种情形结果也映射它本身,因此可以包含很多相 同的元素,或者它可以参照一个外部的结果映射。

association:

表示“有一个”的关系

我们新添加一个类

package org.ygy.model;

import java.util.Date;

import org.ygy.util.Configs;
import org.ygy.util.DateUtil;

/**
 * 博客类
 * @author yuguiyang
 *
 */
public class Blog {
	private int id;//ID,自动增长
	private String title;//标题
	private String content;//内容
	private Date reportTime;//发布时间
	private User author;//作者

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
	
	public Date getReportTime() {
		return reportTime;
	}

	public void setReportTime(Date reportTime) {
		this.reportTime = reportTime;
	}

	public User getAuthor() {
		return author;
	}

	public void setAuthor(User author) {
		this.author = author;
	}

	@Override
	public String toString() {
		return "Blog [id=" + id + ", title=" + title + ", content=" + content
				+ ", report_time=" + DateUtil.fromDate(reportTime, Configs.CURRENTTIME) + ", author=" + author + "]";
	}
	
}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<mapper namespace="org.ygy.mapper.BlogMapper">
	
	<resultMap type="Blog" id="BlogMap">
		<id column="blog_id" property="id"/>
		<result column="title" property="title"/>
		<result column="b_content" property="content"/>
		<result column="reportTime" property="reportTime"></result>
		
		<!-- 每一个Blog都只有一个author ,  -->
		<association column="author_id" property="author" javaType="User">
			<id column="user_id" property="id"/>
			<result column="name" property="name"></result>	
		</association>
	</resultMap>

	<select id="queryAll" resultMap="BlogMap">
		select b.id as blog_id, b.title , b.b_content,b.reportTime , u.id as user_id , u.name from t_blog b
		left outer join t_user u on b.author_id = u.id 
	</select>
	
	<sql id="baseColumn">
		title , b_content , author_id , reportTime
	</sql>
	
	<!-- 插入一条记录 -->
	<insert id="insert" parameterType="Blog">
		insert into t_blog
		(<include refid="baseColumn"/>)
		values(#{title} , #{content} , #{author.id} , #{reportTime})
	</insert>
	
	<!-- 更新记录 -->
	<update id="update" parameterType="Blog">
		update t_blog
		<set>
			<if test="title != null">title = #{title}</if>
			<if test="content != null">b_content = #{content}</if>
			<if test="report_time != null">reportTime = #{reportTime}</if>
		</set>
		where id=#{id}
	</update>
</mapper>

关联元素处理“有一个”类型的关系。比如,在我们的示例中,一个博客有一个用户。关联映射就工作于这种结果之上。你指定了目标属性,来获取值的列,属性的 java 类型(很多情况下 MyBatis 可以自己算出来),如果需要的话还有 jdbc 类型,如果你想覆盖或获取的结果值还需要类型控制器。

关联中不同的是你需要告诉 MyBatis 如何加载关联。MyBatis 在这方面会有两种不同的方式:

  • 嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型。
  • 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集。首先,然让我们来查看这个元素的属性。所有的你都会看到,它和普通的只由 select 和

resultMap 属性的结果映射不同。

上面使用的应该算是嵌套结果,下面写一个嵌套查询的例子:

<resultMap type="Blog" id="blogMap_2">
		<id column="id" property="id"/>
		<result column="title" property="title"/>
		<result column="b_content" property="content"/>
		<result column="reportTime" property="reportTime"></result>
		
		<association column="author_id" property="author" javaType="User" select="selectUser" />
	</resultMap>
	
	<select id="selectBlog" resultMap="blogMap_2">
		select * from t_blog 
	</select>
	
	<select id="selectUser" parameterType="int" resultType="User">
		select id , name from t_user where id=#{id}
	</select>

collection

<resultMap type="User" id="userMap">
		<id column="id" property="id"/>
		<result column="name" property="name"/>
		
		<collection property="blogList" ofType="Blog">
			<id column="blog_id" property="id"/>
			<result column="title" property="title"/>
			<result column="b_content" property="content"/>
			<result column="reportTime" property="reportTime"/>
		</collection>
	</resultMap>
	
	<select id="selectUserBlog" resultMap="userMap">
		select u.id , u.name , b.id as blog_id, b.title , b.b_content ,b.reportTime from t_user u
		left outer join t_blog b on u.id=b.author_id 
	</select>
在User类中添加的List<Blog> blogList;
package org.ygy.model;

import java.util.List;

/**
 * 用户
 * @author yuguiyang
 *
 */
public class User {
	private Integer id;//自动增长的ID
	private String name;//用户名
	private String password;//密码
	private String email;//邮箱
	private Integer age;//年龄
	private Integer gender;//性别,0-男 ; 1-女
	private List<Blog> blogList;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public Integer getGender() {
		return gender;
	}

	public void setGender(Integer gender) {
		this.gender = gender;
	}
	
	public List<Blog> getBlogList() {
		return blogList;
	}

	public void setBlogList(List<Blog> blogList) {
		this.blogList = blogList;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", password=" + password
				+ ", email=" + email + ", age=" + age + ", gender=" + gender
				+ ", blogList=" + blogList + "]";
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值