盒子
盒子
文章目录
  1. 1. # 与 $的区别
  2. 2. @Mapper与@Repository区别

Mybatis面试篇

1. # 与 $的区别

Mybatis使用parameterType向SQL语句传参,parameterType后的参数可以是int\String\HashMap\java自定义类型。
在SQL中引用这些参数的时候,可以使用两种方式#{parameterName}和${parameterName}。

在使用#{parameterName}的时候,Mybatis会把这个参数认为是一个字符串,会加上’’, ${parameterName}则不会,如

1
2
select * from emp where name = #{employeeName} 会被转换为 select * from emp where name = 'Smith',
select * from emp where name = ${employeeName} 会被转换为 select * from emp where name = Smith

简单来说,#{}是经过预编译的,编译好SQL语句在取值,是安全的;而${}是未经过预编译的,仅仅是取变量的值,取值以后再去编译SQL语句,是不安全的,存在SQL注入。
只能$的情况: order by、like语句只能用${},用#{}会多个’’,导致SQL语句失效,此外动态拼接SQL也要用${},$一般用于传入数据库对象,如传入表名

2. @Mapper与@Repository区别

@Mapper是mybatis的注解,使用@Mapper然后使用@Autowired会爆红(因为@Autowired是Spring的注解,提示找不到相应的bean),但是不影响启动,可以使用JDK注解@Resource替代@Autowired,
@Repository是Spring的注解,配合@Autowired注解就不会出现爆红的问题,但是启动会报错,此时需要在启动类上添加@MapperScan(“online.shenjian.mapper”)即可

支持一下
扫一扫,支持沈健
  • 微信扫一扫
  • 支付宝扫一扫