Mybatis的占位符 ${} and #{} 兄弟二人!

{}占位符 可以直接看最后的总结!

介于上篇博客中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文件配置:

扫描二维码关注公众号,回复: 10962352 查看本文章
<!-- 练习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 注入:

详细资料请私聊本人 如有不当,请及时指点! ~~今晚打老虎!

发布了10 篇原创文章 · 获赞 0 · 访问量 351

猜你喜欢

转载自blog.csdn.net/weixin_45925109/article/details/105372645
今日推荐