MyBatis总结(十三)--参数处理_单个参数&多个参数&命名参数
程序员文章站
2022-05-11 13:06:55
...
本文内容来自尚硅谷
本文代码来自:MyBatis总结(十二)--获取非自增主键的值
以查询语句为例
目录
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