MyBatis参数处理和查询结果映射如何实现映射?
摘要:实际开发中应用细节 #{}和${}的区别? ‘#{}’:先编译sql语句,再给占位符传值,底层是PreparedStatement实现,可以防止sql注入,比较常用。 ‘#{}’传来的字符串类型的数据会自带单引号,比如:user_name=
实际开发中应用细节
#{}和${}的区别?
‘#{}’:先编译sql语句,再给占位符传值,底层是PreparedStatement实现,可以防止sql注入,比较常用。
‘#{}’传来的字符串类型的数据会自带单引号,比如:user_name=#{name} 会编译为 user_name=‘张三’
${}:先进行sql语句拼接,再编译sql语句,底层是Statement实现。存在sql注入现象。只有在需要进行sql关键字拼接的情况下才会用到。
${}传来的字符串类型的数据不带单引号,比如:user_name=#{name} 会编译为 user_name=张三 。这样会报语法错误。
优先使用#{}
那么什么时候使用${}呢?
在使用sql拼接的时候会用到,比如一个数据的查询结果是升序还是降序有前端传来的参数决定。因此使用${}更合适:
order by age=${orderType} 会编译为 order by age=asc。
如果使用#{}处理的话会编译为order by age=‘asc’ 会报语法错误!
当拼接表名时也会用到。
一些数据会分表存储。比如日志表,因为日志数据会非常大,可以每天生成一个日志表,每张表以当天的日期作为名称,例如:
log_2022-02-11、log_2022-02-12、log_2022-02-13.
这样查某一天的日志时,可以将log_和日期进行拼接 然后查询,此时就要用到${}
批量删除
批量删除时,参数一般为字符串,比如传来的参数id值为:‘1,2,3,4’。直接用where id in (#{id})会失效。
这里应该使用$() 。sql会编译为where id in (1,2,3,4) 结果执行成功。
模糊查询
方案一:使用sql语句拼接 where name like '%${name}%'
方案二:使用concat函数 where name like concat('%',#{name},'%') 此时会编译为 where name like concat('%','涨三','%') 执行成功。
方案三:where name like "%"#{name}"%"
别名机制
当XxxMapper.xml中resultType的值太长,也就是返回值的全限定类名太长,可以使用别名机制。
先在mybatis-config.xml中配置如下:
<!-- 起别名,typeAliases标签要放在properties、settings 标签后面-->
<typeAliases>
<!-- type:指定给哪个类型起别名
alias:指定别名。别名不区分大小写
然后在CarMapper.xml文件中就可以直接使用别名car来代替全类名com.ali.pojo.Car了
-->
<typeAlias type="com.ali.pojo.Car" alias="car"/>
</typeAliases>
这里的alias属性其实可以省略。当alias省略时,别名就是类的简名,比如:
<typeAlias type="com.ali.pojo.Car"/> 的别名就是car、CAR等,不区分大小写。
还有更加方便的一种方式,可以指定包名,mybatis会自动给这个包下的所i有类起别名,别名就是类名:
<typeAliases>
<package name="com.ali.pojo"/>
</typeAliases>
在CarMapper.xml中就可以使用别名了
<select id="selectCarById" resultType="car">
SELECT id, car_num AS carNum, brand, guide_price AS guidePrice, produce_time AS produceTime, car_type AS carType
FROM t_car
WHERE id = #{id}
</select>
注意:这里的别名不区分大小写。
