mybatis中#{}与${}的区别
今天学习了下mybatis的查询,了解到了#{}与${}的区别,
配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace隔离sql --> <mapper namespace="User"> <!-- id:statement的标识 --> <!-- #{}表示占位符(转为?),可以防止SQL注入;如果输入参数类型是简单类型,输入参数名称可以是value或者其它任意名称 --> <select id="getUserById" parameterType="int" resultType="org.pine.mybatis.po.User"> select * from user t where t.id = #{id} </select> <!-- resultType:单条记录的类型 --> <select id="listUserByUserame1" parameterType="java.lang.String" resultType="org.pine.mybatis.po.User"> select * from user t where t.username like #{username} </select> <!-- ${}表示拼接SQL(拼接参数),不能防止SQL注入;如果输入参数类型是简单类型,输入参数名称只能是value --> <select id="listUserByUsername2" parameterType="java.lang.String" resultType="org.pine.mybatis.po.User"> select * from user t where t.username like '%${value}%' </select> </mapper>
总结:
#{}表示占位符(转为?),可以防止SQL注入;如果输入参数类型是简单类型,输入参数名称可以是value或者其它任意名称
${}表示拼接SQL(拼接参数),不能防止SQL注入;如果输入参数类型是简单类型,输入参数名称只能是value
从SQL注入上来看,#{}有点类似于PreparedStatement,而${}有点类似于Statement