1.一个参数:MyBatis不会做特殊处理
使用#{参数名},取出参数
2.多个参数:MyBatis会做特殊处理
如果还使用使用#{参数名},取出参数的话会出现异常
异常信息:
因为MyBatis的特殊处理,将参数封装成了一个map
key=param1,param2......paramN
value=传入的参数值
取出参数的操作:
#{param1},#{param2}....
3.命名参数:明确的指定封装参数是map的key,不要使用param1,param2了
使用@param注解,明确指定key
public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName);
4.POJO
如果多个参数正好是我们业务逻辑的数据模型,可以直接传入POJO
#{属性名},取出传入的pojo的属性值
5.Map
如果多个参数不是业务逻辑的数据模型,不经常使用,可以传入map
#{key},取出map中对应得value值
测试:
接口方法:
public Employee getEmpByMap(Map<String, Object> map);
测试类:
@Test void test05() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Map<String, Object> map = new HashMap<String, Object>(); map.put("id", 2); map.put("lastName", "张三"); Employee employee = mapper.getEmpByMap(map); System.out.println(employee); } finally { openSession.close(); } }
映射文件:
<!--public Employee getEmpByMap(Map<String, Object> map); --> <select id="getEmpByMap" resultType="emp"> select * from tbl_employee where id = #{id} and last_name = #{lastName} </select>
查询结果:
TO:
如果多个参数不是业务逻辑中的数据,但是经常使用,推荐编写一个TO(Transfer Object)数据传输对象
参数值的获取:
1.#{}:可以取出map的值或者pojo对象的属性值
2.${}:可以取出map的值或者pojo对象的属性值
区别:
#{}:是以预编译的形式,将参数设置到sql语句中,防止sql注入
日志打印的运行的sql语句:
${}:取出的值直接拼装在sql语句上,无法防止sql注入
日志打印的运行的sql语句:
原生JDBC不支持占位符的地方可以使用${}进行取值
eg:select * from table order by ${f_name} ${order} 动态排序
#{}:更多的用法
规定参数的一些规则
javaType、jdbcType、mode(存储过程)、numberScale、resultMap、typeHandler、jdbcTypeName
jdbcType通常需要在某种特定的条件向下被设置:
在我能数据为null时,有些数据库可以不能识别MyBatis对null值的默认处理。比如Oracle(报错)
jdbcType OTHER:无效类型,因为MyBatis对所有的null都映射的是原生jdbc的OTHER类型,Oracle不能 识别。
解决:
1、#{value jdbcType=NULL}
2、全局配置文件设置jdbcTypeForNull=NULL