1. if标签

需求:多条件查询。
可能的条件包括:品牌(brand)、指导价格(guide_price)、汽车类型(car_type)

/**
* 多条件查询
* @param brand 品牌
* @param guidePrice 指导价
* @param carType 汽车类型
* @return
List<Car> selectByMultiCondition(@Param("brand") String brand, @Param("guidePrice") Double guidePrice, @Param("carType") String carType);
  1. if标签中test属性是必须的。
  2. if标签中test属性的值是false或者true。
  3. 如果test是true,则if标签中的sql语句就会拼接。反之,则不会拼接。
  4. test属性中可以使用的是:
    当使用了@Param注解,那么test中要出现的是@Param注解指定的参数名。@Param(“brand”),那么这里只能使用brand
    当没有使用@Param注解,那么test中要出现的是:param1 param2 param3 arg0 arg1 arg2…
    当使用了POJO,那么test中出现的是POJO类的属性名。
  5. 在mybatis的动态SQL当中,不能使用&&,只能使用and。
<select id="selectByMultiCondition" resultType="Car">
        select * from t_car where 1 = 1
        <if test="brand != null and brand != ''">
            and brand like "%"#{brand}"%"
        <if test="guidePrice != null and guidePrice != ''">
            and guide_price > #{guidePrice}
        <if test="carType != null and carType != ''">
            and car_type = #{carType}
</select>

测试

@Test
public void testSelectByMultiCondition(){
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(CarMapper.class);
    // 这三个参数可以动态调整
    List<Car> cars = mapper.selectByMultiCondition("丰田",20.0,"燃油车");
    cars.forEach(car -> System.out.println(car));
    sqlSession.close();
}

2.where标签

where标签的作用:让where子句更加动态智能。

  • 所有条件都为空时,where标签保证不会生成where子句。
  • 自动去除某些条件 前面 多余的and或or。
<select id="selectByMultiConditionWithWhere" resultType="Car">
        select * from t_car
        <!--where标签是专门负责where子句动态生成的。-->
        <where>
            <if test="brand != null and brand != ''">
                and brand like "%"#{brand}"%"
            <if test="guidePrice != null and guidePrice != ''">
                and guide_price > #{guidePrice}
            <if test="carType != null and carType != ''">
                and car_type = #{carType}
        </where>
    </select>

3 Trim标签

trim标签的属性:

  • prefix:加前缀
  • suffix:加后缀
  • prefixOverrides:删除前缀
  • suffixOverrides:删除后缀
<select id="selectByMultiConditionWithTrim" resultType="Car">
        select * from t_car
        <!--prefix="where" 是在trim标签所有内容的前面添加 where-->
        <!--suffixOverrides="and|or" 把trim标签中内容的后缀and或or去掉-->
        <trim prefix="where" suffixOverrides="and|or">
            <if test="brand != null and brand != ''">
                brand like "%"#{brand}"%" or
            <if test="guidePrice != null and guidePrice != ''">
                guide_price > #{guidePrice} and
            <if test="carType != null and carType != ''">
                car_type = #{carType}
        </trim>
    </select>

4 set标签

主要使用在update语句当中,用来生成set关键字,同时去掉最后多余的“,”
比如我们只更新提交的不为空的字段,如果提交的数据是空或者"",那么这个字段我们将不更新。

<update id="updateBySet">
        update t_car
            <if test="carNum != null and carNum != ''">car_num = #{carNum},</if>
            <if test="brand != null and brand != ''">brand = #{brand},</if>
            <if test="guidePrice != null and guidePrice != ''">guide_price = #{guidePrice},</if>
            <if test="produceTime != null and produceTime != ''">produce_time = #{produceTime},</if>
            <if test="carType != null and carType != ''">car_type = #{carType},</if>
        where
            id = #{id}
</update>

5 choose when otherwise

<choose>
  <when></when>
  <when></when>
  <when></when>
  <otherwise></otherwise>
</choose>

等同于

if(){
}else if(){
}else if(){
}else if(){
}else{
}

只有一个分支会被选择!!!!

<select id="selectByChoose" resultType="Car">
    select * from t_car
    <where>
        <choose>
            <when test="brand != null and brand != ''">
                brand like "%"#{brand}"%"
            </when>
            <when test="guidePrice != null and guidePrice != ''">
                guide_price > #{guidePrice}
            </when>
            <otherwise>
                car_type = #{carType}
            </otherwise>
        </choose>
    </where>
</select>

6 foreach标签

循环数组或集合,动态生成sql

foreach标签的属性:

  • collection:指定数组或者集合
  • item:代表数组或集合中的元素
  • separator:循环之间的分隔符
  • open: foreach循环拼接的所有sql语句的最前面以什么开始。
  • close: foreach循环拼接的所有sql语句的最后面以什么结束。

批量删除

  • 用in来删除
<delete id="deleteByIds">
     delete from t_car where id in
     <foreach collection="ids" item="id" separator="," open="(" close=")">
         #{id}
     </foreach>
</delete>
  • 用or来删除
<delete id="deleteByIds2">
    delete from t_car where
     <foreach collection="ids" item="id" separator="or">
         id=#{id}
     </foreach>
</delete>

批量插入

<insert id="insertBatch">
        insert into t_car values
        <foreach collection="cars" item="car" separator=",">
            (null,#{car.carNum},#{car.brand},#{car.guidePrice},#{car.produceTime},#{car.carType})
        </foreach>
</insert>

7 sql标签与include标签

sql 标签用来声明sql片段
include 标签用来将声明的sql片段包含到某个sql语句当中
作用:代码复用。易维护。

<!--声明一个SQL片段-->
<sql id="carColumnNameSql">
    car_num as carNum,
    brand,
    guide_price as guidePrice,
    produce_time as produceTime,
    car_type as carType
<select id="selectById" resultType="car">
    select
        <!--将声明的sql片段包含进来。-->
        <include refid="carColumnNameSql"/>
    from t_car where id = #{id}
</select>