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/param1  param2....paramN.

    取值  :#{0 1 2 ....N-1/param1  param2....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、param1  param2....paramN

          取值:#{@Param指定的key/param1  param2....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的属性名  id  lastName  email  gender}

	<!--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对 Collection  Array 会进行特殊处理也会封装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>

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中的@Param注解用于指定参数的名称,以便在SQL语句中引用。在使用该注解时,需要注意以下几点: 1. 单一属性:使用#{}的方式将@Param注解中的参数名称引用到SQL语句中。例如,如果@Param注解的参数名称为id,则在XML映射文件中查询字段应该为#{id}而不是#{userId}。 2. JavaBean对象:对于单个JavaBean对象,可以直接引用该对象的属性名称作为参数。例如,如果参数为一个名为user的JavaBean对象,可以在SQL语句中直接引用user对象的属性,如#{user.id}、#{user.name}等。 3. useActualParamName配置项:MyBatis的全局配置项useActualParamName决定了是否允许使用方法签名中的参数名称作为语句参数名称。默认情况下,该配置项为true,表示可以使用方法签名中的参数名称。如果想要启用该特性,需要确保项目使用Java 8编译,并在编译参数中加上-parameters选项。使用该特性时,传递参数时需要使用参数名称作为键,如#{paramName}。 总结起来,@Param注解是MyBatis中用于指定参数名称的注解,可以让开发者更灵活地在SQL语句中引用参数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MyBatis-@param注解详解](https://blog.csdn.net/xuonline4196/article/details/87994394)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值