Mybatis中#{}和${}的区别
Posted esummer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis中#{}和${}的区别相关的知识,希望对你有一定的参考价值。
在MyBatis 的映射配置文件中,动态传递参数有两种方式
- #{} 占位符 可以获取map中的值或者pojo对象属性的值;
- ${} 拼接符 可以获取map中的值或者pojo对象属性的值;
两者的作用都是从传入的pojo中获取对象属性的值
#{} 和 ${} 的区别
#{} 为参数占位符 ? 防止sql注入
例如
<select id="getRoleById" resultType="com.esummer.vo.RoleVo">
<!-- 使用#{}获取参数 --> select * from tb_role where tb_role.role_id=#{roleId} </select>
单元测试方法
@Test public void testDemo(){ RoleVo roleById = roleMapper.getRoleById(1); System.out.println(roleById); }
控制台输出内容
Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4f213a2] was not registered for synchronization because synchronization is not active JDBC Connection [com.mysql.jdbc.JDBC4Connection@6094de13] will not be managed by Spring ==> Preparing: select * from tb_role where tb_role.role_id=? ==> Parameters: 1(Integer) <== Columns: role_id, role_name <== Row: 1, admin <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4f213a2]
可看出 #{} 是通过以预编译的形式将参数设置到sql语句中 mybatis底层再返回PreparedStatement对象
${} 为字符串替换,即 sql 拼接
<select id="getRoleById" resultType="com.esummer.vo.RoleVo">
<!-- 使用${}获取参数 --> select * from tb_role where tb_role.role_id=${roleId} </select>
单元测试方法
@Test
public void testDemo(){
RoleVo roleById = roleMapper.getRoleById(1);
System.out.println(roleById);
}
控制台输出内容
Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@370c7cc5] was not registered for synchronization because synchronization is not active JDBC Connection [com.mysql.jdbc.JDBC4Connection@38159384] will not be managed by Spring ==> Preparing: select * from tb_role where tb_role.role_id=1 ==> Parameters: <== Columns: role_id, role_name <== Row: 1, admin <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@370c7cc5]
可看出 ${} 是在获得传入的参数后 将参数通过字符串方式 与sql语句进行拼接
#{} 和 ${} 的作用
- #{} 能防止sql 注入
- ${} 不能防止sql 注入
以上是关于Mybatis中#{}和${}的区别的主要内容,如果未能解决你的问题,请参考以下文章
MyBatis增删改查(步骤详细,由浅入深,适合初学者,只看这一篇就够了)
mybatis javaType 和 jdbcType 区别