条件构造器提供了一种更加简洁和直观的方式来构建复杂的查询条件。它提供了一组静态方法,用于构建各种类型的查询条件,包括等于、不等于、大于、小于、包含等。使用条件构造器可以避免手动拼接SQL语句的麻烦,提高代码的可读性和可维护性。
以下是官方文档提供的常用的条件构造器实例:
每种方法都重载了第一个参数为boolean类型的参数,表示该条件是否加入最后生成的sql中,默认为true。
alleq():全部eq |
allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null |
eq():等于 = |
eq("name", "老王")--->name = '老王' |
ne():不等于 <> |
ne("name", "老王")--->name <> '老王' |
gt():大于 > |
gt("age", 18)--->age > 18 |
ge():大于等于 >= |
ge("age", 18)--->age >= 18 |
lt():小于 < |
lt("age", 18)--->age < 18 |
le():小于等于 <= |
le("age", 18)--->age <= 18 |
or():拼接OR |
eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王' |
add():拼接AND |
and(i -> i.eq("name", "李白").ne("status", "活着"))--->and (name = '李白' and status <> '活着') |
between():BETWEEN 值1 AND 值2 |
between("age", 18, 30)--->age between 18 and 30 |
notBetween():NOT BETWEEN 值1 AND 值2 |
notBetween("age", 18, 30)--->age not between 18 and 30 |
like():LIKE '%值% |
like("name", "王")--->name like '%王%' |
notLike():NOT LIKE '%值%' |
notLike("name", "王")--->name not like '%王%' |
likeLeft():LIKE '%值' |
likeLeft("name", "王")--->name like '%王' |
likeRight():LIKE '值%' |
likeRight("name", "王")--->name like '王%' |
isNull():字段 IS NULL |
isNull("name")--->name is null |
isNotNull():字段 IS NOT NULL |
isNotNull("name")--->name is not null |
in():字段 IN (v0, v1, ...) |
in("age", 1, 2, 3)--->age in (1,2,3) |
notIn():字段NOT IN (v0, v1, ...) |
notIn("age", 1, 2, 3)--->age not in (1,2,3) |
groupBy():分组:GROUP BY 字段 |
groupBy("id", "name")--->group by id,name |
orderByAsc():排序:ORDER BY 字段, ... ASC |
orderByAsc("id", "name")--->order by id ASC,name ASC |
orderByDesc():排序:ORDER BY 字段, ... DESC |
orderByDesc("id", "name")--->order by id DESC,name DESC |
having():HAVING ( sql语句 |
having("sum(age) > 10")--->having sum(age) > 10 |
Wrapper在MyBatis-Plus中是用于构建动态SQL语句的重要工具之一。主要的子类有UpdateWrapper(实现更新操作)、QueryWrapper(实现查询操作)以及可以进行链式编程的AbstractLambdaWrapper,Wrapper的使用非常灵活,可以单独使用,也可以组合使用。
QueryWrapper
@Test
void queryWrapperTest(){
QueryWrapper wrapper = new QueryWrapper().in("age",5);
long count = userService.count(wrapper);
System.out.println(count);
}
UpdateWrapper
@Test
void updateWrapperTest1(){
User user = new User();
user.setEmail("456");
UpdateWrapper wrapper = new UpdateWrapper().eq("name","fulian");
boolean update = userService.update(user, wrapper);
System.out.println(update);
}
需要注意的是:需要mybatis-plus
版本 >= 3.0.7
param 参数名要么叫ew
,要么加上注解@Param(Constants.WRAPPER)
使用${ew.customSqlSegment}
不支持 Wrapper
内的entity生成where语句。
MySQL数据库中表内容如下:
User实体类
@TableName(value ="user")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {
private Long id;
private String name;
private Integer age;
private String email;
private static final long serialVersionUID = 1L;
}
UserMapper接口
public interface UserMapper extends BaseMapper {
// 使用 QueryWrapper 自定义update
void updateEmailByAges(@Param(Constants.WRAPPER) QueryWrapper wrapper, @Param("email") String email);
// 使用 LambdaQueryWrapper 自定义update
void updateEmailByAges2(@Param(Constants.WRAPPER) LambdaQueryWrapper wrapper, @Param("email")String email);
// 使用 LambdaQueryWrapper 自定义select
List findUserInAges(@Param(Constants.WRAPPER)LambdaQueryWrapper wrapper);
}
UserMapper.xml
id,name,age,
email
update user
set email = #{email}
${ew.customSqlSegment}
update user
set email = concat(email , #{email})
${ew.customSqlSegment}
测试类
@SpringBootTest
class UserServiceTest {
@Resource
private UserService userService;
@Resource
private UserMapper userMapper;
@Test
void customSqlUpdateTest(){
List ages = Arrays.asList(10,55);
String email = "789";
// 使用 LambdaQueryWrapper 自定义select
LambdaQueryWrapper in = new LambdaQueryWrapper().in(User::getAge, ages);
List userInAges = userMapper.findUserInAges(in);
// 使用 QueryWrapper 自定义update
QueryWrapper wrapper = new QueryWrapper().in("age",ages);
userMapper.updateEmailByAges1(wrapper,email);
// 使用 LambdaQueryWrapper 自定义update
LambdaQueryWrapper wrapper = new LambdaQueryWrapper().in(User::getAge,ages);
userMapper.updateEmailByAges2(wrapper,email);
}
}
总之,Wrapper是MyBatis-Plus中非常强大和灵活的工具之一,它提供了一种链式调用的方式,可以方便地构建复杂的查询条件和动态SQL语句。通过使用Wrapper,我们可以提高代码的可读性和可维护性,并且使我们的应用程序更加高效和灵活。