欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MyBatis总结(十三)--参数处理_单个参数&多个参数&命名参数

程序员文章站 2022-05-11 13:06:55
...

本文内容来自尚硅谷

本文代码来自: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中进行如下设置

MyBatis总结(十三)--参数处理_单个参数&amp;多个参数&amp;命名参数

就ok了!

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