一:一对多关联关系
注:这边使用订单表和订单详情表为例
第一步:用逆向生成工具生成对应的方法以及实体类
在generatorConfig.xml中编写代码生成代码
<table schema="" tableName="t_hibernate_order" domainObjectName="Order" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> <!-- 忽略列,不生成bean 字段 --> <!-- <ignoreColumn column="FRED" /> --> <!-- 指定列的java数据类型 --> <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table> <table schema="" tableName="t_hibernate_order_item" domainObjectName="OrderItem" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> <!-- 忽略列,不生成bean 字段 --> <!-- <ignoreColumn column="FRED" /> --> <!-- 指定列的java数据类型 --> <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table>
再调用配置的代码生成语句
第二步:编写Vo类
注:Vo类继承实体类然后再根据是一对多还是多对多了来进行调节
分析:订单对应多个订单详情,那么订单Vo类里面就有一个集合来装订单详情
订单详情对应一个订单,那么订单详情Vo类中放的就是一个订单的对象
OrderVo
package com.sg.vo; import com.sg.model.Order; import com.sg.model.OrderItem; import java.util.ArrayList; import java.util.List; 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; } }
OrderItemVo
package com.sg.vo; import com.sg.model.Order; import com.sg.model.OrderItem; public class OrderItemVo extends OrderItem { private Order order; public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } }
第三步:在OrderMapper.xml,OrderItemMapper.xml中追加配置
这里涉及到两个标签
一对多:<collection property= oftype="类的全路径名">
一对一:<assocation property javaType="类的全路径名">
OrderMapper.xml
<resultMap id="OrderVoMap" type="com.javaxl.ssm.model.vo.OrderVo" > <result property="orderId" column="order_id"></result> <result property="orderNo" column="order_no"></result> <collection property="orderItems" ofType="com.javaxl.ssm.model.OrderItem"> <result property="orderItemId" column="order_item_id"></result> <result property="oid" column="oid"></result> <result property="productId" column="product_id"></result> <result property="quantity" column="quantity"></result> </collection> </resultMap> <select id="queryOrderVoByOrderId" resultMap="OrderVoMap" 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 = #{orderId} </select>
OrderItemMapper.xml
<resultMap id="OrderVoMap" type="com.javaxl.ssm.model.vo.OrderItemVo" > <result property="orderItemId" column="order_item_id"></result> <result property="oid" column="oid"></result> <result property="productId" column="product_id"></result> <result property="quantity" column="quantity"></result> <association property="order" javaType="com.javaxl.ssm.model.Order"> <result property="orderId" column="order_id"></result> <result property="orderNo" column="order_no"></result> </association> </resultMap> <select id="queryOrderItemVoByOrderItemId" resultMap="OrderVoMap" parameterType="java.lang.Integer"> select * from t_hibernate_order o,t_hibernate_order_item oi where o.order_id = oi.oid and oi.order_item_id = #{orderItemId} </select>
第四步:在其对应的接口中编写方法
OrderMapper
OrderVo queryOrderVoByOrderId(@Param("orderId") Integer orderId);
OrderItemMapper
OrderItemVo queryOrderItemVoByOrderItemId(@Param("orderItemId") Integer orderItemId);
第五步:编写Service接口
package com.sg.service; import com.sg.vo.OrderItemVo; import com.sg.vo.OrderVo; public interface One2ManyService { OrderVo queryOrderVoByOrderId(Integer orderId); OrderItemVo queryOrderItemVoByOrderItemId(Integer OrderItemId); }
第六步:编写Service对应的实现类
package com.sg.service.impl; import com.sg.mapper.OrderItemMapper; import com.sg.mapper.OrderMapper; import com.sg.service.One2ManyService; import com.sg.vo.OrderItemVo; import com.sg.vo.OrderVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class One2ManyServiceItem implements One2ManyService { @Autowired private OrderMapper orderMapper; @Autowired private OrderItemMapper orderItemMapper; @Override public OrderVo queryOrderVoByOrderId(Integer orderId) { return orderMapper.queryOrderVoByOrderId(orderId); } @Override public OrderItemVo queryOrderItemVoByOrderItemId(Integer orderItemId) { return orderItemMapper.queryOrderItemVoByOrderItemId(orderItemId); } }
第七步:编写测试类
注:一定要加上下面这两个注释
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:applicationContext.xml"})
package com.sg.impl; import com.sg.model.OrderItem; import com.sg.service.One2ManyService; import com.sg.vo.OrderItemVo; import com.sg.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:applicationContext.xml"}) public class One2ManyServiceImplTest { @Autowired private One2ManyService one2ManyService; @Test public void queryOrderVoByOrderId() { OrderVo orderVo = this.one2ManyService.queryOrderVoByOrderId(9); System.out.println(orderVo); for (OrderItem orderItem : orderVo.getOrderItems()) { System.out.println(orderItem); } } @Test public void queryOrderItemVoByOrderItemId() { OrderItemVo orderItemVo = this.one2ManyService.queryOrderItemVoByOrderItemId(46); System.out.println(orderItemVo); System.out.println(orderItemVo.getOrder()); } }
测试结果如下:
根据订单id查询对应的订单详情
根据订单详情查询对应订单
二:多对多关联关系
注:这里用书籍表,书籍类别表,书籍中间表来举例
分析:多对多与一对多差不多,多对多可以看成两个一对多
第一步:使用逆向生成工具生成对应的实体类和方法
第二步:编写Vo类
分析:多对多可以看成两个一对多那么书籍表和书籍类别表里面放的都是用一个集合来装对面
HbookVo
package com.sg.vo; import com.sg.model.Category; import com.sg.model.Hbook; import java.util.ArrayList; import java.util.List; public class HbookVo extends Hbook { private List<Category> categories = new ArrayList<>(); public List<Category> getCategories() { return categories; } public void setCategories(List<Category> categories) { this.categories = categories; } }
CategoryVo
package com.sg.vo; import com.sg.model.Category; import com.sg.model.Hbook; import java.util.ArrayList; import java.util.List; public class CategoryVo extends Category { private List<Hbook> hbooks = new ArrayList<>(); public List<Hbook> getHbooks() { return hbooks; } public void setHbooks(List<Hbook> hbooks) { this.hbooks = hbooks; } }
第三步:在书籍类别中间表的HbookCategroyMapper.xml中增加配置
HbookCategoryMapper.xml
分析:因为可以看成两个一对多所以这里使用的都是collection标签
<resultMap id="HbookVoMap" type="com.sg.vo.HbookVo"> <result property="bookId" column="book_id"></result> <result property="bookName" column="book_name"></result> <collection property="categories" ofType="com.sg.model.Category"> <result property="categoryId" column="category_id"></result> <result property="categoryName" column="category_name"></result> </collection> </resultMap> <resultMap id="CategoryVoMap" type="com.sg.vo.CategoryVo"> <result property="categoryId" column="category_id"></result> <result property="categoryName" column="category_name"></result> <collection property="hbooks" ofType="com.sg.model.Hbook"> <result property="bookId" column="book_id"></result> <result property="bookName" column="book_name"></result> </collection> </resultMap> <select id="queryByBookId" resultMap="HbookVoMap" parameterType="java.lang.Integer"> select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c where b.book_id = bc.bid and bc.cid = c.category_id and b.book_id = #{bookId} </select> <select id="queryByCid" resultMap="CategoryVoMap" parameterType="java.lang.Integer"> select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c where b.book_id = bc.bid and bc.cid = c.category_id and c.category_id=#{cid} </select>
第四步:在HbookCategoryMapper.xml对应的HbookCategoryMapper接口中追加刚刚在HbookCategoryMapper.xml中编写的方法
HbookVo queryByBookId(@Param("bookId") Integer bookId); CategoryVo queryByCid(@Param("cid") Integer cid);
第五步:编写Service接口
package com.sg.service; import com.sg.vo.CategoryVo; import com.sg.vo.HbookVo; public interface Many2ManyService { HbookVo queryByBookId(Integer bookId); CategoryVo queryByCid(Integer cid); }
第六步:实现Service接口
package com.sg.service.impl; import com.sg.mapper.HbookCategoryMapper; import com.sg.service.Many2ManyService; import com.sg.vo.CategoryVo; import com.sg.vo.HbookVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class Many2ManyServiceImpl implements Many2ManyService { @Autowired private HbookCategoryMapper hbookCategoryMapper; @Override public HbookVo queryByBookId(Integer bookId) { return hbookCategoryMapper.queryByBookId(bookId); } @Override public CategoryVo queryByCid(Integer cid) { return hbookCategoryMapper.queryByCid(cid); } }
第七步:测试类
注:一定要加上下面这两个注释
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:applicationContext.xml"})
package com.sg.impl; import com.sg.model.Category; import com.sg.model.Hbook; import com.sg.service.Many2ManyService; import com.sg.vo.CategoryVo; import com.sg.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:applicationContext.xml"}) public class Many2ManyServiceImplTest { @Autowired private Many2ManyService many2ManyService; @Test public void queryByBookId() { HbookVo hbookVo = many2ManyService.queryByBookId(8); System.out.println(hbookVo); for (Category category : hbookVo.getCategories()) { System.out.println(category); } } @Test public void queryByCid() { CategoryVo categoryVo = many2ManyService.queryByCid(8); System.out.println(categoryVo); for (Hbook hbook : categoryVo.getHbooks()) { System.out.println(hbook); } } }
测试结果如下:
根据书籍id查询对应的类别
根据类别id查询对应的书籍
拜拜了各位!!!