以前用的是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交流