mybatis-210718-04—映射文件_参数处理_取值_#&$
取值案例
参考尚硅谷视频链接地址:
https://www.bilibili.com/video/BV1mW411M737?p=22
https://www.bilibili.com/video/BV1mW411M737?p=23
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值:id--->#{list[0]}
#{ } — ${ }取值
参考尚硅谷视频链接地址:
https://www.bilibili.com/video/BV1mW411M737?p=24
#{ }:
可以获取map中的值或者pojo对象属性的值
${ }:
可以获取map中或者pojo对象属性的值
区别:
#{ }:是以预编译的形式,将参数设置到sql语句中:PrepareStatement,防止sql注入
${ }:取出的值直接拼接在sql语句中,会有安全问题
多数情况下,取参数的值都该使用#{ }
使用${ }取值案例:
原生jdbc不支持占位符的地方就可以使用${ }进行取值
// 根据年份查看哪一年的年薪
select * from ${year}_salary where xxx;
select * from tbl_employee order by ${'根据哪个字段排'} ${'升序/降序'};
${ }可以出现在from后面,但是#{ }不行
select * from ${tableName};
#{ }更丰富的用法
参考尚硅谷视频链接地址:
https://www.bilibili.com/video/BV1mW411M737?p=25
规定了参数的一些用法:
javaType、jdbcType、mode(存储过程)、numericScale、
resultMap、typeHandler、jdbcTypeName、expression(未来准备支持的功能)
jdbcType通常需要在某种特定的条件下被设置:
在我们数据为null的时候,有些数据可能不能识别mybatis对null的默认处理,比如Oracle(会报错)。
jdbcType OTHER:无效的类型,因为mybatis对所有的null的映射的是原生jdbc的OTHER类型,
Oracle不能正确处理。
由于全局配置中:jdbcTypeForNull=OTHER,Oracle不支持
解决01:
在EmployeeMapper.xml中配置,#{email,jdbcType=NULL}
<insert id="addEmp" parameterType="com.bgy.mybatis.bean.Employee"
useGeneratedKeys="true" keyProperty="id" databaseId="mysql">
insert into
tbl_employee(last_name,email,gender)
values (#{lastName},#{email,jdbcType=NULL},#{gender})
</insert>
解决02:
在mybatis-config.xml全局配置中,<setting name="jdbcTypeForNull" value="NULL"/>
<settings>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>