一、使用嵌套结果ResultMap方式来处理一对一映射,详见代码

1)实体

package com.tarena.djs.entity;

import java.io.Serializable;
import java.util.Date;
/**
 * 用户
 */
public class User implements Serializable{
	private static final long serialVersionUID = 112596782083832677L;
	private Integer id;			//编号
	private String email; 		        //邮箱
	private String realName; 	        //真实姓名
	private String telephone;               //电话号码
	private String password;                //密码
	
	private TeamInfo teamInfo ;             //团队信息
	private WorksInfo worksInfo; 	        //作品信息
	
	// 以下是get,set方法
	...	
}
/**
 * 队伍信息
 */
 public class TeamInfo implements Serializable{
	private static final long serialVersionUID = -595214407157962899L;
	private Integer id;		 //队伍编号
	private Integer userId;  //队长id
	private String teamName; //队伍名称
	private String teamUser; //队伍成员信息
	// 以下是get,set方法
	...	
 }	
 
/**
 * 参赛作品信息
 */ 
 public class WorksInfo implements Serializable{
	private static final long serialVersionUID = 1610181029330869297L;
	private Date uploadDate; // 上传时间
	private Date updateDate; // 更新时间
	// 以下是get,set方法
	...
 }

2)dao层接口

package com.tarena.djs.dao;

import com.tarena.djs.annotation.MyBatisReponsitory;
import com.tarena.djs.entity.User;

@MyBatisReponsitory
public interface TestDao {
	/**
	 * result嵌套实现一对一映射
	 * @param id
	 * @return
	 */
	User getUserWithTeamInfoAndWroksInfo(Integer id);
}

3)dao层mapper映射文件

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.tarena.djs.dao.TestDao">
	<resultMap type="com.tarena.djs.entity.User" id="userWithTeamInfoAndWorksInfoResult">
		<id property="id" column="id"/>
		<result property="email" column="email"/>
		<result property="realName" column="realName"/>
		<result property="telephone" column="telephone"/>
		<result property="password" column="password"/>
		<!-- 元素association被用来导入一个“has-one”类型的关联 -->
		<association property="teamInfo" resultMap="teamInfoResultMap"/>
		<association property="worksInfo" resultMap="worksInfoResultMap"/>
	</resultMap>
	<resultMap type="com.tarena.djs.entity.TeamInfo" id="teamInfoResultMap">
		<id property="id" column="id"/>
		<result property="teamName" column="teamName"/>
		<result property="teamUser" column="teamUser"/>
	</resultMap>
	<resultMap type="com.tarena.djs.entity.WorksInfo" id="worksInfoResultMap">
		<id property="id" column="id"/>
		<result property="uploadDate" column="uploadDate"/>
		<result property="updateDate" column="updateDate"/>
	</resultMap>
	<!--  result嵌套实现一对一映射  -->
	<select id="getUserWithTeamInfoAndWroksInfo" parameterType="int" resultMap="userWithTeamInfoAndWorksInfoResult">
		select u.id,u.email,u.realName,u.telephone,u.password,t.id tid ,t.userId,t.teamName,t.teamUser,w.uploadDate,w.updateDate
		from user u left join teamInfo t on u.id = t.userId 
		left join worksInfo w on u.id = w.userId
		where u.id = #{id}
	</select>
</mapper>

4)测试方法

package com.tarena.djs.util;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.tarena.djs.dao.TestDao;
import com.tarena.djs.entity.User;
import com.tarena.djs.service.test.TestMybatisService;

public class Test {
	/**
	 * 嵌套实现一对一映射
	 */
	@Test
	public void test1(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("config/applicationContext.xml");
		TestDao tms = ac.getBean("testDao",TestDao.class);
		User user = tms.getUserWithTeamInfoAndWroksInfo(460);
		System.out.println(user);
		System.out.println(user.getTeamInfo().getTeamName()+"---"+user.getTeamInfo().getTeamUser());
		System.out.println(user.getWorksInfo().getUpdateDate()+"----"+user.getWorksInfo().getUploadDate());
	}
}

二、使用嵌套查询的方式实现一对一映射

1)实体信息如上

2)dao层接口如上

3)dao层mapper映射文件

<!--teamInfo resultMap定义-->
<resultMap type="com.tarena.djs.entity.TeamInfo" id="teamInfoResultMap">
	<id property="id" column="id"/>
	<result property="teamName" column="teamName"/>
	<result property="teamUser" column="teamUser"/>
</resultMap>
<!-- teamInfo查询语句 -->
<select id="findTeamInfoByUserId" parameterType="int" resultMap="teamInfoResultMap">
	select teamName,teamUser from teamInfo where userId = #{userId}
</select>
<!--worksInfo resultMap定义-->
<resultMap type="com.tarena.djs.entity.WorksInfo" id="worksInfoResultMap">
	<id property="userId" column="userId"/>
	<result property="uploadDate" column="uploadDate"/>
	<result property="updateDate" column="updateDate"/>
</resultMap>
<!-- worksInfo查询语句-->
<select id="findWorksInfoByUserId" parameterType="int" resultMap="worksInfoResultMap">
	select updateDate,uploadDate from worksInfo where userId = #{userId}
</select>
<!-- 嵌套查询的方式实现一对一映射 -->
<resultMap type="com.tarena.djs.entity.User" id="userWithTeamInfoAndWorksInfoResult1">
	<id property="id" column="id"/>
	<result property="email" column="email"/>
	<result property="realName" column="realName"/>
	<result property="telephone" column="telephone"/>
	<result property="password" column="password"/>
	<association property="teamInfo" column="id" select="findTeamInfoByUserId"/>
	<association property="worksInfo" column="id" select="findWorksInfoByUserId"/>
</resultMap>
<!--user查询-->
<select id="findUserWithTeamInfoAndWroksInfo" parameterType="int" resultMap="userWithTeamInfoAndWorksInfoResult1">
	select * from user where id = #{id}
</select>

测试方法:

package com.tarena.djs.util;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.tarena.djs.dao.TestDao;
import com.tarena.djs.entity.User;
import com.tarena.djs.service.test.TestMybatisService;

public class TestAPP {
	/**
	 * 嵌套resultMap实现一对一映射
	 */
	@Test
	public void testApp(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("config/applicationContext.xml");
		TestDao tms = ac.getBean("testDao",TestDao.class);
		User user = tms.findUserWithTeamInfoAndWroksInfo(460);
		System.out.println(user);
		System.out.println(user.getTeamInfo().getTeamName()+"---"+user.getTeamInfo().getTeamUser());
		System.out.println(user.getWorksInfo().getUpdateDate()+"----"+user.getWorksInfo().getUploadDate());
	}
}

注意:

在此方式中,两个<association>元素的select 属性被设置成了id 为findTeamInfoByUserId和findWorksInfoByUserId的语句。这里,三个分开的SQL语句将会在数据库中执行,第一个调用 findUserWithTeamInfoAndWorksinfo加载User信息(这个方法名忘了改了,可能会产生歧义),而第二个调用 findTeamInfoByUserId来加载TeamInfo信息,第三个调用findWorksInfoByUserId加载wokrsInfo信息。userId列的值将会被作为输入参数传递给 findTeamInfoByUserId,findWorksInfoByUserId语句