参数处理
单个参数
mybatis 不会做特殊处理
{参数名}:取出参数值
public Employee getEmpById(Integer id);
<select id="selectEmp" resultType="com.atguigu.mybatis.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
多个参数
mybatis 会做特殊处理
多个参数就会被封装成一个map
key: param1....param10 或者参数的索引
value:传入的参数值
异常
org.apache.ibatis.binding.BindingException:
Parameter 'id' not found.
Available parameters are [0, 1, param1, param2]
操作
方法:
public Employee getEmpByIdAndName(Integer id,String lastName);
取值:
<select id="getEmpByIdAndName" resultType="com.atguigu.mybatis.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id} and last_name=#{lastName}
</select>
命名参数: 明确指定封装参数时map的 key:@param("id")
多个参数会被封装成一个map
key: 使用@param注解指定的值
value:参数值
public Employee getEmpByIdAndName(@Param("id") Integer id, @Param("lastName") String lastName);
{指定的key} 取出对应的参数值
<select id="getEmpByIdAndName" resultType="com.atguigu.mybatis.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id} and last_name=#{lastName}
</select>
pojo:
如果多个参数正好时我们业务逻辑的数据模型,我们就可以直接传入pojo
{属性名}:取出传入的pojo的属性值
map
如果多个参数不是业务模型中的数据,没有对应的pojo,我们可以传入map
{key}:取出map中对应的值
public Employee getEmpByMap(Map<String,Object> map);
<select id="getEmpByMap" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee where id=#{id} and last_name=#{lastName}
</select>
如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer object)数据传输对象
Page{
int index
int size
}
参数拓展思考
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 getEmpById(List<Integer> ids);
取值:取出第一个id的值: #{list[0]}
总结
参数多时会封装map,为了不混乱,我们可以使用@param来指定封装是使用的key
{key}就可以去取出map的值
参数的获取
{ }:可以获取map中的hi或者pojo对象属性的值
${ }:可以获取map中的hi或者pojo对象属性的值
区别:
{ }:是以预编译的形式,将参数设置到sql语句中,PreparedStatement。防止sql注入
${ }:区处得知直接拼装在sql语句中,会有安全问题
大多情况下,取参数的值都应该取使用#{}
原生jdbc 不支持占位符的地方就可以使用${}
比如分表:按照年份拆分
select * from ${year}_salary where xxx;
select * from tbl_employee order by ${f_name} ${order}
#{ }:更丰富的用法
规定参数的一些规则:
– javaType、jdbcType、mode(存储过程)、numericScale、
resultMap、typeHandler、jdbcTypeName、expression
jdbcType 通常需要在某种特定的条件下被设置:
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理,比如Oracle(报错)
JdbcType OTHER;无效的类型,因为mybaits对所有的nll都映射的是原生Jdbc的OTHER类型,oracle 不能正确处理
由于全局配置中,JdbcTypeForNull = OTHER,oracle不支持;
1、#{email,JdbcType =OTHER};
2、JdbcTypeForNull = NULL
<setting name="JdbcTypeForNull" value="NULL" />