1. 参数占位符
1.1 #{} 和 ${} 的区别
- #{} 占位符
- 作用:安全传参。MyBatis在执行SQL时,会把#{}替换成?,然后用参数值自动填充。
- 优点:可以防止SQL注入,推荐使用。
- 例子:
select * from user where id = #{id}
实际执行时会变成:select * from user where id = ?,参数由MyBatis自动设置。
- ${} 占位符
- 作用:字符串拼接。MyBatis会直接把${}里的内容拼到SQL语句里。
- 缺点:容易造成SQL注入风险,不推荐用于传递用户输入的参数。
- 例子
select * from ${tableName}
如果tableName参数是user,实际SQL就是select * from user。
1.2 使用时机
- 参数传递(如where条件、值等):都用#{},安全!
- 动态设置表名、列名:只能用${},因为表名/列名不能用?占位。
2. parameterType 属性
- 作用:用于设置Mapper方法参数的类型。
- 说明:如果参数类型能被MyBatis自动推断出来,可以省略不写。
- 例子:
<select id="selectById" parameterType="int">select * from user where id = #{id}</select>
但如果你的Mapper接口方法参数已经写明类型,这里可以省略
3. SQL语句中的特殊字符处理
- 转义字符:如果SQL中需要写特殊字符(如<、>、&等),需要转义。
- <![CDATA[ ... ]]>:这是XML中的一种写法,表示里面的内容不需要被XML解析器处理,可以直接写SQL语句,包括特殊字符。
- 例子:
<select id="select"><![CDATA[select * from user where name like '%a%']]></select>
- 好处:防止XML解析器把SQL里的特殊字符当成标签或报错。
总结口诀
- 传参用#{},拼接用${},表名列名才用${},防注入要记住。
- parameterType能省则省,类型一致最保险。
- 特殊字符用<![CDATA[ ... ]]>包裹,写SQL更自由。