Mybatis学习笔记-三、mybatis三种映射

三、mybatis三种映射

3.4 一对一映射

Student和Address是一个【一对一】关系
建表语言:

drop table students;
drop table addresses;

如果需要可以使用 cascade constraints;

create table addresses(
  addr_id number primary key,
  street varchar2(50) not null,
  city varchar2(50) not null,
  state varchar2(50) not null,
  zip varchar2(10),
  country varchar2(50)
);

create table students(
  stud_id number primary key,
  name varchar2(50) not null,
  email varchar2(50),
  phone varchar2(15),  
  dob date ,
  addr_id number references addresses(addr_id)
);

java类:

public class PhoneNumber {
   
	private String countryCode;
	private String stateCode;
	private String number;
	get/set
}
public class Address{
   
	private Integer addrId;
	private String street;
	private String city;
	private String state;
	private String zip;
	private String country;
	get/set
}
public class Student {
   
	private Integer studId; 
	private String name; 
	private String email; 
	private Date dob;
	private PhoneNumber phone;
	private Address address;
	get/set
}

addresses 表的样例输入如下所示:
addr_id street city state zip country
1 redSt kunshan W 12345 china
2 blueST kunshan W 12345 china

// An highlighted block
var foo = 'bar';
insert into addresses(addr_id,street,city,state,zip,country) values(1,'redSt','kunshan','W','12345','china');
insert into addresses(addr_id,street,city,state,zip,country) values(2,'blueST','kunshan','W','12345','china');

students 表的样例数据如下所示:
stud_id name email phone addr_id
1 John [email protected] 123-456-7890 1
2 Paul [email protected] 111-222-3333 2

insert into students(stud_id,name,email,phone,addr_id) values(1,'John','[email protected]','123-456-7890',1);
insert into students(stud_id,name,email,phone,addr_id) values(2,'Paul','[email protected]','111-222-3333',2);

mapper XML:

<resultMap type="Student" id="StudentWithAddressResult"> 
  <id property="studId" column="stud_id" /> 
  <result property="name" column="name" /> 
  <result property="email" column="email" /> 
  <result property="phone" column="phone" /> 
  <result property="address.addrId" column="addr_id" /> 
  <result property="address.street" column="street" /> 
  <result property="address.city" column="city" /> 
  <result property="address.state" column="state" /> 
  <result property="address.zip" column="zip" /> 
  <result property="address.country" column="country" /> 
</resultMap> 
<select id="selectStudentWithAddress" parameterType="int" resultMap="StudentWithAddressResult"> 
	select stud_id, name, email, a.addr_id, street, city, state, zip, country 
	from students s left outer join addresses a on  
		s.addr_id=a.addr_id 
	where stud_id=#{
   studid} 
</select> 

我们可以使用(对象.属性名)的方式为内嵌的对象的属性赋值。在上述的resultMap中,Student的address属性使用该方式被赋上了 address 对应列的值。同样地,我们可以访问【任意深度】的内嵌对象的属性。

//接口定义 
public interface Student Mapper{
    
	Student selectStudentWithAddress(int studId); 
} 

//方法调用
int studId = 1; 
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); 
Student student = studentMapper.selectStudentWithAddress(studId); 
System.out.println("Student :" + student); 
System.out.println("Address :" + student.getAddress()); 

上面展示了一对一关联映射的一种方法。然而,使用这种方式映射,如果address结果需要在其他的SELECT映射语句中映射成Address对象,我们需要为每一个语句重复这种映射关系。MyBatis提供了更好地实现一对一关联映射的方法:【嵌套结果】ResultMap和【嵌套查询】select语句。接下来,我们将讨论这两种方式。

3.4.1 使用嵌套结果ResultMap实现一对一关系映射

我们可以使用一个嵌套结果ResultMap方式来获取Student及其Address信息,代码如下:

<resultMap type="Address" id="AddressResult"> 
  <id property="addrId" column="addr_id" /> 
  <result property="street" column="street" /> 
  <result property="city" column="city" /> 
  <result property="state" column="state" /> 
  <result property="zip" column="zip" /> 
  <result property="country" column="country" /> 
</resultMap> 
<resultMap type="Student" id="StudentWithAddressResult"> 
  <id property="studId" column="stud_id" /> 
  <result property="name" column="name" /> 
  <result property="email" column="email" /> 
  <association property="address" resultMap="AddressResult" /> 
</resultMap>
<select id="findStudentWithAddress" parameterType="int" resultMap="StudentWithAddressResult"> 
	select stud_id, name, email, a.addr_id, street, city, state, 
	zip, country 
	from students s left outer join addresses a on  
	s.addr_id=a.addr_id 
	where stud_id=#{
   studid} 
</select> 
注:association是关联的意思
元素<association>被用来导入“有一个”(has-one)类型的关联。在上
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值