Python 官方文档:入门教程 => 点击学习
目录 一、一对一映射(One-to-One) 1.1 表关系 1.2 resultMap设置自定义映射 二、一对多映射(One-to-Many) 2.1 创建实体 2.2 级联方式处理映射关系 2.3 定义SQL 2.4 OrderMap
目录
一对一映射是指一个对象与另一个对象具有一对一的关系。例如,一个用户(User)与一个地址(Address)之间的关系。假设我们有以下表结构:
user 表:
id (int)name (varchar)address_id (int)
address 表:
id (int)street (varchar)city (varchar)
首先,创建 User 和 Address 实体类:
User.java
public class User { private int id; private String name; private Address address; // getters and setters}
Address.java
public class Address { private int id; private String street; private String city; // getters and setters}
接下来,创建一个 resultMap 进行一对一映射:
UserMapper.xml
//一对一关系使用association
属性:
子标签:
子标签属性:
最后,编写一个查询方法来使用这个 resultMap:
UserMapper.xml
SELECT u.id, u.name, a.id as address_id, a.street, a.city FROM user u INNER JOIN address a ON u.address_id = a.id WHERE u.id = #{id}
最后实现接口findUserWithAddress方法测试即可,通过以上简单的案例,我相信你已经明白自定义关系映射了。往往实际开发中数据和表是要复杂的多,进阶用法请看以下示例:
一对多映射是指一个对象与多个对象具有一对多的关系。例如,一个订单(Oeder)与一个订单详情(OrderItem)之间的关系。假设我们有以下表结构:
利用mybatis逆向工程(generatorConfig.xml)生成模型层代码 :
创建 OrderVo
它是一个值对象(Value Object),继承 Order
类并添加了一个额外的属性 orderItems
。该类用于在应用程序的各个层之间传递数据,尤其是在表示层和业务逻辑层之间。在这个例子中,OrderVo
类用于表示一个订单及其关联的订单项。
package com.ycxw.vo;import com.ycxw.model.Order;import com.ycxw.model.OrderItem;import lombok.Data;import java.util.ArrayList;import java.util.List;@Datapublic class OrderVo extends Order { private List orderItems = new ArrayList<>();}
//多关系使用collection
package com.ycxw.mapper;import com.ycxw.model.Order;import com.ycxw.vo.OrderVo;import org.apache.ibatis.annotations.Param;import org.springframework.stereotype.Repository;@Repositorypublic interface OrderMapper { OrderVo SelectByOid(@Param("oid") Integer oid);}
OrderItmeBiz 接口
package com.ycxw.biz;import com.ycxw.vo.OrderItemVo;public interface OrderItmeBiz { OrderItemVo SelectByOitemId(Integer oiid);}
OrderBizImpl 接口实现类
package com.ycxw.biz.impl;import com.ycxw.biz.OrderBiz;import com.ycxw.mapper.OrderMapper;import com.ycxw.vo.OrderVo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class OrderBizImpl implements OrderBiz { @Autowired private OrderMapper orderMapper; @Override public OrderVo SelectByOid(Integer oid) { return orderMapper.SelectByOid(oid); }}
package com.ycxw.biz.impl;import com.ycxw.biz.OrderBiz;import com.ycxw.vo.OrderVo;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})public class OrderBizImplTest { @Autowired private OrderBiz orderBiz; @Test public void selectByOid() { OrderVo orderVo = orderBiz.SelectByOid(8); //获取订单 System.out.println(orderVo); //获取订单项信息 orderVo.getOrderItems().forEach(System.out::println); }}
运行结果:
多对多映射是指多个对象与多个对象具有多对多的关系。表之间的多对多关系稍微复杂,需要一个中间表来表示:
中间表有三个字段,其中两个字段分别作为外键指向各自一方的主键,由此通过中间表来表示多对多关系,通过一个表联合另一个中间表可以表示为一对多关系。
如:根据书籍id查找关联属性类别:
利用mybatis逆向工程(generatorConfig.xml)生成模型层代码 :
创建 HBookVo 值对象(Value Object)
package com.ycxw.vo;import com.ycxw.model.BookCateGory;import com.ycxw.model.HBook;import lombok.Data;import java.util.List;@Datapublic class HBookVo extends HBook { private List bookc = new ArrayList<>();}
HBookVo selectByBookId(@Param("bid") Integer bid);
HBookBiz 接口
package com.ycxw.biz;import com.ycxw.vo.HBookVo;public interface HBookBiz { HBookVo selectByBookId(Integer bid);}
HBookBizImpl 接口实现类
package com.ycxw.biz.impl;import com.ycxw.biz.HBookBiz;import com.ycxw.mapper.HBookMapper;import com.ycxw.vo.HBookVo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class HBookBizImpl implements HBookBiz { @Autowired private HBookMapper hBookMapper; @Override public HBookVo selectByBookId(Integer bid) { return hBookMapper.selectByBookId(bid); }}
package com.ycxw.biz.impl;import com.ycxw.biz.HBookBiz;import com.ycxw.vo.HBookVo;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})public class OrderBizImplTest { @Autowired private HBookBiz hBookBiz; @Test public void selectByBookId(){ HBookVo hBookVo = hBookBiz.selectByBookId(22); //数据所有信息 System.out.println(hBookVo); //书籍有关的类别 System.out.println(hBookVo.getBookc()); }}
反之亦然,如:根据类别id查找书籍信息
测试运行:
来源地址:https://blog.csdn.net/Justw320/article/details/132512497
--结束END--
本文标题: 【MyBatis】自定义resultMap三种映射关系
本文链接: https://lsjlt.com/news/392227.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0