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);
-
if标签中test属性是必须的。
-
if标签中test属性的值是false或者true。
-
如果test是true,则if标签中的sql语句就会拼接。反之,则不会拼接。
-
test属性中可以使用的是:
当使用了@Param注解,那么test中要出现的是@Param注解指定的参数名。@Param(“brand”),那么这里只能使用brand
当没有使用@Param注解,那么test中要出现的是:param1 param2 param3 arg0 arg1 arg2…
当使用了POJO,那么test中出现的是POJO类的属性名。
-
在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语句的最后面以什么结束。
批量删除
<delete id="deleteByIds">
delete from t_car where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<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>