1. if标签:
if标签中test标签的值是false/true
如果test是true, 则if标签中的sql语句就会拼接, 反之则不会拼接
test属性中可以使用的是:
当使用@Param注解, 那么test中要出现的是@Param注解指定的参数名(@Param("brand"), 那么这里能使用brand)
当没有使用@Param注解, 那么test要出现的是param1,parm2,arg0.arg1
当使用POJO, 那么test中出现的是POJO类的属性名
// Carmapper.xml
<select id="selectByMultiCondition" resultType="Car">
select * from car where 1 = 1 // 1 = 1 是为了防止<if>都为空, 如果使用where标签则不用1=1
// 1. if标签中test标签的值是false/true
// 2. 如果test是true, 则if标签中的sql语句就会拼接, 反之则不会拼接
// 3. test属性中可以使用的是:
// 当使用@Param注解, 那么test中要出现的是@Param注解指定的参数名
// (@Param("brand"), 那么这里能使用brand)
// 当没有使用@Param注解, 那么test要出现的是param1,parm2,arg0.arg1
// 当使用POJO, 那么test中出现的是POJO类的属性名
// 4. && 不能使用, 只能使用 and
<if test="brand != null and brand != ''">
and brand like "%"#{brand}"%" </if>
<if test="guidePrice != null and guidePrice != ''">
// guide_price用的是数据库表中的字段名
and guide_price > #{guidePrice} </if>
<if test="carType != null and carType != ''">
// car_type用的是数据库表中的字段名
and car_type = #{carType} </if>
</select>
// 接口
public interface CarMapper{
// 多条件查询(品牌,指导价,汽车类型)
List<Car> selectByMultiCondition(
@Param("brand") String brand,
@Param("guidePrice") Double guidePrice,
@Param("carType") String carType);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
List<Car> cars = mapper.selectByMultiCondition(.....参数.....);
cars.forEach(car -> System.out.println(car));
sqlSession.close();
}
2. where标签:
where标签的作用: 让where子句更加动态智能
所有条件都为空时, where标签保证不会生成where子句
自动去除某些条件前面多余的and 或者 or
不可以去除sql语句后面的and 或者 or
// CarMapper.xml
<select id="selectByMultiConditionWithWhere" resultType="Car">
select * from car
// where标签是专门负责where子句动态生成的
<where>
<if test="brand != null and brand != ''">
and brand like "%"#{brand}"%" </if>
<if test="guidePrice != null and guidePrice != ''">
// guide_price用的是数据库表中的字段名
and guide_price > #{guidePrice} </if>
<if test="carType != null and carType != ''">
// car_type用的是数据库表中的字段名
and car_type = #{carType} </if>
</where>
</select>
// 接口
public interface CarMapper{
// 多条件查询(品牌,指导价,汽车类型)
// 使用where标签让where子句更加智能
List<Car> selectByMultiConditionWithWhere(
@Param("brand") String brand,
@Param("guidePrice") Double guidePrice,
@Param("carType") String carType);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
List<Car> cars = mapper.selectByMultiConditionWithWhere(.....参数.....);
cars.forEach(car -> System.out.println(car));
sqlSession.close();
}
3. trim标签:
trim标签的属性:
prefix: 在trim标签中的语句前添加内容, 加前缀
suffix: 在trim标签中的语句后添加内容, 加后缀
prefixOverrides: 前缀覆盖掉(去掉), 删除前缀
suffixOverrides: 后置覆盖掉(去掉), 删除后缀
4. set标签:
主要使用在update语句当中, 用来生成set关键字, 同时去掉最后多余的","
如果提交的数据是空或者是"", 那么这个字段将不更新.
4.1 不使用set标签:
会将参数为null的字段更改为null
不使用set标签
// CarMapper.xml
<update id="updateById">
update car set
car_num = #{carNum},
brand = #{brand},
guide_price = #{guidePrice},
produce_time = #{produceTime},
car_type = #{carType}
where
id = #{id}
</update>
// 接口
public interface CarMapper{
// 更新car
int updateById(Car car);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 会将字段更改为null
Car car = new Car(66L,,null,null,null,null,null);
mapper.updateById(car);
sqlSession.commit();
sqlSession.close();
}
4.2 使用set标签:
参数为null的部分将不会修改, 还是保持原样
使用set标签
// CarMapper.xml
<update id="updateBySet">
update car
<set>
<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>
</set>
where
id = #{id}
</update>
// 接口
public interface CarMapper{
// 更新car
int updateBySet(Car car);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 为null的部分将不会修改, 还是保持原样
Car car = new Car(66L,,null,null,null,null,null);
mapper.updateBySet(car);
sqlSession.commit();
sqlSession.close();
}
5. choose/when/otherwise标签:
只有一个分支会被选择!
如果参数全部为null, 那么走到otherwise
语法格式:
<choose>
<when></when>
<when></when>
<otherwise></otherwise>
</choose>
等同于:
if(){
}else if(){
}else if(){
}else{
}
代码如下:
// CarMapper.xml
<select id="selectByChoose" resultType="Car">
select * from 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>
// 接口
public interface CarMapper{
// 使用choose,when,otherwise标签
List<Car> selectByChoose(
@Param("brand") String brand,
@Param("guidePrice") Double guidePrice,
@Param("carType") String carType);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 如果参数全部为null, 那么走到otherwise
List<Car> cars = mapper.selectByChoose(.....参数.....);
cars.forEach(car -> System.out.println(car));
sqlSession.close();
}
6. foreach批量删除标签:
collection: 指定数组或者集合
item: 代表数组或集合中的元素
separator: 循环之间的分隔符
第一种写法:
// CarMapper.xml
<delete id="deleteByIds">
// delete from car where id in(1,2,3);
delete from car where id in(
// collection: 指定数组或者集合
// item: 代表数组或集合中的元素
// separator: 循环之间的分隔符
// 如果没有使用@Param注解那么collection应该写array,arg0
<foreach collection="ids" item="aaaaa" separator=",">
#{aaaaa}
</foreach>
)
</delete>
// 接口
public interface CarMapper{
// 批量删除, foreach标签
int deleteByIds(@Param("ids") Long[] ids);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Long[] ids = {56L,233L,65L};
int count = mapper.deleteByIds(ids);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
第二种写法:
// CarMapper.xml
<delete id="deleteByIds2">
// delete from car where id=1 or id=2 or id=3
delete from car where id
<foreach collection="ids" item="aaaaa" separator="or">
id=#{aaaaa}
</foreach>
</delete>
// 接口
public interface CarMapper{
// 批量删除, foreach标签, 使用or关键字
int deleteByIds2(@Param("ids") Long[] ids);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Long[] ids = {56L,233L,65L};
int count = mapper.deleteByIds2(ids);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
7. foreach批量插入标签:
collection: 指定数组或者集合
item: 代表数组或集合中的元素
separator: 循环之间的分隔符
// CarMapper.xml
<insert id="insertBatch">
insert into car values
// collection: 指定数组或者集合
// item: 代表数组或集合中的元素
// separator: 循环之间的分隔符
// 如果没有使用@Param注解那么collection应该写array,arg0
<foreach collection="cars" item="aaaaa" separator=",">
(null,#{aaa.carNum},#{aaa.brand},
#{aaa.guidePrice},#{aaa.produceTime},#{aaa.carType})
</foreach>
</insert>
// 接口
public interface CarMapper{
// 批量插入, 一次插入多条信息
int insertBatch(@param("cars") List<Car> cars);
}
// @test
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionUtil.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Car car1 = new Car(...);
Car car2 = new Car(...);
Car car3 = new Car(...);
Car car4 = new Car(...);
List<Car> cars = new ArrayList<>();
cars.add(car1);
cars.add(car2);
cars.add(car3);
cars.add(car4);
mapper.insertBatch(cars);
sqlSession.commit();
sqlSession.close();
}
8. sql标签和include标签:
作用: 代码复用, 易维护