一.介绍Mybatis中【关联关系映射】
1.什么是Mybatis中【关联关系映射】?
可以实现不同实体之间的关联查询和映射。关联关系映射可以将多个实体对象之间的关联关系通过数据库查询进行映射,实现对象之间的关联操作。
2.常见的Mybatis【关联关系映射】
2.1.一对一关联
一对一关联是指两个实体对象之间存在唯一的关系。在数据库中,这种关系通常通过外键来表示。在MyBatis中,可以使用ResultMap来实现一对一关联映射。通过定义ResultMap的<association>元素,可以指定关联对象的属性与数据库字段的对应关系。
2.2.一对多关联
一对多关联是指一个实体对象对应多个关联对象。在数据库中,通常使用外键来表示这种关系。MyBatis通过使用Collection或者Map来实现一对多关联映射。可以使用ResultMap的<collection>元素来定义关联对象集合属性与数据库字段的对应关系,也可以使用<map>元素来实现Map类型的关联映射。
2.3.多对多关联
是指两个实体对象之间存在互相关联的关系,即一个实体对象可以对应多个另一个实体对象,而另一个实体对象也可以对应多个该实体对象。在数据库中,多对多关联通常通过中间表来实现。
二.通过举出具体实例来验证:关联关系映射
1.具体实现思路
1.1定义实体对象,创建映射文件
首先,通过插件来自动生成两个实体对象,例如A和B。它们之间的多对多关联关系由中间表C来表示。在生成实体时映射文件会自动生成出来,并分别定义实体对象A和B的SQL语句以及ResultMap。
1.2定义多对多关联关系
在映射文件中,使用<collection>元素或者<association>元素来定义多对多关联关系。对于多对多关联,需要通过设置<collection>元素的property属性来指定实体对象A中存放实体对象B集合的属性名,并通过<collection>元素的select属性来引用查询实体对象B的SQL语句。
1.3编写SQL语句:
在映射文件中编写查询语句,以获取实体对象A和B之间的关联信息。这个查询语句通常会包含多个表的联接操作,以及条件的限制。
通过以上步骤,就可以在MyBatis中实现多对多关联映射。在查询时,可以通过调用相应的Mapper接口方法来获取实体对象A及其关联的实体对象B的信息,或者反过来获取实体对象B及其关联的实体对象A的信息。
2.一对多具体实例展示(一个订单对应多个订单项)
2.1生成实体,映射文件(在这里小编生成了所有的后面就不在描述)
2.2在OrderMapper.xml中配置sql,以及映射
select id="byOid" resultMap="" parameterType="java.lang.Integer"> select *from t_hibernate_order o, t_hibernate_order_item oi where o.order_id=oi.oid and o.order_id = #{oid} </select>
然后再将OrderVoMap添加到 resultmap中
2.3创建一个Vo来实现辅佐方法的实现
package com.lz.vo; import com.lz.model.Order; import com.lz.model.OrderItem; import java.util.ArrayList; import java.util.List; /** * @author lz * @create 2023-08-26 15:31 */ public class OrderVo extends Order { private List<OrderItem> orderItems=new ArrayList<>(); public List<OrderItem> getOrderItems() { return orderItems; } public void setOrderItems(List<OrderItem> orderItems) { this.orderItems = orderItems; } }
2.4就是创建接口并且实现方法,
package com.lz.biz.impl; import com.lz.mapper.OrderMapper; import com.lz.vo.OrderVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author lz * @create 2023-08-25 15:54 */ @Service public class OrderBizImpl implements OrderBiz{ @Autowired private OrderMapper orderMapper; @Override public OrderVo SelectbyOid(Integer oid) { return OrderMapper.SelectbyOid(oid); } }
2.5通过juint测试,返回结果
package com.lz.biz.impl; import com.lz.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 lz * @create 2023-08-25 15:58 */ @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); } }
3.一对以具体实例展示(一个订单项对应一个订单)
3.1在OrderItemMapper.xml中配置sql,以及映射
3.2创建一个Vo来实现辅佐方法的实现
package com.lz.vo; import com.lz.model.Order; import com.lz.model.OrderItem; /** * @author lz * @create 2023-08-27 21:04 */ public class OrderItemVo extends OrderItem { private Order order; public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } }
3.3c创建接口,并且调用
package com.lz.biz; import com.lz.vo.OrderItemVo; import org.apache.ibatis.annotations.Param; public interface OrderItemBiz { OrderItemVo SelectByOiid(@Param("oiid") Integer oiid); }
package com.lz.biz.impl; import com.lz.biz.OrderItemBiz; import com.lz.mapper.OrderMapper; import com.lz.model.OrderItem; import com.lz.vo.OrderItemVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author lz * @create 2023-08-25 15:54 */ @Service public class OederItemBizImpl implements OrderItemBiz { @Autowired //相当于 set /get方法 private OrderItemBiz orderItemBiz; @Override public OrderItemVo SelectByOiid(Integer oiid) { return OrderItemBiz.SelectByOiid(oiid); } }
3.4通过juint测试,返回结果
package com.lz.biz.impl; import com.lz.biz.OrderBiz; import com.lz.biz.OrderItemBiz; import com.lz.vo.OrderItemVo; import com.lz.vo.OrderVo; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.SystemEnvironmentPropertySource; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author lz * @create 2023-08-25 15:58 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:spring-context.xml"}) public class OrderBizImplTest { @Autowired private OrderItemBiz orderItemBiz; @Test public void SelectByOiid(){ OrderItemVo orderItemVo= OrderItemBiz.SelectByOiid(27); System.out.println(orderItemVo); System.out.println(orderItemVo.getOrder()); } }
4.多对多(举例一本书有多个类别,一个类别可以对应多本书)
4.1配置sql,以及映射
resultMap id="CategoryVo" type="com.lz.vo.CategoryVo" > <result column="category_id" property="categoryId"></result> <result column="category_name" property="categoryName"></result> <collection property="books" ofType="com.lz.model.HCategory"> <result column="book_id" property="bookId"></result> <result column="book_name" property="bookName"></result> <result column="price" property="price"></result> </collection> </resultMap> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" > select <include refid="Base_Column_List" /> from t_hibernate_book_category where bcid = #{bcid,jdbcType=INTEGER} </select>
<select id="selcetByBookId" resultMap="HBookVo" parameterType="java.lang.Integer"> SELECT *FROM t_hibernate_book b, t_hibernate_category c, t_hibernate_book_category bc where b.book_id =bc.bid and bc.cid =c.category_id and b.book_id= ${bid} </select> <resultMap id="HBookVo" type="com.lz.vo.HBookVo" > <result column="book_id" property="bookId"></result> <result column="book_name" property="bookName"></result> <result column="price" property="price"></result> <collection property="categories" ofType="com.lz.model.HCategory"> <result column="category_id" property="categoryId"></result> <result column="category_name" property="categoryName"></result> </collection> </resultMap>
2.创建vo来实现辅佐方法实现
package com.lz.vo; import com.lz.model.HBook; import com.lz.model.HCategory; import java.util.ArrayList; import java.util.List; /** * @author lz * @create 2023-08-28 13:48 */ public class CategoryVo extends HCategory { List<HBook> books=new ArrayList<>(); public List<HBook> getBooks() { return books; } public void setBooks(List<HBook> books) { this.books = books; } }
package com.lz.vo; import com.lz.model.HBook; import com.lz.model.HCategory; import java.util.List; /** * @author lz * @create 2023-08-28 12:38 */ public class HBookVo extends HBook { private List<HCategory> hCategories; public List<HCategory> gethCategories() { return hCategories; } public void sethCategories(List<HCategory> hCategories) { this.hCategories = hCategories; } }
4.3创建接口,并且调用
package com.lz.biz; import com.lz.vo.HBookVo; import org.apache.ibatis.annotations.Param; public interface HBookBiz { HBookVo selcetByBookId(@Param("bid") Integer bid); }
package com.lz.biz.impl; import com.lz.biz.HBookBiz; import com.lz.mapper.HBookMapper; import com.lz.vo.HBookVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author lz * @create 2023-08-25 15:54 */ @Service public class HBookBizImpl implements HBookBiz { @Autowired //相当于 set /get方法 private HBookMapper hBookMapper; @Override public HBookVo selcetByBookId(Integer bid) { return HBookMapper. selcetByBookId(bid); } }