04 映射文件-参数处理

参数处理

单个参数

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" />

上一篇:事件


下一篇:Airport(未解决。。。)