一、一对一映射关系
-
举例: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