Mybatis参数(Parameters)传递方式

 更新时间:2023年12月04日 09:38:27   作者:路在何方い  
这篇文章主要介绍了Mybatis参数(Parameters)传递方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.单个普通类型(基本类型、包装类型、String)的参数

封装规则:Mybatis不会做特殊的处理

取值 #{随便写,建议与实际的参数名保持一致}

例如:

操作:public Employee getEmployeeById(Integer id );

取值:#{id}

	<!-- 关于select 的查询语句 resulType:查询结果对应的类型        id 当前sql语句的唯一标识       
	#{id}:获取传递的参数         resultType用于指定结果集的封装类型 
	parameter:确定传递参数的类型,也可以省略,mybatis会自动识别当前参数类型是什么
	-->
	<select id="getEmployeeById" resultType="employee"  parameterType="java.lang.Integer" 
	 databaseId="mysql">
		select id,last_name lastName,email,gender from tbl_employee where
		id=#{id}
	</select>

2.多个参数

封装规则:Mybatis会把多个参数封装成一个Map,封装时使用的key是:0 1 2 ....N-1/param1param2....paramN.

取值:#{0 1 2 ....N-1/param1param2....paramN}

例如:

操作:public Employee getEmpsByLastNameAndId(String lastName, Integer id );

取值:#{lastName}、#{id}错误

异常:Cause: org.apache.ibatis.binding.BindingException: Parameter 'lastName' not found. Available parameters are[0, 1, param1, param2]

取值:#{0}、#{1} 或者#{param1}、#{param2}正确

不方便:参数一旦多了,不知道参数具体在第几个位置

<!--${param1} and id=${param2} 参数一旦多了 不知道参数具体在第几个位置 -->
	<select id="getEmpsLastNameAndId" resultType="employee">
		select * from tbl_employee where last_name=#{param1} and id=#{param2}
	</select>

3.命名参数

使 用@Param()来指定多个参数封装Map时所使用的key

封装规则:Mybatis会把多个参数封装成一个Map,封装时使用的key是:通过@Param指定的key、param1param2....paramN

取值:#{@Param指定的key/param1param2....paramN}

例如:

操作:public Employee getEmpsLastNameAndIdNamedParameter(@Param("lastName") String lastName, @Param("Id") Integer id);

取值:#{lastName/param1}#{id/param2}

<select id="getEmpsLastNameAndIdNamedParameter" resultType="employee">
		select * from tbl_employee where last_name=#{param1} and id=#{param2}
	</select>
 
	<select id="getEmpsLastNameAndIdNamedParameter" resultType="employee">
		select * from tbl_employee where last_name=#{lastName} and id=#{id}
	</select>

4.Map 如果参数很多

但是不属于某个对象的属性,也是很常用,可以直接封装成map进行传递。

封装规则:Mybatis不做特殊处理,直接使用传递的Map

取值 :#{map中的key}

例如:public List<Employee> getEmpsByLastNameLikeAnsEmailLike(Map<String,Object> map);

<select id="getEmpsByLastNameLikeAnsEmailLike" resultType="employee">
		select * from tbl_employee where last_name like '${ln}' and email like
		'${email}'
	</select>
/*
	 * 5.如果参数很多,但不属于某个对象的属性,也不是很常用,可以直接封装成map进行传递 封装规则 Mybatis不做特殊处理 直接使用传递的map
	 * 取值 #{map中的key}
	 */
	@Test
	public void testMap() throws IOException {
		SqlSessionFactory ssf = getSqlSessionFactory();
		SqlSession sqlSession = ssf.openSession();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("ln", "%bq%");
		map.put("email", "%qq%");
		EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
		List<Employee> emps = mapper.getEmpsByLastNameLikeAnsEmailLike(map);
		System.out.println("使用map参数封装时的结果对象   " + emps);
	}

5.POJO ---> 传递单个对象

封装规则:Mybatis不做特殊处理

取值: #{POJO的属性名}

例如:

操作:public Integer addEmployee(Employee employee);

