专业的网站开发公司电话,百度搜索榜单,电脑怎么下载网页视频,wordpress透明为什么会有动态SQL#xff0c;把SQL写死不是比较方便吗#xff1f;其实有很多的举例#xff0c;这里我那一个常见的来说#xff0c;像我们用户注册#xff0c;会有必填字段和非必填字段#xff0c;有些传来的参数不一样#xff0c;那对应的SQL也不一样#xff0c;因此把SQL写死不是比较方便吗其实有很多的举例这里我那一个常见的来说像我们用户注册会有必填字段和非必填字段有些传来的参数不一样那对应的SQL也不一样因此在这些的场景底下我们需要使用动态SQL来完成。 这里动态SQL我是使用XML的办法进行说明因为使用注解不方便而且不好观察哪里有误。这里我会先从一些常用的标签的介绍来对动态SQL进行使用的讲解。
1.1 if标签 insert idinsertByConditioninsert into userinfo(if testusername ! nullusername/ifif testpassword ! null,password/ifif testage ! null,age/ifif testgender ! null,gender/if) values (if testusername ! null#{username}/ifif testpassword ! null,#{password}/ifif testage ! null,#{age}/ifif testgender ! null,#{gender}/if)/insert 从上述代码可以简单看出来if 标签是一个if test xxxxxxxx/if的结构然后另一个是运行后的结果这里发现如果if里面都有值的话可以完好的插入但是它就一定没问题吗下面一个图我就简单注释掉几个来实验一下。 从上图可以简单的看错来它是一个BadSql因为我们注掉了username导致多了一个逗号那怎么样才能避免上述情况呢那就要引入新的注解。
1.2trim 标签 这里我们先简单介绍一下trim标签里面几个常见的属性 1. prefix表示整个语句块以prefix的值作为前缀。 2. suffix表示整个语句块以suffix的值作为后缀。 3. prefixOverrides表示整个语句块要去除掉前缀。 4. suffixOverrides表示整个语句块要去掉后缀。
insert idinsertByConditioninsert into userinfotrim prefix( suffix) prefixOverrides,if testusername ! nullusername/ifif testpassword ! null,password/ifif testgender ! null,gender/ifif testage ! null,age/if/trimvaluestrim prefix( suffix) prefixOverrides,if testusername ! null#{username}/ifif testpassword ! null,#{password}/ifif testgender ! null, #{gender}/ifif testage ! null,#{age}/if/trim/insert 上述因为username是不能为空因此我把注掉username改为注掉gender可以发现在if标签里面的问题给解决了。
1.3 where标签
select idqueryUserByCondition resultTypecom.jincheng.mybatisdemo.model.UserInfoselect * from userinfowhereif testage ! nullage #{age}/ifif testgender ! nulland gender #{gender}/ifif testdeleteFlagand delete_flag #{deleteFlag}/if/where/selectselect idqueryUserByCondition resultTypecom.jincheng.mybatisdemo.model.UserInfoselect * from userinfotrim prefixwhere prefixOverridesandif testage ! nullage #{age}/ifif testgender ! nulland gender #{gender}/ifif testdeleteFlagand delete_flag #{deleteFlag}/if/trim/select 通过上面可以发现第一个是使用where标签进行写的而另一个是通过使用trim标签进行写的。可以简单比对一下where标签生成where关键字并且去除最前面的and 或者 or如果where标签代码块没有一个查询条件会省略掉where关键字。也可以使用trim prefixwhere prefixOverridesand替换但是这种情况下子元素没有内容时where关键字也会保留。
1.4 set标签
update idupdateByConditionupdate userinfosetif testpassword ! nullpassword #{password},/ifif testage ! nullage #{age},/ifif testgender ! nullgender #{gender}/if/setwhere id #{id}/update 这里set标签生成set关键字去掉整个代码块后面的逗号。如果使用trim prefixset suffixOverrides,可以进行替换。
1.5 foreach标签 简单来说一下foreach标签里面的属性: 1. collection绑定方法参数中的集合如LIstSetMap或数组对象 2. item遍历是的每一个对象 3. open语句块开头的字符串 4. close语句块结束的字符串 5. separator每次遍历之间间隔的字符串。
一般用在批量删除中等等。 delete idbatchDeletedelete from userinfowhere id inforeach collectionids open( close) itemid separator,#{id}/foreach/delete
1.6 inlcude标签 这个标签用于在xml映射文件中配置的SQL有时可能会存在很多重复的片段此时就会在很多多余的代码。 这里我们需要对重复的代码片段进行抽取将其通过sql标签封装到一个SQL片段然后通过include标签进行引用 1.sql : 定义可重用的SQL片段 2. include通过属性refid指定包含的SQL片段。 sql idselectAllselect * from userinfo/sqlselect idselect resultTypecom.jincheng.mybatisdemo.model.UserInfoinclude refidselectAll/include/select