{}占位符 可以直接看最后的总结!
介于上篇博客中Mybatis快速入门 增删改查 傻瓜教程!SQL语句中的值是写死在SQL中,而在实际开发中,此处的值往往是用户提交过来的值,因此这里我们需要将SQL中写死的值替换为占位符。
1.查询emp表中指定id的员工信息
<select id="findById" resultType="com.tedu.pojo.Emp">
select * from emp where id=#{id}
</select>
2.删除emp表中指定id的员工信息
<insert id="delete2" parameterType="String">
delete from emp where id=#{id}
</insert>
{}和${}占位符
在上面的增删改查练习中,当SQL语句中包含的参数值是传递过来的,在SQL语句中我们会通过#{}
占位符进行占位,在SQL语句真正执行时,再将传递过来的值替换SQL语句中的占位符。
其实,#{}
就是JDBC中的问号(?)占位符,因此为了安全考虑,在执行时会对传递过来的值进行转译处理。
例如:查询指定name的员工信息,SQL语句为:
select * from emp where name=#{name}
其实就等价于JDBC中:
select * from emp where name=?
如果传过来的参数值为:哈士奇,那么最终执行的SQL语句为:
select * from emp where name='哈士奇'
那么如果我们在传递的时候不是一个参数值,而是一个SQL片段呢?例如:在查询时,我们想动态的传递查询的列:
select 查询的列? from emp
此时传递过来的应该是一个SQL片段,不同于上面的参数值,如果此时还用#{}
,也会像上面一样被转译处理,这不是我们希望看到的。
如果不想让传过来的SQL片段被转译处理,而是拼接在SQL语句中,那么这里可以使用${}
,例如:
select ${columns} from emp
示例1:查询emp表中所有员工的名称(name)、职位(job):
mapper文件配置:
<!-- 练习9: 动态显示要查询的列 -->
<select id="findAll2" resultType="com.tedu.pojo.Emp">
select ${cols} from emp
</select>
总结一下就是,在条件中用#{ } 查询后面用${ }
在程序中能用#{}就用#{},不过有时你只是想直接在 SQL 语句中插入一个不改变的
字符串,比如一个数据对象中的表名等,或者 ORDER BY 排序时可以使用${}
#{} 在解析时会解析成 JDBC 中 PreparedStatement 预编译 sql,防止 sql 注入:
${}在解析时会解析成字符串参数,类似于 JDBC 中 Statement sql,无法防止 sql 注入:
详细资料请私聊本人 如有不当,请及时指点! ~~今晚打老虎!