动态 SQL 是 MyBatis 的强大特性之一。借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了易用性。
3.1,if使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。
例如:给员工增加一个按姓名查询的方法:
ListgetEmployeeLikeName(String name);
实现:
3.2,SQL片段select id,name,age from tb_employee where name like #{name}
为了重用一些语句,我们可以使用 sql 标签来定义一些共用的代码形成 SQL 片段。定义方式为:
id,name,age
它有一个必须属性是id,用于给这个sql片段一个引用名称,共用代码写在这个标签中间。
定义好后,在使用的地方通过
例:
MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
添加方法:
按照name和age查询们都满足的话返回数据。
ListgetEmployeesByCondition(@Param("name") String name, @Param("age") int age);
实现:
3.4,trim,where,set 3.4.1,whereselect id,name,age from tb_employee where id=5 and name=#{name} and age=#{age} and 1=1
不使用where: 使用where3.4.2,trim
如果 where 元素没有按正常套路使用,我们还可以通过自定义 trim 元素来定制我们想要的功能。
例如:和where等价的自定义trim为:
3.4.3,set...
set 标签用于修改数据时使用。
定义方法:
void update(Employee employee);
实现:
3.5,foreachupdate tb_employee where id=#{id} name=#{name}, age=#{age},
动态 SQL 的另一个常见使用场景是对集合进行遍历。
3.5.1,批量查询动态 SQL 的另外一个常用的必要操作是对一个集合进行遍历,通常使用 in 来操作。例如,我们查询 id 在 1,2,3,4 的员工信息。
定义方法:
ListgetEmployeesByIn(List ids);
实现:
foreach 标签属性说明:
- collection:用于指定参数的类型,可以是 list,也可以是 set,还可以是 map,还可以是 array。
- item:用于遍历时的临时变量
- open:开始符号
- close:关闭符号
- separator:分割符
定义方法:
void batchInsert(Listemps);
实现:
insert into tb_employee(name,age) values (#{emp.name}, #{emp.age})



