原文链接: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