引申
-
什么是动态sql?动态SQL指的是事先无法预知具体的条件,需要在运行时根据具体的情况动态地生成SQL语句。假设我们有一个获取用户信息查询操作,具体的查询条件是不确定的,取决于Web前端表单提交的数据,可能根据用户的Id进行查询,也可能根据用户手机号或姓名进行查询,还有可能是这几个条件的组合。这个时候就需要使用MyBatis的动态SQL特性了。
-
MyBatis两种常用的参数占位符
#{}
和${}
的区别?
使用`#{}`参数占位符时,占位符内容会被替换成“?”,然后通过PreparedStatement对象的setXXX()方法为参数占位符设置值;而${}参数占位符内容会被直接替换为参数值。
使用`#{}`参数占位符能够有效避免SQL注入问题,所以我们可以优先考虑使用#{}占位符,当 #{} 参数占位符无法满足需求时,才考虑使用`${}`参数占位符
mybatis 有哪些用于动态sql的标签
- where:该标签用于保证至少有一个查询条件时,才会在SQL语句中追加WHERE关键字。
- if test:该标签用于判断参数是否满足条件,满足条件才会追加该标签里语句。
- <choose|when|otherwise>:该标签也是用判断参数是否满足条件,但是这个包含不满足条件追加的语句。所有的
标签和 标签是互斥的,当任何一个 标签满足条件时,其他标签均视为条件不成立 - foreach:该标签用于对集合参数进行遍历,通常用于构建IN条件语句或者INSERT批量插入语句。
对应示例sql
传入的参数是Map类型的
<select id="getHouseList" resultType="Houses" parameterType="java.util.Map">
select t.* from house t
<where>
<if test="search.name != null and search.name != '' ">
and t.name like CONCAT('%','${search.name}','%')
</if>
<if test="search.type != null and search.type != '' ">
and t.type = ${search.type}
</if>
<choose>
<when test="search.orderFiled != null and search.orderFiled != '' ">
order by t.${search.orderFiled} desc
</when>
<otherwise>
order by 't.price' desc
</otherwise>
</choose>
<if test="search.pageSize != '' and search.currentPage != '' ">
limit ${search.currentPage},${search.pageSize}
</if>
</where>
</select>
--本文作者:【ngLee 】
--关于博文:如果有错误的地方,还请留言指正。如转载请注明出处!如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!