Mybaits映射文件配置之参数获取#{}与${}的区别
在mybaits中#{}与${}都可以获取参数
参数获取方式 | 使用方式 | 区别 | 使用建议 |
---|---|---|---|
#{} | 不需要在参数前加 @Param | 参数注入方式 | 推荐使用 |
${} | 使用map,key/v,需要在参数前加 @Param ,才能获取到只 | 拼接sql语句方式 | 由sql注入风险,不推荐使用 |
测试对比一下
如果要使用$p{}方式获取,参数前一定要加注解 @Param
功能相同的sql
<!--
#{} 和 ${} 的区别
#{} 使用的是preparedStatement方式 预处理
${} 使用的是 Statement的方式 有sql注入的风险
-->
<select id="queryById1" resultType="user">
select * from t_user where id=#{id}
</select>
<select id="queryById2" resultType="user">
select * from t_user where id=${id}
</select>
测试一下
@Test
public void test1() throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis-cfg.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
// 获取代理类
UserMapper dao = session.getMapper(UserMapper.class);
User user = dao.queryById1(3);
System.out.println(user);
session.close();
}
@Test
public void test2() throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis-cfg.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
// 获取代理类
UserMapper dao = session.getMapper(UserMapper.class);
User user = dao.queryById2(3);
System.out.println(user);
session.close();
}
使用#{}方式获取参数,打印输出截图
使用${}方式获取参数,打印输出截图
项目打包 提取码:8idb
环境:eclipse,maven