mybatis 多层级联问题

以前用的是hibernate,自动化工具生成的pojo类可以在数据库设计的时候设置好表与表之间的关系, 然后自动化生成的类里面也有级联操作, 但是一转到mybatis, 蒙了, 没有

找了一些资料后就大致了解了其解决方法 :

一般遇到这个问题首先考虑在SQL语句中使用 内联, 左联, 右联, 或者外联, 如果还没办法达到你的需求, 就可以使用下面的方法进行级联了


一对一/一对多(一的一方) :

pojo类:

public class GoodDetailLoadEntity {

private Integer gdId;
private String gdUrl;
private Double gdPrimeprice;
private Double gdFreight;
private String gdChoose;
private ShopAccount gdShop;//关键 一对一所对应的实体类
private Good gdGood;

..省略setter/getter方法

}

mapper.xml中的创建相应的resultmap:

  <!--商品详细信息加载时候多层级联的resultmap-->
  <resultMap id = "GoodDetailLoadMap" type = "com.mysupermarket.pojo.GoodDetailLoadEntity">
    
    <id column="gd_id" property="gdId" jdbcType="INTEGER" />
    <result column="gd_url" property="gdUrl" jdbcType="VARCHAR" />
    <result column="gd_primeprice" property="gdPrimeprice" jdbcType="DOUBLE" />
    <result column="gd_freight" property="gdFreight" jdbcType="DOUBLE" />
    <result column="gd_choose" property="gdChoose" jdbcType="VARCHAR" />
 
  <!--关联ShopAccount-->
  <association property="gdShop"  column="gd_shop" javaType="com.mysupermarket.pojo.ShopAccount"  resultMap="ShopAccountMap"/>
 
  <!--关联Good-->
  <association property="gdGood"  column="gd_good" javaType="com.mysupermarket.pojo.Good"  resultMap="GoodMap"/>

 
  </resultMap>
  
  <!--ShopAccount 的resultmap-->
  <resultMap id = "ShopAccountMap" type = "com.mysupermarket.pojo.ShopAccount">
<id column="sp_account" property="spAccount" jdbcType="INTEGER" />
    <result column="sp_password" property="spPassword" jdbcType="VARCHAR" />
    <result column="sp_name" property="spName" jdbcType="VARCHAR" />
    <result column="sp_from" property="spFrom" jdbcType="VARCHAR" />
  </resultMap>
  
  <!--Good 的resultmap-->
  <resultMap id = "GoodMap" type = "com.mysupermarket.pojo.Good">
<id column="g_id" property="gId" jdbcType="INTEGER" />
    <result column="g_name" property="gName" jdbcType="VARCHAR" />
    <result column="g_url" property="gUrl" jdbcType="VARCHAR" />
    <result column="g_price" property="gPrice" jdbcType="DOUBLE" />
    <result column="g_sales" property="gSales" jdbcType="INTEGER" />
    <result column="g_remain" property="gRemain" jdbcType="INTEGER" />
    <result column="g_kind" property="gKind" jdbcType="INTEGER" />
  </resultMap>


然后就可以写上select语句了 :

 <!--根据商品id加载商品的相关记录-->
  <select id = "SelectByGoodId" resultMap = "GoodDetailLoadMap">
  SELECT * FROM good_detail INNER JOIN good ON good_detail.gd_good = good.g_id  
  INNER JOIN shop_account ON good_detail.gd_shop = shop_account.sp_account
  AND good_detail.gd_good = #{goodid}
  </select>



一对多(多的一方) : 

pojo 类

public class GoodDetailLoadEntity {

private Integer gdId;
private String gdUrl;
private Double gdPrimeprice;
private Double gdFreight;
private String gdChoose;
private List<GoodEvaluate> gdEvaluate;//一对多的引用

....省略 setter/getter方法

}

mapper.xml中创建resultmap

  <!--商品详细信息加载时候多层级联的resultmap-->
  <resultMap id = "GoodDetailLoadMap" type = "com.mysupermarket.pojo.GoodDetailLoadEntity">
    
    <id column="gd_id" property="gdId" jdbcType="INTEGER" />
    <result column="gd_url" property="gdUrl" jdbcType="VARCHAR" />
    <result column="gd_primeprice" property="gdPrimeprice" jdbcType="DOUBLE" />
    <result column="gd_freight" property="gdFreight" jdbcType="DOUBLE" />
    <result column="gd_choose" property="gdChoose" jdbcType="VARCHAR" />
 
  <!--关联GoodEvaluate-->
<collection property="gdEvaluate"  ofType="com.mysupermarket.pojo.GoodEvaluate">  
<id column="gdl_id" property="gdlId" jdbcType="INTEGER" />
   <result column="gdl_date" property="gdlDate" jdbcType="VARCHAR" />
   <result column="gdl_chose" property="gdlChose" jdbcType="VARCHAR" />
   <result column="gdl_content" property="gdlContent" jdbcType="VARCHAR" />
   <result column="gdl_good" property="gdlGood" jdbcType="INTEGER" />
   <result column="gdl_useraccount" property="gdlUseraccount" jdbcType="INTEGER" />
</collection>  
 
  </resultMap>

然后同样也可以写 select语句了

<!--根据商品id加载商品的相关记录-->
  <select id = "SelectByGoodId" resultMap = "GoodDetailLoadMap">
  SELECT * FROM good_detail INNER JOIN good_evaluate ON good.g_id = good_evaluate.gdl_good 
   AND good_detail.gd_good = #{goodid}
  </select>



完整版(既有一对一, 也有多对多的)

pojo 类:

package com.mysupermarket.pojo;


import java.util.List;


import com.mysupermarket.pojo.Good;
import com.mysupermarket.pojo.GoodEvaluate;
import com.mysupermarket.pojo.ShopAccount;


public class GoodDetailLoadEntity {

private Integer gdId;
private String gdUrl;
private Double gdPrimeprice;
private Double gdFreight;
private String gdChoose;
private ShopAccount gdShop;
private Good gdGood;
private List<GoodEvaluate> gdEvaluate
//....省略setter/getter方法
}


mapper.xml 中的resultmap :


 <!--商品详细信息加载时候多层级联的resultmap-->
  <resultMap id = "GoodDetailLoadMap" type = "com.mysupermarket.pojo.GoodDetailLoadEntity">
    
    <id column="gd_id" property="gdId" jdbcType="INTEGER" />
    <result column="gd_url" property="gdUrl" jdbcType="VARCHAR" />
    <result column="gd_primeprice" property="gdPrimeprice" jdbcType="DOUBLE" />
    <result column="gd_freight" property="gdFreight" jdbcType="DOUBLE" />
    <result column="gd_choose" property="gdChoose" jdbcType="VARCHAR" />
 
  <!--关联ShopAccount-->
  <association property="gdShop"  column="gd_shop" javaType="com.mysupermarket.pojo.ShopAccount"  resultMap="ShopAccountMap"/>
 
  <!--关联Good-->
  <association property="gdGood"  column="gd_good" javaType="com.mysupermarket.pojo.Good"  resultMap="GoodMap"/>
 
  <!--关联GoodEvaluate-->
<collection property="gdEvaluate"  ofType="com.mysupermarket.pojo.GoodEvaluate">  
<id column="gdl_id" property="gdlId" jdbcType="INTEGER" />
   <result column="gdl_date" property="gdlDate" jdbcType="VARCHAR" />
   <result column="gdl_chose" property="gdlChose" jdbcType="VARCHAR" />
   <result column="gdl_content" property="gdlContent" jdbcType="VARCHAR" />
   <result column="gdl_good" property="gdlGood" jdbcType="INTEGER" />
   <result column="gdl_useraccount" property="gdlUseraccount" jdbcType="INTEGER" />
</collection>  
 
  </resultMap>
  
  <!--ShopAccount 的resultmap-->
  <resultMap id = "ShopAccountMap" type = "com.mysupermarket.pojo.ShopAccount">
<id column="sp_account" property="spAccount" jdbcType="INTEGER" />
    <result column="sp_password" property="spPassword" jdbcType="VARCHAR" />
    <result column="sp_name" property="spName" jdbcType="VARCHAR" />
    <result column="sp_from" property="spFrom" jdbcType="VARCHAR" />
  </resultMap>
  
  <!--Good 的resultmap-->
  <resultMap id = "GoodMap" type = "com.mysupermarket.pojo.Good">
<id column="g_id" property="gId" jdbcType="INTEGER" />
    <result column="g_name" property="gName" jdbcType="VARCHAR" />
    <result column="g_url" property="gUrl" jdbcType="VARCHAR" />
    <result column="g_price" property="gPrice" jdbcType="DOUBLE" />
    <result column="g_sales" property="gSales" jdbcType="INTEGER" />
    <result column="g_remain" property="gRemain" jdbcType="INTEGER" />
    <result column="g_kind" property="gKind" jdbcType="INTEGER" />
  </resultMap>


然后就是select语句咯 :

<!--根据商品id加载商品的相关记录-->
  <select id = "SelectByGoodId" resultMap = "GoodDetailLoadMap">
  SELECT * FROM good_detail INNER JOIN good ON good_detail.gd_good = good.g_id 
  INNER JOIN good_evaluate ON good.g_id = good_evaluate.gdl_good 
  INNER JOIN shop_account ON good_detail.gd_shop = shop_account.sp_account
  AND good_detail.gd_good = #{goodid}
  </select>


希望我说明白了, 希望你也懂了, 可以加微信Mwh_20交流


猜你喜欢

转载自blog.csdn.net/m0_37838381/article/details/76887510