mybatis转义字符有哪些?mybatis动态SQL要如何编写?

TheDisguiser 2020-06-14 08:48:42 java常见问答 4396

小伙伴们知道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转义字符

以上就是关于mybatis转义字符及动态SQL编写的全部内容了,我们网站收录了各种java知识及常见问题答案,如果小伙伴们需要了解学习java,请一定要记住关注我们的网站噢。

推荐阅读:

mybatis二级缓存配置要如何编写?该怎么启动?

mybatis和hibernate的区别是什么?有什么区别?

mybatis中的#和$的区别是什么?它们分别有什么作用?