动态SQL作用:Mybatis3采用了OGNL的表达式来完成动态SQL拼装。避免开发人员在进行数据库开发时,手动拼装SQL;
动态SQL主要元素:<if>
:判断语句,用于单条件分支判断;<choose>
(<when>
、<otherwise>
):相当于java的 switch、case、default语句,用于多条件分支判断;<where>、<trim>、<set>
:辅助元素,用于处理一些SQL拼装,特殊字符问题;<bind>
:从OGNL表达式创建一个变量,并将其绑定到上下文,常用语模糊查询的sql中;
1.<if>
应用demo:
2.<choose> <when> <otherwise>
应用demo:
这三个元素相当于java中的 switch case default 语句
3.<where>
元素的应用demo:
where元素需要与if 或者是 choose 元素配合使用,当内部子元素条件至少有一个满足时候,会在sql语句中自动插入 where 关键字。目的在于避免一定要在SQL语句中 提前写 where 条件,让SQL语句更加灵活
ps:但是这个时候 where 后 会直接是 and ……,效果是这样的
select …… where and ……
很明显的语法错误对不对,所以没有完美解决这个问题,是一个隐患
4.<trim>
:元素为解决 where and 关键字 在拼装SQL 造成的语法错误 而生:
在trim 元素中 配置 prefix="where" prefixOverrides="and"
即可解决 简单应用where元素 可能造成 where 与 and 关键字 造成的语法问题:
5.<set> <if>
元素在拼装 update 语句中的应用 demo:
此时,业务中对数据库 进行 update 操作,只需要在传入对象(customer)中set完属性值即可,交由Mybatis根据对象中属性值是否为空自行拼装SQL(该点优于Hibernate全表映射框架在更新数据时必须更新所有字段,效率相对较高)
6.<foreach>
: 用来实现 sql 语句中 select * from table where id in (id1,id2,id3,……)这样的形式:
其中,item 是循环中当前的元素;
index: 是当前元素在集合中的位置下标;
collection:是配置传递过来的参数类型,他可以是 array、list(或collection)、Map集合的键、POJO类(数据库表映射类)中数组或集合类型的属性名称;
separator:是各个元素之间的分隔符。
在几个属性中,collection最容易报错,该属性必须指定,在不同情况,属性值也是不同的:
若传入的是单个参数,且参数类型是一个数组或list,属性值分别为 array 、list(或collection);
若传入的参数是多个的时候,就需要封装成一个Map,这个时候collection的属性值就是Map的键;
若传入的是POJO类,collection属性值就是该类中需要进行遍历的数组或集合的属性名
7.<bind>
:元素意义:
避免在项目移植数据库的时候出现SQL语法问题,在进行模糊查询时,利用 bind 元素。
因为oracle 与 mysql 及其他数据库 sql 方言和SQL注入问题 的问题
(例如:
传统方法 ……like ‘ %${username}% ’,会导致SQL注入问题
mysql中 ……username like concat(’%’,username,’%’);;
oracle 中 是 || 拼接的;;
)
demo:
来源:CSDN
作者:黯蕶-veteran
链接:https://blog.csdn.net/weixin_43835284/article/details/104814461