MyBatis-Day03
第一节、MyBaits的自动映射
在SQL查询结果的时候,如果字段名和属性名一致,且每一个属性有对应的set方法,MyBatis就会根据字段名与属性名进行自动映射。
条件:
1、字段名与属性名必须一致
2、开启自动映射配置(默认是开单表的自动映射)
第二节、解决不能自动映射的问题
字段名与属性名不一致的问题
方式一、
如果字段与属性名之间关系 字段名
方式二、
我们在SQL查询的时候取别名,别名的名字与属性名一致–MyBatis帮你做自动映射
解决:
<select id="getAllGoods" resultType="goods">
SELECT goods_id id ,goods_name name ,goods_location location ,goods_price price,goods_cid cid FROM goods;
</select>
为什么:取别名后执行SQL查出来的结果如下。结果集中字段名与属性是一致,所以可以做自动映射。
方式三、
在MyBatis层面解决
通过ResultMap解决–手动映射
第三节、通过MyBatis实现一对一,一对多的查询(级联查询–多表查询)
一对一的查询
什么叫做一对一:学校–校长 商品–商品分类
一对一在数据库中怎么体现:通过字段与字段之间的关联
在实体类中怎么体现:
private int id;
private String name;
private String location;
private double price;
//在实体类中描述一对一这种关系 组合
private Category category;
<!-- <select id="getByID" resultType="goods">
查商品及其分类的信息
SELECT * FROM goods g
JOIN
category c
ON g.cid = c.cid WHERE g.id = #{id}
</select>
<resultMap type="goods" id="goodsAndCa" autoMapping="true">
名字相同可以做自动映射
<result column="name" property="name"/>
category是一个复杂类型,myBatis不能做自动的映射
做一对一的复杂类型映射
<association property="category" javaType="category" autoMapping="true">
</association>
</resultMap> -->
<select id="getByID" resultMap="goodAndCa">
SELECT * FROM goods WHERE id = #{id}
</select>
<!-- resultMap 封装谁的对象 -->
<resultMap type="goods" id="goodAndCa">
<!-- select 调另一个查询 -->
<!--将 category属性的封装交给getCategoryByID
将category赋值的工作交给getCategoryByID
-->
<association property="category" javaType="Category" select="getCategoryByID" column="cid" ></association>
</resultMap>
<select id="getCategoryByID" resultType="category">
SELECT * FROM category WHERE cid = #{cid}
</select>
</mapper>
一对多
<select id="getCaById" resultMap="caAndgoods">
SELECT * FROM
category ca
JOIN
goods g
ON
ca.cid = g.cid WHERE ca.cid=#{cid}
</select>
<!-- resultMap type需要封装的类型 -->
<resultMap type="category" id="caAndgoods" autoMapping="true">
<!-- 指定主键 -->
<id property="cid" column="cid"/>
<!-- 封装一个集合
一对多
property 属性名
ofType 该属性的泛型中类型
-->
<collection property="allGoods" ofType="goods" autoMapping="true">
</collection>
</resultMap>
<select id="getCaById" resultMap="caAndgoods">
SELECT * FROM category WHERE cid=#{cid}
</select>
<!-- 做一对多的查询的时候,我们最好手动映射一这边的主键 -->
<resultMap type="category" id="caAndgoods">
<id property="cid" column="cid"/>
<collection property="allGoods" ofType="goods" select="getGoodsByCaID" column="cid"></collection>
</resultMap>
<select id="getGoodsByCaID" resultType="goods">
SELECT * FROM goods WHERE cid=#{cid}
</select>
ap>
<select id="getGoodsByCaID" resultType="goods">
SELECT * FROM goods WHERE cid=#{cid}
</select>
[外链图片转存中...(img-vdpwDmVx-1631707091605)]
注意:通过子查询不仅可以调用本XML中定义的查询,还可以通过接口调用其他XML定义的查询。