MyBatis的一对一关联关系映射
2020-03-21 16:02:15来源:博客园 阅读 ()
MyBatis的一对一关联关系映射
原文链接: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
原文链接:https://www.cnblogs.com/yiidian/p/12536428.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- MyBatis中的$和#,用不好,准备走人! 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 天哪!手动编写mybatis雏形竟然这么简单 2020-06-06
- MyBatis整合双数据源 2020-06-04
- MyBatis缓存特性详解 2020-06-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash