13、Mybatis进阶:参数处理_单个参数&多个参数&命名参数

本文内容来自尚硅谷

本文代码来自:MyBatis总结(十二)--获取非自增主键的值

以查询语句为例

目录

1情况一:入参只有一个的情况

1、 1Junit:查询id值为一的结果集;

1、 2dao文件内容;

1、 3则映射文件可以如下写法;

2情况二:入参为多个的情况下

2、 1junit如下;

2、 2dao如下;

2、 3映射文件该如下写才正确;

2、 4那我们希望xml能用如下这种写法该该怎么办呢;


1情况一:入参只有一个的情况

1.1Junit:查询id值为一的结果集

	public void test04() throws IOException{
		
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		//1、获取到的SqlSession不会自动提交数据
		SqlSession openSession = sqlSessionFactory.openSession();
		
		try{
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			Employee employee = mapper.getEmpById(1);
			
			System.out.println(employee);
			
		}finally{
			openSession.close();
		}
	}

1.2dao文件内容

package com.atguigu.mybatis.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import com.atguigu.mybatis.bean.Employee;

public interface EmployeeMapper {
	
	//多条记录封装一个map:Map<Integer,Employee>:键是这条记录的主键,值是记录封装后的javaBean
	//@MapKey:告诉mybatis封装这个map的时候使用哪个属性作为map的key
	@MapKey("lastName")
	public Map<String, Employee> getEmpByLastNameLikeReturnMap(String lastName);
	
	//返回一条记录的map;key就是列名,值就是对应的值
	public Map<String, Object> getEmpByIdReturnMap(Integer id);
	
	public List<Employee> getEmpsByLastNameLike(String lastName);
	
	public Employee getEmpByMap(Map<String, Object> map);
	
	public Employee getEmpByIdAndLastName(@Param("id")Integer id,@Param("lastName")String lastName);
	
	public Employee getEmpById(Integer id);

	public Long addEmp(Employee employee);

	public boolean updateEmp(Employee employee);

	public void deleteEmpById(Integer id);
	
}

1.3则映射文件可以如下写法

	<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
		select * from tbl_employee where id = #{acd}
	</select>

说明:为什么where id=#大括号中可以输入任意值?因为:mybatis在入参只有一个的情况下,不会对参数做任何处理,所以上面的写法是正确的,如果还不清楚可以继续往下看。

2情况二:入参为多个的情况下

2.1junit如下

	public void test04() throws IOException{
		
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		//1、获取到的SqlSession不会自动提交数据
		SqlSession openSession = sqlSessionFactory.openSession();
		
		try{
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			Employee employee = mapper.getEmpByIdAndLastName(1, "tom");
			System.out.println(employee);
		}finally{
			openSession.close();
		}
	}

2.2dao如下

package com.atguigu.mybatis.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import com.atguigu.mybatis.bean.Employee;

public interface EmployeeMapper {
	
	//多条记录封装一个map:Map<Integer,Employee>:键是这条记录的主键,值是记录封装后的javaBean
	//@MapKey:告诉mybatis封装这个map的时候使用哪个属性作为map的key
	@MapKey("lastName")
	public Map<String, Employee> getEmpByLastNameLikeReturnMap(String lastName);
	
	//返回一条记录的map;key就是列名,值就是对应的值
	public Map<String, Object> getEmpByIdReturnMap(Integer id);
	
	public List<Employee> getEmpsByLastNameLike(String lastName);
	
	public Employee getEmpByMap(Map<String, Object> map);
	
	public Employee getEmpByIdAndLastName(Integer id,String lastName);
	
	public Employee getEmpById(Integer id);

	public Long addEmp(Employee employee);

	public boolean updateEmp(Employee employee);

	public void deleteEmpById(Integer id);
	
}

2.3映射文件该如下写才正确

 	<select id="getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">
 		select * from tbl_employee where id = #{param1} and last_name=#{param2}
 	</select>

为什么是这种写法才正确呢?我们不是希望如下写法吗

 	<select id="getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">
 		select * from tbl_employee where id = #{id} and last_name=#{lastName}
 	</select>

这是因为

单个参数:mybatis不会做特殊处理,
   #{参数名/任意名}:取出参数值。
   
多个参数:mybatis会做特殊处理。
   多个参数会被封装成 一个map,
      key:param1...paramN,或者参数的索引也可以
      value:传入的参数值
   #{}就是从map中获取指定的key的值;

2.4那我们希望xml能用如下这种写法该该怎么办呢

 	<select id="getEmpByMap" resultType="com.atguigu.mybatis.bean.Employee">
 		select * from ${tableName} where id=${id} and last_name=#{lastName}
 	</select>

可以在dao中进行如下设置

*

就ok了!

但是一般不推荐使用注释方式可以参考下面的文章MyBaits总结(十四)--MyBatis_映射文件_参数处理_POJO&Map&TO

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: