什么是动态sql:在不同条件下拼接不同的sql
Mybatis框架的动态sql技术是一种根据特定条件动态拼接SQl语句的功能,他存在的意义是为了解决拼接SQL语句字符串时的痛点问题。比如我们在用淘宝之类的软件在进行商品属性选择的时候,我们会发现我们可以选择的商品的属性有很多条件,其中一些条件可以选择也可以不选择,那么如果使用传统的方式进行查询,反而在拼接sql的时候会造成一些列的问题。
根据 username 和 sex 来查询数据。如果username为空,那么将只根据sex来查询;反之只根据username来查询
首先先不使用动态sql
上面的查询语句,我们可以发现,如果 #{username} 为空,那么查询结果也是空,如何解决这个问题呢?使用 if 来判断
使用动态sql
从上边的案例当中我们可以看出如果 sex 等于 null,那么查询语句为 select * from user where username=#{username},如果username等于null,那么查询语句为select * from user where and sex=#{sex} 那这显然是不对的。
但是我们加上了 标签,如果username为空怎么办?sex当中的and会不会受影响?
从上图的案例当中我们可以看到如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
dao层
/**
* 修改
* @param user
* @return
*/
public int update(User user);
mapping
update user
username = #{username} ,
address = #{address}
where id = #{id}
测试
@Test
public void update(){
}
这个标签相当于是我们java当中的if.....else if.....else
trim标记是一个格式化的标记,可以完成set或者是where标记的功能
①、用 trim 改写上面第二点的 if+where 语句
prefix:前缀
prefixoverride:去掉第一个and或者是or
②、用 trim 改写上面第三点的 if+set 语句
update user
username = #{username},
sex = #{sex},
where id = #{id}
有些时候我们的数据是以数组的形式出现的,比如我们进行批量删除和批量添加的时候
①:批量删除
delete from user where id in
#{id}
/**
* 通过数组批量删除
* @param ids
* @return
*/
int deleteMoreByArray(@Param("ids") Integer[] ids);
@Test
public void deleteMoreByArray(){
int result = mapper.deleteMoreByArray(new Integer[]{1,2,3});
session.commit();
System.out.println(result);
}
第二种写法
②:批量添加
insert into user values
(null,#{user.username},#{user.birthday},#{user.sex},#{user.address})
/**
* 通过集合批量添加
* @param users
* @return
*/
int insertMoreByList(@Param("users") List users);
@Test
public void insertMoreByList(){
User user1 = new User("a1","男","北京");
User user2 = new User("a2","男","北京");
User user3 = new User("a3","男","北京");
List users = Arrays.asList(user1,user2,user3);
int result = mapper.insertMoreByList(users);
session.commit();
System.out.println(result);
}