目录
前言
一、关联关系映射的简介
1. 概念
2. 特点
3. 使用场景
二、Mybatis中的一对一&一对多关联关系配置
1. 导入相关的数据库表
2. 多表查询
resultType"java.yutils.Map"方式:
3. 案例部署准备
3.1 生成所需数据库对应的实体类
genreatorConfig.xml 配置实体类信息
三、关联关系案例演示
3.1 一对多的关联关系案例演示
OrderMapper.xml
OrderMapper.java
实体类代码
接口类及接口实现类代码
OrderVo类代码
测试类代码
测试结果
3.2一对一的关联关系案例演示
OrderItemMapper.xml
OrderItemMapper.java
实体类代码
OrderItemVo类代码
接口类及接口实现类代码
测试类代码
测试结果
编辑
3.3 多对多的关联关系案例演示
HBookMapper.xml
HBookMapper.java
实体类代码
HBookVo代码
接口类及接口实现类代码
测试类代码
测试结果
在上一期的博客中我与老铁们分享了有关Mybatis与Spring的集成,领悟到了Spring给 Mybatis带来的便利以及魅力。今天我来带老铁们进入有关Mybatis关联关系映射的世界,一起来领悟这个世界带给我们的震撼,希望老铁们能有所收获。
Mybatis的关联关系映射是一种将数据库表之间的关联关系映射到Java对象之间的技术。它通过配置文件或注解的方式,将数据库表的列与Java对象的属性进行映射,从而实现对象与数据库之间的数据交互。这种映射关系可以是一对一、一对多、多对一或多对多的关系。通过Mybatis的关联关系映射,我们可以方便地进行数据库操作,而不需要手动编写SQL语句。
Mybatis关联关系映射的特点
特点 说明 关联关系映射灵活 Mybatis的关联关系映射非常灵活,可以根据实际需求定义各种类型的关联关系,包括一对一、一对多、多对一和多对多等。 方便开发人员配置 通过Mybatis的配置文件或者注解,可以方便地定义关联关系映射,无需编写繁琐的SQL语句,减少了开发人员的工作量。 有利于项目性能优化 Mybatis的关联关系映射可以进行懒加载和延迟加载,即在需要时才去查询关联对象,提高了系统性能,并减少了不必要的查询操作。 提高效率,减少数据库访问压力 Mybatis支持一级缓存和二级缓存,可以缓存关联对象,提高查询效率,减少数据库的访问压力。 使项目具有扩展性 Mybatis的关联关系映射可以通过自定义TypeHandler等扩展点,满足特定需求的定制化开发。
对象关系映射(ORM):Mybatis可以将数据库表与Java对象进行映射,方便进行对象的持久化操作,简化了数据库操作的编写和管理。
复杂查询:通过关联关系映射,可以方便地进行复杂的查询操作,包括多表关联查询、嵌套查询等,减少了手动编写SQL语句的工作量。
数据库事务管理:Mybatis的关联关系映射可以与数据库事务管理结合使用,实现数据的一致性和完整性。
缓存管理:通过关联关系映射,可以方便地进行缓存管理,提高查询效率,减少数据库的访问压力。
分布式系统:在分布式系统中,Mybatis的关联关系映射可以帮助实现数据的一致性和分布式事务管理。
以上就是我们案例演示所需要的数据库表。
resultType"java.yutils.Map"方式:
该方式多表查询不推荐在公司的项目中使用,针对于自己开发人员开发是有利的,但是针对于公司开发、项目研发团队来说是不利的。
好处:在针对客户需求发生改变的时候(需求1-->需求2(加字段)-->需求3(加字段) ),针对客户的需求不管怎么变,但我的代码都不会发生改变只需要加个字段即可。
弊端:这种方式在公司或者研发团队中是不利于后期维护和扩展的。
操作
order_id, order_no
package com.yx.mapper;
import com.yx.model.Order;
import com.yx.vo.OrderVo;
import org.apache.ibatis.annotations.Param;
public interface OrderMapper {
OrderVo selectByOid(@Param("oid") Integer oid);
}
package com.yx.model;
import lombok.ToString;
@ToString
public class Order {
private Integer orderId;
private String orderNo;
public Order(Integer orderId, String orderNo) {
this.orderId = orderId;
this.orderNo = orderNo;
}
public Order() {
super();
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
}
//=========================以上是Order实体类代码========================================
//=========================以下是OrderItem实体类代码========================================
package com.yx.model;
import lombok.ToString;
@ToString
public class OrderItem {
private Integer orderItemId;
private Integer productId;
private Integer quantity;
private Integer oid;
public OrderItem(Integer orderItemId, Integer productId, Integer quantity, Integer oid) {
this.orderItemId = orderItemId;
this.productId = productId;
this.quantity = quantity;
this.oid = oid;
}
public OrderItem() {
super();
}
public Integer getOrderItemId() {
return orderItemId;
}
public void setOrderItemId(Integer orderItemId) {
this.orderItemId = orderItemId;
}
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
}
package com.yx.biz;
import com.yx.vo.OrderVo;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 10:14
*/
public interface OrderBiz {
OrderVo selectByOid(Integer oid);
}
//============================以上是接口类代码==========================
//============================以下是接口实现类代码======================
package com.yx.biz.impl;
import com.yx.biz.OrderBiz;
import com.yx.mapper.OrderMapper;
import com.yx.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 10:15
*/
@Service
public class OrderBizImpl implements OrderBiz {
@Autowired
private OrderMapper orderMapper;
@Override
public OrderVo selectByOid(Integer oid) {
return orderMapper.selectByOid(oid);
}
}
package com.yx.vo;
import com.yx.model.Order;
import com.yx.model.OrderItem;
import java.util.ArrayList;
import java.util.List;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 9:05
*/
public class OrderVo extends Order {
private List orderItems =new ArrayList();
public List getOrderItems() {
return orderItems;
}
public void setOrderItems(List orderItems) {
this.orderItems = orderItems;
}
}
package com.yx.biz.impl;
import com.yx.biz.OrderBiz;
import com.yx.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;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 10:19
* 订单测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderBizImplTest {
@Autowired
private OrderBiz orderBiz;
@Test
public void selectByOid() {
OrderVo orderVo = orderBiz.selectByOid(7);
System.out.println(orderVo);
orderVo.getOrderItems().forEach(System.out::println);
}
}
order_item_id, product_id, quantity, oid
package com.yx.mapper;
import com.yx.model.OrderItem;
import com.yx.vo.OrderItemVo;
import org.apache.ibatis.annotations.Param;
public interface OrderItemMapper {
OrderItemVo selectByOrderItemId(@Param("oiid") Integer oiid);
}
package com.yx.model;
import lombok.ToString;
@ToString
public class Order {
private Integer orderId;
private String orderNo;
public Order(Integer orderId, String orderNo) {
this.orderId = orderId;
this.orderNo = orderNo;
}
public Order() {
super();
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
}
//=========================以上是Order实体类代码========================================
//=========================以下是OrderItem实体类代码========================================
package com.yx.model;
import lombok.ToString;
@ToString
public class OrderItem {
private Integer orderItemId;
private Integer productId;
private Integer quantity;
private Integer oid;
public OrderItem(Integer orderItemId, Integer productId, Integer quantity, Integer oid) {
this.orderItemId = orderItemId;
this.productId = productId;
this.quantity = quantity;
this.oid = oid;
}
public OrderItem() {
super();
}
public Integer getOrderItemId() {
return orderItemId;
}
public void setOrderItemId(Integer orderItemId) {
this.orderItemId = orderItemId;
}
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
}
package com.yx.vo;
import com.yx.model.Order;
import com.yx.model.OrderItem;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 11:07
*/
public class OrderItemVo extends OrderItem {
private Order order;
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
package com.yx.biz;
import com.yx.vo.OrderItemVo;
import org.apache.ibatis.annotations.Param;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 11:10
*/
public interface OrderItemBiz {
OrderItemVo selectByOrderItemId(@Param("oiid") Integer oiid);
}
//============================以上是接口类代码==========================
//============================以下是接口实现类代码======================
package com.yx.biz.impl;
import com.yx.biz.OrderItemBiz;
import com.yx.mapper.OrderItemMapper;
import com.yx.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 11:11
*/
@Service
public class OrderItemBizImpl implements OrderItemBiz {
@Autowired
private OrderItemMapper orderItemMapper;
@Override
public OrderItemVo selectByOrderItemId(Integer oiid) {
return orderItemMapper.selectByOrderItemId(oiid);
}
}
package com.yx.biz.impl;
import com.yx.biz.OrderItemBiz;
import com.yx.vo.OrderItemVo;
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;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 11:13
* 测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderItemBizImplTest {
@Autowired
private OrderItemBiz orderItemBiz;
@Test
public void selectByOrderItemId() {
OrderItemVo orderItemVo = orderItemBiz.selectByOrderItemId(27);
System.out.println(orderItemVo);
System.out.println(orderItemVo.getOrder());
}
}
book_id, book_name, price
package com.yx.mapper;
import com.yx.model.HBook;
import com.yx.vo.HBookVo;
import org.apache.ibatis.annotations.Param;
public interface HBookMapper {
HBookVo selectByBookId(@Param("bid") Integer bid);
}
package com.yx.model;
import lombok.ToString;
@ToString
public class HBook {
private Integer bookId;
private String bookName;
private Float price;
public HBook(Integer bookId, String bookName, Float price) {
this.bookId = bookId;
this.bookName = bookName;
this.price = price;
}
public HBook() {
super();
}
public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
}
//==========================以上是HBook实体类代码==========================================
==========================以下是HCategory实体类代码==========================================
package com.yx.model;
import lombok.ToString;
@ToString
public class HCategory {
private Integer categoryId;
private String categoryName;
public HCategory(Integer categoryId, String categoryName) {
this.categoryId = categoryId;
this.categoryName = categoryName;
}
public HCategory() {
super();
}
public Integer getCategoryId() {
return categoryId;
}
public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
}
package com.yx.vo;
import com.yx.model.HBook;
import com.yx.model.HCategory;
import java.util.List;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 11:34
*/
public class HBookVo extends HBook {
private List categories;
public List getCategories() {
return categories;
}
public void setCategories(List categories) {
this.categories = categories;
}
}
package com.yx.biz;
import com.yx.vo.HBookVo;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 11:41
*/
public interface HBookBiz {
HBookVo selectByBookId(Integer bid);
}
//======================以上是接口类代码===================================
//======================以下是接口实现类代码===============================
package com.yx.biz.impl;
import com.yx.biz.HBookBiz;
import com.yx.mapper.HBookMapper;
import com.yx.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 11:42
*/
@Service
public class HBookBizImpl implements HBookBiz {
@Autowired
private HBookMapper hBookMapper;
@Override
public HBookVo selectByBookId(Integer bid) {
return hBookMapper.selectByBookId(bid);
}
}
package com.yx.biz.impl;
import com.yx.biz.HBookBiz;
import com.yx.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;
/**
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2023-09-04 11:43
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HBookBizImplTest {
@Autowired
private HBookBiz hBookBiz;
@Test
public void selectByBookId() {
HBookVo hBookVo =this.hBookBiz.selectByBookId(8);
System.out.println(hBookVo);
hBookVo.getCategories().forEach(System.out::println);
}
}