在mybatis的动态传参中, 我们可以私用#{},传递参数,也可以使用${}传递参数, 他们有什么差别呢?
如果在mybatis中的sql语句,使用的是in条件查询,则使用${}时会报错,这又是为什么呢?
2.举例说明
2.1. UserDao接口的方法
//根据字符串usernames,查询所有的User信息
public List findByNames(@Param(“usernames”) String usernames) throws Exception;
2.2. 调用该方法
public class MybatisTest {
@Test
public void test01() throws Exception {
InputStream is = Resources.getResourceAsStream(“SqlMapconfig.xml”);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
//假设参数是 ‘lucy’,‘tom’
String usernames = “‘lucy’,‘tom’”;
List list = userDao.findByNames(usernames);
System.out.println(list);
}
}
2.3.配置(映射)文件中的配置
2.3.1.使用#{}
① 修改xml设置
select * from user where username in (#{usernames})
② 执行删除test01()测试方法
③ 查看执行日志
DEBUG *** ==> Preparing: select * from user where username in (?)
DEBUG *** ==> Parameters: ‘lucy’,‘tom’(String)
DEBUG *** ==> Total: 0
④ 结论
#{} 预编译完成后, 变成了占位符?, 可以预防sql攻击
2.3.2 使用${}
① 修改xml设置
select * from user where username in (${usernames})
② 执行删除test01()测试方法
③ 查看执行日志
select * from user where username in (${usernames})