一、使用嵌套结果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映射文件

  


	
		
		
		
		
		
		
		
		
	
	
		
		
		
	
	
		
		
		
	
	
	
		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}
	

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映射文件



	
	
	



	select teamName,teamUser from teamInfo where userId = #{userId}



	
	
	



	select updateDate,uploadDate from worksInfo where userId = #{userId}



	
	
	
	
	
	
	



	select * from user where id = #{id}

测试方法:

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());
	}
}

注意:

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