原文鏈接:http://www.yiidian.com/mybatis/one-to-one.html
1 什麼是一對一、一對多映射?
以用戶和訂單舉例,
一對一 : 一個訂單隻屬於一個用戶 ==> 訂單對用戶是一對一關係
一對多 : 一個用戶可以擁有多個訂單 ==> 用戶對訂單是一對多關係
注意:在MyBatis中,如果要完成多對多關係,其實就是兩個一對多映射!
接下來先講解MyBatis的一對一映射如何實現。
2 建立表結構
2.1 創建用戶表
CREATE TABLE `t_user` (
`id` int(11) DEFAULT NULL,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2.2 創建訂單表
CREATE TABLE `t_order` (
`id` int(11) DEFAULT NULL,
`orderno` varchar(100) DEFAULT NULL,
`amount` double DEFAULT NULL,
`user_id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2.3 插入測試數據
3 設計Pojo實體,建立關係
3.1 用戶實體類
package com.yiidian.domain;
import java.util.List;
/**
* 用戶實體
* 一點教程網 - www.yiidian.com
*/
public class User {
private Integer id;
private String username;
public void setOrders(List<Order> orders) {
this.orders = orders;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3.2 訂單實體類
package com.yiidian.domain;
/**
* 訂單實體
* 一點教程網 - www.yiidian.com
*/
public class Order {
private Integer id;
private String orderno;
private Double amount;
private User user;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrderno() {
return orderno;
}
public void setOrderno(String orderno) {
this.orderno = orderno;
}
public Double getAmount() {
return amount;
}
public void setAmount(Double amount) {
this.amount = amount;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
Order實體類,通過user屬性建立跟User實體的關係。注意,這裏是一個User。
4 編寫Dao接口
4.1 UserDao接口
package com.yiidian.dao;
import com.yiidian.domain.User;
import java.util.List;
/**
* 用戶Dao接口
* 一點教程網 - www.yiidian.com
*/
public interface UserDao {
}
4.2 OrderDao接口
package com.yiidian.dao;
import com.yiidian.domain.Order;
import com.yiidian.domain.User;
import java.util.List;
/**
* 訂單Dao接口
* 一點教程網 - www.yiidian.com
*/
public interface OrderDao {
/**
* 查詢所有訂單
*/
public List<Order> findAllOrders();
}
5 編寫Dao映射配置
5.1 UserDao.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace: 用於指定該映射文件需要映射的Dao接口
-->
<mapper namespace="com.yiidian.dao.UserDao">
</mapper>
5.2 OrderDao.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace: 用於指定該映射文件需要映射的Dao接口
-->
<mapper namespace="com.yiidian.dao.OrderDao">
<!--一對一映射-->
<resultMap id="OrderResultMap" type="com.yiidian.domain.Order">
<id property="id" column="oid"/>
<result property="orderno" column="orderno"/>
<result property="amount" column="amount"/>
<!--關聯查詢訂單所屬的用戶-->
<association property="user" column="id" javaType="com.yiidian.domain.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</association>
</resultMap>
<select id="findAllOrders" resultMap="OrderResultMap">
SELECT
o.id oid,
o.orderno orderno,
o.amount amount,
u.*
FROM t_order o
LEFT JOIN t_user u
ON o.user_id = u.id
</select>
</mapper>
- association:用在一對一關聯映射
- property:對應Order類的user屬性
- column:對應外鍵字段名稱
- javaType:User類的全限定名稱
6 編寫測試類
package com.yiidian.mybatis;
import com.yiidian.dao.OrderDao;
import com.yiidian.domain.Order;
import com.yiidian.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/**
* MyBatis測試類 - 一對一映射
* 一點教程網 - www.yiidian.com
*/
public class TestOne2One {
/**
* 測試一對一映射
*/
@Test
public void testOrderDao(){
//1.獲取SqlSession對象
SqlSession sqlSession = MyBatisUtils.getSession();
//2.創建Mapper代理對象
OrderDao orderDao = sqlSession.getMapper(OrderDao.class);
//3.調用方法
List<Order> list = orderDao.findAllOrders();
System.out.println(list);
//4.關閉連接
sqlSession.close();
}
}
7 運行測試類
以debug模式啓動測試類,查看list變量的情況,可以看到Order對象中成功封裝了User對象的數據!
源碼下載:https://pan.baidu.com/s/1jZrfapjqB_VHI_GLgKPo4g
歡迎關注我的公衆號::一點教程。獲得獨家整理的學習資源和日常乾貨推送。 如果您對我的系列教程感興趣,也可以關注我的網站:yiidian.com