mybatis:parameterType(输入类型),resultType(输出类型),resultMap(输出类型),动态sql: foreach(二)

parameterType(输入类型)

通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型,xml配置中无论增删改查,无论parameterType是基本类型还是对象,集合等,parameterType这个属性是可以省略的,会自动识别。

1.传递pojo对象

开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
定义包装对象将查询条件(pojo)以类组合的方式包装起来。

public class QueryVo {
	
	private User user;
	
	//自定义用户扩展类,一般使用扩展类继承基础类,因为基础类都是自动生成的。
	private UserCustom userCustom;

mapper.xml映射文件
在这里插入图片描述
在这里插入图片描述

说明:mybatis底层通过ognl从pojo中获取属性值:#{user.username},user即是传入的包装对象的属性。queryVo是别名,即上边定义的包装对象类型。

2.传递hashmap

Sql映射文件定义如下:

<!-- 传递hashmap综合查询用户信息 -->
	<select id="findUserByHashmap" parameterType="hashmap" resultType="user">
	   select * from user where id=#{id} and username like '%${username}%'
	</select>

上边红色标注的是hashmap的key。
异常测试:
传递的map中的key和sql中解析的key不一致。
测试结果没有报错,只是通过key获取值为空。

resultType(输出类型)

使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。
在mapper.java指定的方法返回值类型不一样:
1、输出单个pojo对象,方法返回值是单个对象类型
在这里插入图片描述
2、输出pojo对象list,方法返回值是List
在这里插入图片描述
生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 )。

resultMap(输出类型)

mybatis中使用resultMap完成高级输出结果映射。
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
Mapper.xml定义
在这里插入图片描述
由于上边的mapper.xml中sql查询列和Users.java类属性不一致,需要定义resultMap:userListResultMap将sql查询列和Users.java类属性对应起来
在这里插入图片描述
<id />:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个。
Property:表示person类的属性。
Column:表示sql查询出来的字段名。
Column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
<result />:普通结果,即pojo的属性。

resultType与resultMap的使用:一般使用resultType就可以了,除非有特殊要求,具体参考https://blog.csdn.net/qq_30021219/article/details/118194135

动态sql: foreach

向sql传递数组或List,mybatis使用foreach解析,如下:
1.通过pojo传递list
在这里插入图片描述
mapper.xml

<if test="ids!=null and ids.size>0">
	    	<foreach collection="ids" open=" and id in(" close=")" item="id" separator="," >
	    		#{id}
	    	</foreach>
</if>

2.传递单个List
传递List类型在编写mapper.xml没有区别,唯一不同的是只有一个List参数时它的参数名为list。注意:collection=“list”
Mapper.xml

<select id="selectUserByList" parameterType="java.util.List" resultType="user">
		select * from user 
		<where>
		<!-- 传递List,List中是pojo -->
		<if test="list!=null">
		<foreach collection="list" item="item" open="and id in("separator=","close=")">
		    #{item.id} 
		</foreach>
		</if>
		</where>
</select>

3.传递单个数组(数组中是pojo):

<!-- 传递数组综合查询用户信息 -->
	<select id="selectUserByArray" parameterType="Object[]" resultType="user">
		select * from user 
		<where>
		<!-- 传递数组 -->
		<if test="array!=null">
		<foreach collection="array" index="index" item="item" open="and id in("separator=","close=")">
		    #{item.id} 
		</foreach>
		</if>
		</where>
	</select>

sql只接收一个数组参数,这时sql解析参数的名称mybatis固定为array,如果数组是通过一个pojo传递到sql则参数的名称为pojo中的属性名。
4.传递单个数组(数组中是字符串类型):

<!-- 传递数组综合查询用户信息 -->
	<select id="selectUserByArray" parameterType="Object[]" resultType="user">
		select * from user 
		<where>
		<!-- 传递数组 -->
		<if test="array!=null">
		<foreach collection="array"index="index"item="item"open="and id in("separator=","close=")">
		    #{item} 
		</foreach>
		</if>
		</where>
</select>

如果数组中是简单类型则写为#{item},不用再通过ognl获取对象属性值了。
index:为数组的下标。
item:为数组每个元素的名称,名称随意定义
open:循环开始
close:循环结束
separator:中间分隔输出

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值