一、条件构造器
条件构造器提供了一种更加简洁和直观的方式来构建复杂的查询条件。它提供了一组静态方法,用于构建各种类型的查询条件,包括等于、不等于、大于、小于、包含等。使用条件构造器可以避免手动拼接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
Wrapper在MyBatis-Plus中是用于构建动态SQL语句的重要工具之一。主要的子类有UpdateWrapper(实现更新操作)、QueryWrapper(实现查询操作)以及可以进行链式编程的AbstractLambdaWrapper,Wrapper的使用非常灵活,可以单独使用,也可以组合使用。
QueryWrapper
@Test
void queryWrapperTest(){
QueryWrapper<User> wrapper = new QueryWrapper<User>().in("age",5);
long count = userService.count(wrapper);
System.out.println(count);
}
UpdateWrapper
@Test
void updateWrapperTest1(){
User user = new User();
user.setEmail("456");
UpdateWrapper<User> wrapper = new UpdateWrapper<User>().eq("name","fulian");
boolean update = userService.update(user, wrapper);
System.out.println(update);
}
三、使用Wrapper实现自定义SQL
需要注意的是:需要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<User> {
// 使用 QueryWrapper 自定义update
void updateEmailByAges(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, @Param("email") String email);
// 使用 LambdaQueryWrapper 自定义update
void updateEmailByAges2(@Param(Constants.WRAPPER) LambdaQueryWrapper<User> wrapper, @Param("email")String email);
// 使用 LambdaQueryWrapper 自定义select
List<User> findUserInAges(@Param(Constants.WRAPPER)LambdaQueryWrapper<User> wrapper);
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fulian.mybatispluslearning.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.fulian.mybatispluslearning.domain.User">
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="age" column="age" jdbcType="INTEGER"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id,name,age,
email
</sql>
<update id="updateEmailByAges">
update user
set email = #{email}
${ew.customSqlSegment}
</update>
<update id="updateEmailByAges2">
update user
set email = concat(email , #{email})
${ew.customSqlSegment}
</update>
<select id="findUserInAges" resultType="com.fulian.mybatispluslearning.domain.User">
select * from user ${ew.customSqlSegment}
</select>
</mapper>
测试类
@SpringBootTest
class UserServiceTest {
@Resource
private UserService userService;
@Resource
private UserMapper userMapper;
@Test
void customSqlUpdateTest(){
List<Integer> ages = Arrays.asList(10,55);
String email = "789";
// 使用 LambdaQueryWrapper 自定义select
LambdaQueryWrapper<User> in = new LambdaQueryWrapper<User>().in(User::getAge, ages);
List<User> userInAges = userMapper.findUserInAges(in);
// 使用 QueryWrapper 自定义update
QueryWrapper<User> wrapper = new QueryWrapper<User>().in("age",ages);
userMapper.updateEmailByAges1(wrapper,email);
// 使用 LambdaQueryWrapper 自定义update
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getAge,ages);
userMapper.updateEmailByAges2(wrapper,email);
}
}
总之,Wrapper是MyBatis-Plus中非常强大和灵活的工具之一,它提供了一种链式调用的方式,可以方便地构建复杂的查询条件和动态SQL语句。通过使用Wrapper,我们可以提高代码的可读性和可维护性,并且使我们的应用程序更加高效和灵活。