怎么用editplus做网站,免费翻国外墙的浏览器,如何制作网页插件,文字直播网站怎么做的1 动态SQL
动态SQL是MyBatis的特征之一#xff0c;能够完成不同条件下不同的SQL拼接
1.1 if标签
在注册用户的时候#xff0c;可能会有这样一个问题#xff0c;由于注册分为两种字段#xff1a;必填字段和非必填字段#xff0c;如果在添加用户的时候有不确定的…1 动态SQL
动态SQL是MyBatis的特征之一能够完成不同条件下不同的SQL拼接
1.1 if标签
在注册用户的时候可能会有这样一个问题由于注册分为两种字段必填字段和非必填字段如果在添加用户的时候有不确定的字段传入程序应该如何实现此时就需要用到动态标签来判断了
例如添加的时候性别gender为非必填字段
Mapper
public interface UserInfoXMLMapper {Integer insertByXML(UserInfo userInfo);
}
insert idinsertByXMLinsert into userinfo (username,password,age,if testgender ! nullgender,/ifphone)values (#{username},#{password},#{age},if testgender ! null#{gender},/if#{phone})
/insert
Slf4j
SpringBootTest
class UserInfoXMLMapperTest {Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;Testvoid insertByXML() {UserInfo userInfo new UserInfo();userInfo.setUsername(222);userInfo.setPassword(222);userInfo.setAge(10);userInfo.setGender(1);userInfo.setPhone(123456);Integer integer userInfoXMLMapper.insertByXML(userInfo);log.info(integer.toString());}
}
首先观察填写gender的情况 Slf4j
SpringBootTest
class UserInfoXMLMapperTest {Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;Testvoid insertByXML() {UserInfo userInfo new UserInfo();userInfo.setUsername(222);userInfo.setPassword(222);userInfo.setAge(10);//userInfo.setGender(1);userInfo.setPhone(123456);Integer integer userInfoXMLMapper.insertByXML(userInfo);log.info(integer.toString());}
}
没有填写gender的情况此时gender这一选项就没有被拼接 1.2 trim标签
之前的插入用户功能只有一个gender字段是选择项如果有多个字段一般考虑使用标签结合标签对多个字段都采用动态生成的方式
标签中有如下属性
1prefix表示整个语句块以prefix的值作为前缀
2suffix表示整个语句块以suffix的值作为后缀
3prefixOverrides表示整个语句块要去除掉的前缀
4suffixOverrides表示整个语句块要去除掉的后缀
insert idinsertByXMLinsert into userinfotrim prefix( suffix) suffixOverrides,if testusername ! nullusername,/ifif testpassword ! nullpassword,/ifif testage ! nullage,/ifif testgender ! nullgender,/ifif testphone ! nullphone,/if/trimvaluestrim prefix( suffix) suffixOverrides,if testusername ! null#{username},/ifif testpassword ! null#{password},/ifif testage ! null#{age},/ifif testgender ! null#{gender},/ifif testphone ! null#{phone},/if/trim
/insert
上述代码在整个语句前加在整个语句后加去掉的后缀
Slf4j
SpringBootTest
class UserInfoXMLMapperTest {Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;Testvoid insertByXML() {UserInfo userInfo new UserInfo();userInfo.setUsername(222);userInfo.setPassword(222);userInfo.setAge(10);//userInfo.setGender(1);//userInfo.setPhone(123456);Integer integer userInfoXMLMapper.insertByXML(userInfo);log.info(integer.toString());}
}
让性别和电话号码两项编程非必填项再次观察结果 可以看出左右括号都添加上了并且去掉了最后面的 在以上SQL动态解析时会将第一个部分做如下处理 1基于prefix配置开始部分加上 2基于suffix配置结尾部分加上 3多个组织语句都以,结尾在最后拼接好的字符串还会以,结尾的会基于suffixOverrides配置去掉最后一个, 1.3 where标签
在以下场景系统会根据我们筛选的条件动态的组装where条件 ListUserInfo selectByXML(UserInfo userInfo);
select idselectByXML resultTypecom.example.demo.UserInfoselect * from userinfowhereif testusername ! nullusername #{username}/ifif testage ! nulland age #{age}/ifif testgender ! nulland gender #{gender}/if/where
/select
Test
void selectByXML() {UserInfo userInfo new UserInfo();userInfo.setUsername(222);userInfo.setAge(10);userInfo.setGender(1);ListUserInfo userInfoList userInfoXMLMapper.selectByXML(userInfo);log.info(userInfoList.toString());
} 去掉username和gender再次观察
Test
void selectByXML() {UserInfo userInfo new UserInfo();//userInfo.setUsername(222);userInfo.setAge(10);//userInfo.setGender(1);ListUserInfo userInfoList userInfoXMLMapper.selectByXML(userInfo);log.info(userInfoList.toString());
} 可以看到where自动帮我们去除了开头的and 当查询的条件都为空时where标签还会自动去掉where关键字
以上标签也可以使用 trim prefixwhere prefixOverridesand 替换但是有些情况下当子元素都没有内容时where关键字也会保留
1.4 set标签
根据传入的用户对象属性来更新用户数据可以使用标签指定动态内容
使用trim标签
Integer updateByXML(UserInfo userInfo);
update idupdateByXMLupdate userinfo settrim prefixset suffixOverrides,if testusername ! nullusername #{username},/ifif testage ! nullage #{age},/ifif testgender ! nullgender #{gender},/if/trimwhere id 14
/update
Test
void updateByXML() {UserInfo userInfo new UserInfo();userInfo.setUsername(456);userInfo.setAge(4);userInfo.setGender(2);Integer integer userInfoXMLMapper.updateByXML(userInfo);log.info(integer.toString());
} 将username和gender去掉再观察 使用set标签
Test
void updateByXML() {UserInfo userInfo new UserInfo();//userInfo.setUsername(456);userInfo.setAge(4);//userInfo.setGender(2);Integer integer userInfoXMLMapper.updateByXML(userInfo);log.info(integer.toString());
}
update idupdateByXMLupdate userinfosetif testusername ! nullusername #{username},/ifif testage ! nullage #{age},/ifif testgender ! nullgender #{gender},/if/setwhere id 14
/update 使用set标签可以再动态SQL语句中插入set关键字并且会删除额外的逗号用于update语句中
1.5 foreach标签
对集合进行遍历时使用该标签标签有如下属性
1collection绑定⽅法参数中的集合如ListSetMap或数组对象
2item遍历时的每⼀个对象
3open语句块开头的字符串
4close语句块结束的字符串
5separator每次遍历之间间隔的字符串
Integer deleteByIds(ListInteger ids);
delete iddeleteByIdsdelete from userinfo where id inforeach collectionids separator, itemid open( close)#{id}/foreach
/delete
Test
void deleteByIds() {Integer integer userInfoXMLMapper.deleteByIds(Arrays.asList(12, 13, 14, 15));log.info(integer.toString());
} 1.6 include标签
在XML映射文件中配置SQL有时可能会存在很多重复的片段此时就会存在很多冗余的代码 此时可以对重复的代码片段进行抽取将其通过sql标签封装到一个SQL片段 然后通过include标签进行引用
1sql定义可重用的SQL片段
2include通过属性refid指定包含的SQL片段
sql idallColumnid, username, age, gender, phone, delete_flag, create_time, update_time
/sql
select idqueryAllUser resultMapBaseMapselectinclude refidallColumn/includefrom userinfo
/select
select idqueryById resultTypecom.example.demo.model.UserInfoselectinclude refidallColumn/includefrom userinfo where id #{id}
/select