mybaits的映射关系
主要是围绕一个resultmap的标签而展开讨论的。
GoodsDao.xml
<resultMap id="BaseResultMap" type="com.qianfeng.study.pojo.entity.Goods">
<id column="goods_id" jdbcType="BIGINT" property="goodsId"/>
<result column="title" jdbcType="VARCHAR" property="title"/>
<result column="old_price" jdbcType="DECIMAL" property="oldPrice"/>
<result column="now_price" jdbcType="DECIMAL" property="nowPrice"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
<result column="update_user" jdbcType="TIMESTAMP" property="updateUser"/>
<result column="sold" jdbcType="INTEGER" property="sold"/>
<result column="score" jdbcType="DOUBLE" property="score"/>
<result column="merchant_id" jdbcType="BIGINT" property="merchantId"/>
<result column="img" jdbcType="VARCHAR" property="img"/>
<!-- 一对一-->
<association property="merchant" resultMap="merchantResultMap"/>
<!-- 一对多-->
<collection property="merchants" resultMap="merchantResultMap"/>
<!-- 多对多-->
</resultMap>
<result column="sold" jdbcType="INTEGER" property="sold"/>
其中column是数据库的列字段,property是实体类或者VO类中的属性名称,这里会形成一个映射关系
1. 【掌握】association标签的关联使用。
实体类
@Data
public class Goods implements Serializable {
// 我在这里加
private Merchant merchant; //一对多
private List<Merchant> merchants;// 代理商 多对多
/**
* 这个是跟后边的分布式雪花算法做铺垫的:
*/
private Long goodsId;
/**
* 商品类型:
*/
private String title;
/**
* 这个商品是哪个商户的,外键
*/
private Long merchantId;
/**
* 商品的图片地址
*/
private String img;
private static final long serialVersionUID = 1L;
}
GoodsDao.xml
<!--一对一-->
<association property="merchant" resultMap="merchantResultMap"/>
GoodsDao.xml完整的resultMap标签代码在文章开头
虽然在实际工作可能用不到,但是面试可能会用到。我们后面有更好的放,用单表加流式处理来解决多表联查的性能问题,以及大大降低sql语句联表查询的复杂度。
<resultMap id="merchantResultMap" type="com.qianfeng.study.pojo.entity.Merchant">
<id column="merchant_id" jdbcType="BIGINT" property="merchantId"/>
<result column="shop_name" jdbcType="VARCHAR" property="shopName"/>
<result column="lng" jdbcType="DOUBLE" property="lng"/>
<result column="lat" jdbcType="DOUBLE" property="lat"/>
<result column="address" jdbcType="VARCHAR" property="address"/>
<result column="logo" jdbcType="VARCHAR" property="logo"/>
</resultMap>
<select id="selectGoodsTest" useCache="false" flushCache="false">
select g.title,m.shop_name from goods g,merchant m where g.merchant_id=m.merchant_id and g.goods_id=1
</select>
这种方式既有优点,也有缺点
优点:
- 数据量少的时候跟单表分布查询差不多
- 处理结果集方便,直接得到结果,无需额外的进行封装
- 对业务开发能力要求不高
缺点: - sql语句冗长,不好理解
- 数据量大,性能降低
- 维护蛮烦,对编写sql要求稍微高一点
单分布查询的优缺点
优点:
- sql语句基本会少写很多
- sql语句简单
- 好维护,性能高
缺点: - 业务层增加了复杂度
- 对java基础知识要求比较高(流处理,lambda表达式,函数式接口)
2. 【掌握】cillection标签的关联使用
<!-- 一对多-->
<collection property="merchants" resultMap="merchantResultMap"/>
<resultMap id="merchantResultMap" type="com.qianfeng.study.pojo.entity.Merchant">
<id column="merchant_id" jdbcType="BIGINT" property="merchantId"/>
<result column="shop_name" jdbcType="VARCHAR" property="shopName"/>
<result column="lng" jdbcType="DOUBLE" property="lng"/>
<result column="lat" jdbcType="DOUBLE" property="lat"/>
<result column="address" jdbcType="VARCHAR" property="address"/>
<result column="logo" jdbcType="VARCHAR" property="logo"/>
</resultMap>
多对多不在配置文件搞,暂未更新,敬请期待