【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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值