39.MyBatis自动映射、一对一、一对多

本文介绍了MyBatis的自动映射功能,当字段名与属性名一致且存在对应的set方法时,MyBatis将进行自动映射。针对字段名与属性名不一致的情况,提出了三种解决方案:通过字段与属性名对应关系、SQL查询时使用别名、或在ResultMap中手动映射。此外,文章还详细讲解了如何在MyBatis中实现一对一和一对多的级联查询,涉及多表查询的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyBatis-Day03

第一节、MyBaits的自动映射

在SQL查询结果的时候,如果字段名和属性名一致,且每一个属性有对应的set方法,MyBatis就会根据字段名与属性名进行自动映射。

条件:

1、字段名与属性名必须一致

2、开启自动映射配置(默认是开单表的自动映射)

image-20210903101511610

第二节、解决不能自动映射的问题

字段名与属性名不一致的问题

方式一、

如果字段与属性名之间关系 字段名

image-20210903103633068

image-20210903104046103

方式二、

我们在SQL查询的时候取别名,别名的名字与属性名一致–MyBatis帮你做自动映射

image-20210903105012586

image-20210903105022171

解决:

<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查出来的结果如下。结果集中字段名与属性是一致,所以可以做自动映射。

image-20210903105104171

方式三、

在MyBatis层面解决

通过ResultMap解决–手动映射

image-20210903112831786

第三节、通过MyBatis实现一对一,一对多的查询(级联查询–多表查询)
一对一的查询

什么叫做一对一:学校–校长 商品–商品分类

一对一在数据库中怎么体现:通过字段与字段之间的关联

在实体类中怎么体现:

private int id;
private String name;
private String location;
private double price;

//在实体类中描述一对一这种关系  组合
private Category category;

image-20210903120726881

image-20210903120930046

image-20210903141942568

<!-- 	<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>

image-20210903151418659

ap>

 <select id="getGoodsByCaID" resultType="goods">
 	SELECT * FROM goods WHERE cid=#{cid}
 </select>

[外链图片转存中...(img-vdpwDmVx-1631707091605)]

注意:通过子查询不仅可以调用本XML中定义的查询,还可以通过接口调用其他XML定义的查询。                                             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值