Mybatis中#{}和${}的区别

Posted esummer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis中#{}和${}的区别相关的知识,希望对你有一定的参考价值。

在MyBatis 的映射配置文件中,动态传递参数有两种方式

  1. #{} 占位符 可以获取map中的值或者pojo对象属性的值;
  2. ${} 拼接符 可以获取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语句进行拼接

 #{} 和 ${} 的作用

  1. #{} 能防止sql 注入
  2. ${} 不能防止sql 注入

 

以上是关于Mybatis中#{}和${}的区别的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis增删改查(步骤详细,由浅入深,适合初学者,只看这一篇就够了)

mybatis javaType 和 jdbcType 区别

MyBatis中selectByExample和selectByExampleWithBLOBs区别

mybatis和ibatis的区别

Mybatis中#和$的区别

mybatis中的#和$的区别