[mybatis]映射文件_参数处理

Posted 唐火

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[mybatis]映射文件_参数处理相关的知识,希望对你有一定的参考价值。

参数处理

  • 单个参数:mybatis不会做特殊处理

    • #参数名:取出参数值
  • 多个参数:mybatis会做特殊处理

    • 多个参数会被封装成一个map
      • key:param1…paramN,或者参数的索引
      • value:传入的参数值
    • #就是从map中获取指定的key的值;
  • 命名参数:明确指定封装参数时map的key:@Param(“id”)

    • 多个参数会被封装成一个map
      • key:使用@Param注解指定值
      • value:参数值
    • #指定的key取出对应的参数值
  • pojo

    • 如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo;
    • #属性名:取出传入的pojo的属性值
  • 如果多个参数不是业务模型中的数据,没有对应的pojo,为了方便,我们也可以传入map

    • #key:取出map中对应的值
  • TO

    • 如果多个参数不是业务模型中的数据,但是经常使用,推荐来编写一个TO(Transfer Object)数据传输对象
//TO
Page

	int index;
	int size;

    public Employee getEmpByIdAndLastName(Integer id,String lastName);
 <select id = "getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">
        select * from tb1_employee where id = #id and last_name = #lastName
    </select>
   Employee employee = mapper.getEmpByIdAndLastName(1, "Admin");

报错:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]

正确写法:

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

命名参数法:

    public Employee getEmpByIdAndLastName(@Param("id") Integer id,@Param("lastName") String lastName);

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

map法:

  public Employee getEmpByMap(Map<String ,Object> map);
    <!--public Employee getEmpByMap(Map<String,Object> map);-->
    <select id="getEmpByMap" resultType="com.atguigu.mybatis.bean.Employee">
        select * from tb1_employee where id = #id and last_name = #lastName
    </select>
    Map<String,Object> map = new HashMap<>();

            map.put("id",1);

            map.put("lastName","Tom");

            Employee employee = mapper.getEmpByMap(map);

扩展思考:

public Employee getEmp(@Param("id") Integer id,String lastName);

取值:
id -> #id/param1
lastName -> #param2

public Employee getEmp( Integer id,@Param("e") Employee emp);

取值:
id -> #param1
lastName -> #param2.lastName/e.lastName

  • 特别注意:如果是Collection(List,Set)类型或者数组,也会特殊处理。也是把传入的list或者数组封装在map中
    • key:Collection(collection),如果是List还可以使用这个key(list),数组(array)
public Employee getEmp(List<Integer> ids);

取值:
取出第一个id的值:
#list[0]

以上是关于[mybatis]映射文件_参数处理的主要内容,如果未能解决你的问题,请参考以下文章

[mybatis]映射文件_参数处理_#和$取值区别

Mybatis 映射文件-参数处理

MyBatis映射文件

第三节:mybatis之参数处理

[刘阳Java]_MyBatis_映射文件的常用标签总结_第5讲

Mybatis——映射文件,缓存,整合