【mybatis之关联关系】
mybatis之关联关系的三种关联方式
数据库表的关联关系有三种,一对一,一对多,多对多
一对一 是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段
一对多 是通过在“多”的一方,添加“一”的一方的主键作为外键
多对多 是通过一张中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键
*在java类中关联关系也有三种,一对一,一对多,多对多
一对一 在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a
一对多 一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a
多对多 在A类中定义B类类型的集合,在B类中定义A类类型的集合
下文大致思路如下
1.将数据表导入数据库中
2.通过mybatis-generator插件生成dao、mapper、model
1)配置mybatis-generator插件生成文件位置
2)修改generatorConfig.xml配置文件的生成目录(mapper和model)及对应生成关系
3.修改Customer、Order实体类
1)实现序列化接口
2)建立实体映射关联关系(一对多、多对一)
#一对多:一个客户对应多个订单
private List<Order> orders=new ArrayList<Order>();
#多对一:多个订单对应一个客户(一个订单对应一个客户)
private Customer customer;
一对多关联关系
OrderVo
package com.xyx.model;
public class Order {
private Integer orderId;
private String orderNo;
public Order(Integer orderId, String orderNo) {
this.orderId = orderId;
this.orderNo = orderNo;
}
@Override
public String toString() {
return "Order{" +
"orderId=" + orderId +
", 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;
}
}
OrderItemVo
package com.xyx.model.vo;
import com.xyx.model.Order;
import com.xyx.model.OrderItem;
public class OrderItemVo extends OrderItem {
private Order order;
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
然后再Mapper中写一个查询订单的方法
OrderMapper
package com.xyx.mapper;
import com.xyx.model.Order;
import com.xyx.model.vo.OrderVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderMapper {
int deleteByPrimaryKey(Integer orderId);
int insert(Order record);
int insertSelective(Order record);
Order selectByPrimaryKey(Integer orderId);
int updateByPrimaryKeySelective(Order record);
int updateByPrimaryKey(Order record);
OrderVo selectByOid(@Param("oid") Integer oid);
}
先在rderMapper.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" >
<mapper namespace="com.xyx.mapper.OrderMapper" >
<resultMap id="BaseResultMap" type="com.xyx.model.Order" >
<constructor >
<idArg column="order_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="order_no" jdbcType="VARCHAR" javaType="java.lang.String" />
</constructor>
</resultMap>
<!-- 描述一对多 -->
<resultMap id="OrderVoMap" type="com.xyx.model.vo.OrderVo" >
<result property="orderId" column="order_id"></result>
<result property="orderNo" column="order_no"></result>
<collection property="orderItems" ofType="com.xyx.model.OrderItem">
<result property="orderItemId" column="order_item_id"></result>
<result property="productId" column="product_id"></result>
<result property="quantity" column="quantity"></result>
<result property="oid" column="oid"></result>
</collection>
</resultMap>
<sql id="Base_Column_List" >
order_id, order_no
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from t_hibernate_order
where order_id = #{
orderId,jdbcType=INTEGER}
</select>
<select id="selectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer&#