网站建设安全规范,上海优刻得官网,湖北建网站公司,空间里怎么放多个网站在介绍MyBatis动态SQL实现原理之前#xff0c;我们先来了解一下MyBatis动态SQL的使用。顾名思义#xff0c;动态SQL指的是事先无法预知具体的条件#xff0c;需要在运行时根据具体的情况动态地生成SQL语句。
假设我们有一个获取用户信息查询操作#xff0c;具体的查询条件…在介绍MyBatis动态SQL实现原理之前我们先来了解一下MyBatis动态SQL的使用。顾名思义动态SQL指的是事先无法预知具体的条件需要在运行时根据具体的情况动态地生成SQL语句。
假设我们有一个获取用户信息查询操作具体的查询条件是不确定的取决于Web前端表单提交的数据可能根据用户的Id进行查询也可能根据用户手机号或姓名进行查询还有可能是这几个条件的组合。这个时候就需要使用MyBatis的动态SQL特性了。下面是使用MyBatis动态SQL进行条件查询的一个案例代码如下 select idgetUserByEntity resultTypecom.blog4java.mybatis.example.entity.UserEntityselectinclude refiduserAllField/from userwhereif testid ! nullAND id #{id}/ifif testname ! nullAND name #{name}/ifif testphone ! nullAND phone #{phone}/if/where/select
在上面的Mapper配置中当我们不确定查询条件时可以使用where和if标签通过OGNL表达式判断参数内容是否为空如果表达式结果为true则MyBatis框架会自动拼接if标签内的SQL内容否则会对if标签内的SQL片段进行忽略。
如上面配置中的where标签用于保证至少有一个查询条件时才会在SQL语句中追加WHERE关键字同时能够剔除WHERE关键字后相邻的OR和AND关键字。
除了if和where标签外MyBatis动态SQL相关的标签还有下面几个。choose|when|otherwise这几个标签需要组合使用类似于Java中的switch语法使用如下 select idgetUserInfo resultTypecom.blog4java.mybatis.example.entity.UserEntityselectinclude refiduserAllField/from user where 1 1choosewhen testid ! nullAND id #{id}/whenwhen testname ! nullAND name #{name}/whenotherwiseAND phone is not null/otherwise/choose/select
这组标签与if标签不同的是所有的when标签和otherwise标签是互斥的当任何一个when标签满足条件时其他标签均视为条件不成立。
foreach该标签用于对集合参数进行遍历通常用于构建IN条件语句或者INSERT批量插入语句。例如当我们需要根据一组手机号查询用户信息时可以使用如下配置 select idgetUserByPhones resultTypecom.blog4java.mybatis.example.entity.UserEntityselectinclude refiduserAllField/from userwhere phone inforeach itemphone indexindex collectionphonesopen( separator, close)#{phone}/foreach/select
trim|set这两个标签的作用和where标签的作用类似用于WHERE子句中因为不同的条件成立时导致AND或OR关键字多余或者SET子句中出现多余的逗号问题。
假如我们使用if标签进行动态SQL配置具体配置内容如下 select idgetUserByEntity resultTypecom.blog4java.mybatis.example.entity.UserEntityselectinclude refiduserAllField/from userwhereif testid ! nullAND id #{id}/ifif testname ! nullAND name #{name}/ifif testphone ! nullAND phone #{phone}/if/select
当调用Mapper时传入的id参数和name参数都不为空时生成的SQL是没问题的。但是当没有传入id参数或传入的id为空而name参数不为空时生成的SQL语句如下
select * from user where AND name?
显然这种情况下生成的SQL语句是存在语法问题的此时除了使用where标签外还可以使用trim标签来解决这个问题。trim标签的使用如下 select idgetUserByEntity resultTypecom.blog4java.mybatis.example.entity.UserEntityselectinclude refiduserAllField/from usertrimif testid ! nullAND id #{id}/ifif testname ! nullAND name #{name}/ifif testphone ! nullAND phone #{phone}/if/trim/select
set标签的作用和trim标签类似用于避免SET子句中出现多余的逗号。这里就不做过多介绍了可参考MyBatis官方文档。