取值:#{employee的属性名idlastNameemailgender}

	<!--1. 字段名和属性名一一对应 2.parameter:确定传递参数的类型,也可以省略,mybatis会自动识别当前参数类型是什么 useGeneratedKeys:true使用自增主键的方式 
		keyProperty="id" 确定当前对象的哪个属性保存主键信息 保存自增主键值 -->
	<insert id="addEmployee" parameterType="com.hbsi.bean.Employee"
		useGeneratedKeys="true" keyProperty="id">
		insert into tbl_employee(last_name,email,gender)
		values(#{lastName},#{email},#{gender})
	</insert>

6.TO: Transfer Object数据传输对象

如果参数很多,但不属于某个对象的属性,却很常用,推荐写成java类,封装成对象进行传递

例如:在分页功能用的较多:封装成Page类{ int pageNo, int pageSize, int pages , boolean isHasPrevpage,boolean isHasNextPge......}

7.集合-------使用mybatis迭代

封装规则: MyBatis对 CollectionArray 会进行特殊处理, 也会封装Map。

封装的key:

  • Collection(List/Set):使用的key: collection
  • List :使用的key: collection/ list
  • Array:使用的key:array

例如:

操作:

public void deleteByExample(List<Integer> ids);

取值:(此时的key必须为list或collection)

<delete id="deleteByExample">
		delete from tbl_employee where id in
		<if test="_parameter!=null">
			<foreach close=")" collection="list" item="id" open="("
				separator=",">
				#{id}
			</foreach>
		</if>
	</delete>

集合-------使用mybatis迭代也可使 用@Param()来指定参数封装Map时所使用的key,多个参数也可以

操作

public void deleteByExample(@Param("listId")List<Integer> ids);

取值:此时的可以使用@Param("listId")指定的别名,listId

<delete id="deleteByExample">
		delete from tbl_employee where id in
		<if test="_parameter!=null">
			<foreach close=")" collection="listId" item="id" open="("
				separator=",">
				#{id}
			</foreach>
		</if>
	</delete>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java中的类型擦除type erasure示例详解

    java中的类型擦除type erasure示例详解

    泛型是java从JDK 5开始引入的新特性,泛型的引入可以让我们在代码编译的时候就强制检查传入的类型,从而提升了程序的健壮度,泛型可以用在类和接口上,在集合类中非常常见,本文将会讲解泛型导致的类型擦除
    2023-09-09
  • Maven setting配置镜像仓库的方法步骤

    Maven setting配置镜像仓库的方法步骤

    这篇文章主要介绍了Maven setting配置镜像仓库的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 通过实例了解Java Integer类和int的区别

    通过实例了解Java Integer类和int的区别

    这篇文章主要介绍了通过实例了解Java Integer类和int的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java关于List集合去重方案详细介绍

    Java关于List集合去重方案详细介绍

    实际项目开发中,很多业务场景下都会遇见集合去重。在说到List集合去重之前,首先我们回顾下普通类型的list如何去重
    2021-09-09
  • mybatis-plus与JPA混合的使用方式

    mybatis-plus与JPA混合的使用方式

    这篇文章主要介绍了mybatis-plus与JPA混合的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java找不到或无法加载主类及编码错误问题的解决方案

    Java找不到或无法加载主类及编码错误问题的解决方案

    今天小编就为大家分享一篇关于Java找不到或无法加载主类及编码错误问题的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Java引用传递实现方式以及与值传递的区别

    Java引用传递实现方式以及与值传递的区别

    这篇文章主要给大家介绍了关于Java引用传递实现方式以及与值传递的区别的相关资料,引用传递指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数,需要的朋友可以参考下
    2023-09-09
  • Java Comparable和Comparator对比详解

    Java Comparable和Comparator对比详解

    这篇文章主要介绍了Java Comparable和Comparator对比详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java SelectableChannel的使实例用法讲解

    java SelectableChannel的使实例用法讲解

    在本篇文章里小编给大家整理的是一篇关于java SelectableChannel的使实例用法讲解内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • SpringBoot注册Servlet的三种方法详解

    SpringBoot注册Servlet的三种方法详解

    这篇文章主要介绍了SpringBoot注册Servlet的三种方法详解,教你如何Spring Boot 注册 Servlet、Filter、Listener,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论