小伙伴们知道mybatis的转义字符都有哪些吗?平时我们编程都是工具自动生成就过去了,下面一起来看看mybatis有哪些转义字符及它该如何编写动态SQL吧。
mybatis动态SQL编写
1. if
if最常用的场景,就是使用在where条件部分。对于多条件查询,用户往往不能保证每个查询条件要素都耐心填写好值然后提交,这时我们可以使用if来解决这个问题。
数据访问接口
ListfindByNameAndCountryCode(City city);
映射文件
<select id="findByNameAndCountryCode" parameterType="City" resultType="City"> select * from city where 1=1 <if test="name!=null"> and name like #{name} </if> <if test="countryCode!=null"> and countrycode=#{countryCode} </if> </select>
在if标签中,提供了一个test属性,用来编写条件表达式,其写法非常类似于EL表达式(= , != , and , or在这里依然如此),当条件表达式为true的时候,才会拼接上标签里面的条件子句。需要注意的是,我们在条件表达式中获取JavaBean的属性时,不要加“#”。
同时,在条件中“1=1”这个要素的添加是讲究了一些技巧的,为什么呢?
我们可以设想,当下述的两个条件都判断不成立的时候,如果没有这个“1=1”的要素,我们通过mybatis拼接出来的sql字符串将会变成这个样子:
select * from city where
显然这是有sql语法错误的,添加上“1=1“以后,哪怕下面的所有条件都判断不成立那最终生成的sql也是没有问题的
select * from city where 1=1
测试代码:
public void findByNameAndCountryCode() { SqlSession session = SessionFactoryUtils.openSession(); CityMapper cityMapper = session.getMapper(CityMapper.class); City city = new City(); //city.setName("%a%"); city.setCountryCode("ARG"); cityMapper.findByNameAndCountryCode(city); SessionFactoryUtils.closeSession(session); }
关于条件判断,除开if以外,mybatis还提供了类似Java中switch的语法标签组合:choose/when/otherwise,大家可以查询文档自行实现
2. where
如果有代码洁癖,不喜欢使用”1=1“这种拼接sql的手法的话,mybatis还提供了where标签来很完美的解决这个问题,我们可以继续对上述的sql配置改进如下:
数据访问接口:同上
映射文件
<select id="findByNameAndCountryCode" parameterType="City" resultType="City"> select * from city <where> <if test="name!=null"> and name like #{name} </if> <if test="countryCode!=null"> and countrycode=#{countryCode} </if> </where> </select>
where元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“where”子句。而且,若语句的开头为“and”或“or”,where元素也会将它们去除。
测试代码:同上
3. foreach
foreach标签最常见的使用场景,便是用于范围查询:
数据访问接口
List < City > findCountryCodeIn(List < String > codes); List < City > findCountryCodeInOther(String[] codes);
<select id="findCountryCodeIn" resultType="City"> select * from city <where> <foreach collection="list" item="code" open="countrycode in(" close=")" separator=","> #{code} </foreach> </where> </select> <select id="findCountryCodeInOther" resultType="City"> select * from city <where> <foreach collection="array" item="code" open="countrycode in(" close=")" separator=","> #{code} </foreach> </where> </select>
-collection用来声明被循环对象的类型,list和array都是mybatis用来声明内置类型的关键字,用来对应表示Java类型中的List集合和数组
-item用来给循环变量取名
-open和close分别用来表示循环体的开关符号
-separator用来指定每个循环单元之间的分隔符
Mybatis转义字符表
以上就是关于mybatis转义字符及动态SQL编写的全部内容了,我们网站收录了各种java知识及常见问题答案,如果小伙伴们需要了解学习java,请一定要记住关注我们的网站噢。
推荐阅读: