给 SQL 语句传参的两种方式

1、#{}方式

Mybatis 会在运行过程中,把配置文件中的 SQL 语句里面的#{}转换为“?”占位符,发送给数据库执行。

配置文件中的 SQL:

1
2
3
<delete id="deleteEmployeeById">
delete from t_emp where emp_id=#{empId}
</delete>

实际执行的 SQL:

1
delete from t_emp where emp_id=?

2、${}方式

将来会根据${}拼字符串

①SQL 语句

1
2
3
<select id="selectEmployeeByName" resultType="com.atguigu.mybatis.entity.Employee">
select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_name like '%${empName}%'
</select>

②Mapper 接口

注意:Mapper 接口中不能出现重名的方法,哪怕是重载的方法也不行!

1
2
3
4
5
6
7
8
9
10
11
12
public interface EmployeeMapper {

Employee selectEmployee(Integer empId);

Employee selectEmployeeByName(@Param("empName") String empName);

int insertEmployee(Employee employee);

int deleteEmployee(Integer empId);

int updateEmployee(Employee employee);
}

③junit 测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void testDollar() {
SqlSession session = sessionFactory.openSession();

EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

Employee employee = employeeMapper.selectEmployeeByName("r");

System.out.println("employee = " + employee);

session.commit();

session.close();
}

④ 实际打印的 SQL

1
select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_name like '%r%'

⑤ 应用场景举例

在 SQL 语句中,数据库表的表名不确定,需要外部动态传入,此时不能使用#{},因为数据库不允许表名位置使用问号占位符,此时只能使用${}。

其他情况,只要能用#{}肯定不用${},避免 SQL 注入。