Mybatis-Mapper映射文件的映射方式以及映射关系

一、一对一映射关系

  • 举例: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),
          dob date ,
          phone varchar2(15),  
          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 
    
        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  john@gmail.com  123-456-7890   1 
           2    Paul  paul@gmail.com  111-222-3333   2 
    		
        insert into students(stud_id,name,email,phone,addr_id) values(1,'John','john@gmail.com','123-456-7890',1);
        insert into students(stud_id,name,email,phone,addr_id) values(2,'Paul','paul@gmail.com','111-222-3333',2);
    
  • 映射xml文件查询结果普通方式封装resultMap:

    <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, dob, phone, 
        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=#{id}
    </select> 
    
    //接口定义 
    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()); 
    
    • 如果select语句单独封装成Address对象,需要单独重新配置封装Address对象
  • 为了解决普通封装对象的关联映射需要重新配置封装Address对象,提供了一对一关联映射的另外两种方式:

    • resultMap,嵌套结果:一个是映射结果中引用其他映射结果
    • select,嵌套查询:将级联查询分解为多个简单查询,使用简单查询的结果当作另一查询条件,完成级联查询
  • 使用【嵌套结果】ResultMap,实现一对一关系映射

使用嵌套结果ResultMap方式来获取Student及其Address信息,代码如下:
<!-- 独立的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> 

<!-- Student封装映射,里面关联上Address的封装映射 -->
<resultMap type="Student" id="StudentWithAddressResult"> 
  <id property="studId" column="stud_id" /> 
  <result property="name" column="name" /> 
  <result property="email" column="email" /> 
  <result property="dob" column="dob" /> 
  <result property="phone" column="phone" />
  <association property="address" resultMap="AddressResult" /> 
</resultMap>

<select id
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值