首页 专题 文章 代码 归档
Mybatis的参数处理
2020.02.05 18:41 2020.02.05 18:45

1. 参数处理

1.1. 单个参数

对于单个参数来说,我们给参数起什么名字都没有问题。

<delete id="deleteById" parameterType="java.lang.Integer">
    delete from employee where id =#{id}
</delete>

比如上面的#{id},我们无论是id还是idddd还是ixxx,都是没任何问题的,在这里它就像是一个占位符。

1.2. 多个参数

多个参数会被封装成一个map:

  • key:paraml...paramN,或者参数的索引也可以
  • value:传入的参数值

#{}就是从map中获取指定的key的值;

也就是这样:

接口:

public Employee findByIdAndLastName(Integer id, String lastName);

配置:

<select id="findByIdAndLastName" resultType="employee">
    select * from employee where id=#{param1} and last_name=#{param2};
</select>

多个参数推荐命名参数:

接口上使用注解:

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

配置:

<select id="findByIdAndLastName" resultType="employee">
    select * from employee where id=#{id} and last_name=#{lastName};
</select>

1.3. POJO&Map

如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo;

#{属性名}:取出传入的pojo的属性值

如果多个参数不是业务模型中的数据,没有对应的pojo,为了方便,我们也可以传入map。

#{key},就是取出map中的value

接口:

public Employee findByMap(Map<String, Object> map);

配置:

<select id="findByMap" resultType="employee">
    select * from employee where id=#{id} and last_name=#{lastName};
</select>

测试:

Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 4);
map.put("lastName", "TestInsert");

Employee byMap = mapper.findByMap(map);
System.out.println("byMap = " + byMap);
sqlSession.commit();//记得提交

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

Page{ int size; int page; }

1.4. 参数取值#&$

#{}:可以获取map中的值或者pojo对象属性的值;

${}:可以获取map中的值或者pojo对象属性的值;

#{}方式:以预编译的形式,将参数设置到sql语句中;PreparedStatement;可防止SQL注入

${}方式:取出的值直接拼装在sq1语句中;


大多情况下,我们去参数的值都应该去使用#{};

原生jdbc不支持占位符的地方我们就可以使用${}进行取值,比如分表;按照年份分表拆分

select*from ${year}_salary where xxx;

1.5. #{}取值更多的用法

规定参数的一些规则:

javaType、jdbcType、mode(存储过程)、numericScale、resultMap、typeHandler、jdbcTypeName、expression(暂不支持)

jdbcType通常需要在某种特定的条件下被设置:

在我们数据为nu11的时候,有些数据库可能不能识别mybatis对nu11的默认处理。比如Oracle(报错);

用法:#{lastname,jdbcType=NULL}

本节阅读完毕! (分享
二维码图片 扫描关注我们哟