首先在數據庫中新增地址表(t_address)用於存儲人員的地址信息:java
1 CREATE TABLE `t_address` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `country` varchar(100) DEFAULT NULL, 4 `city` varchar(100) DEFAULT NULL, 5 `district` varchar(100) DEFAULT NULL, 6 PRIMARY KEY (`id`) 7 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
而後在人員信息表(t_person)中增長addressId字段:sql
1 ALTER TABLE t_person ADD addressId int(11); 數據庫
在com.Aiden.domain中新增地址信息的實體類(Address.java):apache
1 package com.Aiden.domain; 2
3 public class Address { 4
5 private Integer id; 6 private String country; 7 private String city; 8 private String district; 9 public Address() { 10 super(); 11 } 12 public Address(String country, String city, String district) { 13 super(); 14 this.country = country; 15 this.city = city; 16 this.district = district; 17 } 18 public Address(Integer id, String country, String city, String district) { 19 super(); 20 this.id = id; 21 this.country = country; 22 this.city = city; 23 this.district = district; 24 } 25 public Integer getId() { 26 return id; 27 } 28 public void setId(Integer id) { 29 this.id = id; 30 } 31 public String getCountry() { 32 return country; 33 } 34 public void setCountry(String country) { 35 this.country = country; 36 } 37 public String getCity() { 38 return city; 39 } 40 public void setCity(String city) { 41 this.city = city; 42 } 43 public String getDistrict() { 44 return district; 45 } 46 public void setDistrict(String district) { 47 this.district = district; 48 } 49 @Override 50 public String toString() { 51 return "Address [id=" + id + ", country=" + country + ", city=" + city + ", district=" + district + "]"; 52 } 53 }
在com.Aiden.dao中新增地址信息的接口(addressMapper.java):session
package com.Aiden.dao; public interface addressMapper {}
在com.Aiden.dao中新增地址信息的映射文件(addressMapper.xml):mybatis
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <mapper namespace="com.Aiden.dao.addressMapper">
6 </mapper>
在Person實體類中增長address屬性並添加get、set方法:app
1 private Address address; 2
3 public Address getAddress() { 4 return address; 5 } 6 public void setAddress(Address address) { 7 this.address = address; 8 }
在com.Aiden.service包中建立新的Junit測試類(MyBatisDemo02.Java),並添加測試方法:dom
1 package com.Aiden.service; 2
3 import static org.junit.Assert.*; 4
5 import java.util.List; 6
7 import org.apache.ibatis.session.SqlSession; 8 import org.apache.log4j.Logger; 9 import org.junit.After; 10 import org.junit.Before; 11 import org.junit.Test; 12
13 import com.Aiden.dao.personMapper; 14 import com.Aiden.domain.Person; 15 import com.Aiden.util.SqlSessionFactoryUtil; 16 /**
17 * 一對1、一對多關係映射 18 * @author 郭祥躍 19 * 20 */
21 public class MybatisDemo02 { 22 private static Logger logger=Logger.getLogger(MybatisDemo02.class); 23 private static SqlSession sqlSession=null; 24 private static personMapper personMapper=null; 25
26 @Before 27 public void setUp() throws Exception { 28 sqlSession=SqlSessionFactoryUtil.openSession(); 29 System.out.println(sqlSession); 30 personMapper=sqlSession.getMapper(personMapper.class); 31 } 32
33 @After 34 public void tearDown() throws Exception { 35 sqlSession.close(); 36 } 37
38 @Test 39 public void testFindPersonWithAddressById() { 40 logger.info("一對多關係映射"); 41 List<Person> person=personMapper.findPersonWithAddressById(3); 42 System.out.println(person); 43 } 44
45 }
在personMapper.java文件中添加新的接口(findPersonWithAddressById):ide
1 /**
2 * 根據ID查詢人員及地址信息 3 * @param id 4 * @return
5 */
6 public List<Person> findPersonWithAddressById(Integer id);
在personMapper.xml文件中添加select查詢:測試
1 <select id="findPersonWithAddressById" parameterType="Integer" resultMap="resultPersonWithAddress">
2 select * from t_person tp,t_address ta where tp.addressId=ta.id and tp.id=#{id} 3 </select>
添加resultMap返回結果:此處resultMap標籤有幾種不一樣的實現,記之以下:
第一種:
1 <resultMap type="Person" id="resultPersonWithAddress">
2 <id property="id" column="id"/>
3 <result property="name" column="name"/>
4 <result property="age" column="age"/>
5
6 <result property="address.id" column="id"/>
7 <result property="address.country" column="country"/>
8 <result property="address.city" column="city"/>
9 <result property="address.district" column="district"/>
10 </resultMap>
查詢結果:
第二種:
1 <resultMap type="Person" id="resultPersonWithAddress">
2 <id property="id" column="id"/>
3 <result property="name" column="name"/>
4 <result property="age" column="age"/>
5
6 <association property="address" resultMap="resultAddress"/>
7 </resultMap>
8 <resultMap type="Address" id="resultAddress">
9 <id property="id" column="id"/>
10 <result property="country" column="country"/>
11 <result property="city" column="city"/>
12 <result property="district" column="district"/>
13 </resultMap>
查詢結果:
第三種:
1 <resultMap type="Person" id="resultPersonWithAddress">
2 <id property="id" column="id" />
3 <result property="name" column="name" />
4 <result property="age" column="age" />
5
6 <association property="address" javaType="Address">
7 <id property="id" column="id" />
8 <result property="country" column="country" />
9 <result property="city" column="city" />
10 <result property="district" column="district" />
11 </association>
12 </resultMap>
查詢結果:
第四種(最經常使用):
這種方法藉助於Address的查詢方法進行實現:
首先在addressMapper.java接口文件中,添加查詢的接口:
1 package com.Aiden.dao; 2
3 import com.Aiden.domain.Address; 4
5 public interface addressMapper { 6 /**
7 * 根據ID查詢地址消息 8 * @param id 9 * @return
10 */
11 public Address findById(Integer id); 12 }
而後在addressMapper.xml中添加select標籤:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <mapper namespace="com.Aiden.dao.addressMapper">
6
7 <select id="findAddressById" parameterType="Integer" resultType="Address">
8 select * from t_address where id=#{id} 9 </select>
10
11 </mapper>
修改personMapper.xml中的resultMap爲:
1 <resultMap type="Person" id="resultPersonWithAddress">
2 <id property="id" column="id" />
3 <result property="name" column="name" />
4 <result property="age" column="age" />
5 <association property="address" column="addressId" select="com.Aiden.dao.addressMapper.findAddressById"/>
6 </resultMap>
查詢結果:
簡單的說一對多的關係能夠用多個一對一關係實現。
首先在數據庫中新增公司信息表(t_company)用於存儲人員的地址信息:
1 CREATE TABLE `t_company` ( 2 `Id` int(11) NOT NULL AUTO_INCREMENT, 3 `companyName` varchar(100) DEFAULT NULL, 4 PRIMARY KEY (`Id`) 5 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
而後在人員信息表(t_person)中增長addressId字段:
1 ALTER TABLE t_person ADD companyId int(11);
在com.Aiden.domain中新增公司信息的實體類(Company.java):
1 package com.Aiden.domain; 2
3 import java.util.List; 4
5 public class Company { 6 private Integer id; 7 private String companyName; 8 private List<Person> persons; 9 public Company() { 10 super(); 11 } 12 public Company(String companyName) { 13 super(); 14 this.companyName = companyName; 15 } 16 public Company(Integer id, String companyName) { 17 super(); 18 this.id = id; 19 this.companyName = companyName; 20 } 21 public Integer getId() { 22 return id; 23 } 24 public void setId(Integer id) { 25 this.id = id; 26 } 27 public String getCompanyName() { 28 return companyName; 29 } 30 public void setCompanyName(String companyName) { 31 this.companyName = companyName; 32 } 33 public List<Person> getPersons() { 34 return persons; 35 } 36 public void setPersons(List<Person> persons) { 37 this.persons = persons; 38 } 39 @Override 40 public String toString() { 41 return "Company [id=" + id + ", companyName=" + companyName + "]"; 42 } 43 }
在com.Aiden.dao中新增公司信息的接口(companyMapper.java):
1 package com.Aiden.dao; 2
3 import com.Aiden.domain.Company; 4
5 public interface companyMapper { 6 /**
7 * 根據ID查詢公司詳情 8 * @param id 9 * @return
10 */
11 public Company findCompanyById(Integer id); 12
13 }
在com.Aiden.dao中新增公司信息的映射文件(companyMapper.xml):
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <mapper namespace="com.Aiden.dao.companyMapper">
6
7 <resultMap type="Company" id="resultCompany">
8 <id property="id" column="id"/>
9 <result property="companyName" column="companyName"/>
10 <collection property="persons" column="id" select="com.Aiden.dao.personMapper.findPersonWithByCompanyId"/>
11 </resultMap>
12
13 <select id="findCompanyById" parameterType="Integer" resultMap="resultCompany">
14 select * from t_company where id=#{id} 15 </select>
16
17 </mapper>
在person實體類中添加company屬性及get、set方法:
1 private Company company; 2
3 public Company getCompany() { 4 return company; 5 } 6 public void setCompany(Company company) { 7 this.company = company; 8 }
在personMapper.java中添加新的查詢接口:
/** * 根據公司Id查詢人員信息 * @param id * @return
*/
public List<Person> findPersonWithByCompanyId(Integer companyId);
在personMapper.xml添加查詢select及resultMap:
1 <select id="findPersonWithByCompanyId" parameterType="Integer" resultMap="resultPersonWithCompany">
2 select * from t_person where companyId=#{companyId} 3 </select>
4
5
6 <resultMap type="Person" id="resultPersonWithCompany">
7 <id property="id" column="id" />
8 <result property="name" column="name" />
9 <result property="age" column="age" />
10 <association property="address" column="addressId" select="com.Aiden.dao.addressMapper.findAddressById"/>
11 <association property="company" column="companyId" select="com.Aiden.dao.companyMapper.findCompanyById"/>
12 </resultMap>
在測試類MybatisDemo02.java中添加測試方法,運行:
1 @Test 2 public void testFindPersonWithByCompanyId() { 3 logger.info("一對多關係映射——根據公司ID查詢人員"); 4 List<Person> person=personMapper.findPersonWithByCompanyId(1); 5 for (Person p : person) { 6 System.out.println(p); 7 } 8 }
運行結果: