您的位置:首页 > 其它

mybatis 多层级联问题

2017-08-08 10:56 141 查看
以前用的是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">
&l
d540
t;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交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: