菜鸟开发之条件构造器:Wrapper(二)

集天地之...咳咳咳,集百家之长,借先贤之悟,望不堪之忆,补己身之缺,展后之装之业。

然己能力缺土,记性似鱼,学不能以致用,借此良机录制后用,愿皆遇道合友人,更进一步。

目录

一、分金定穴

1、寻龙分金看缠山

2、一重缠是一重关

3、关门如有八重险,不出阴阳八卦形

二、寻龙千万里

1、左手罗盘、右手铲

2、泼天富贵在眼前

三、口诀牢记不心慌

一、分金定穴

1、寻龙分金看缠山

模糊查询 .like() LIKE ‘%值%’   .likeLeft() LIKE ‘%值’   .likeRight() LIKE ‘值%’

范围查询 .gt() >值  .ge() >= 值  .lt() <值  .le() <= 值  .between() BETWEEN 值1 AND 值2

精确查询 .eq() = 值  .ne() != 值

        排序 .orderByAsc() ORDER BY 字段,… ASC   .orderByDesc() ORDER BY 字段, … DESC

// 条件
LambdaQueryWrapper<RepositoryInfo> queryWrapper = new LambdaQueryWrapper<RepositoryInfo>()
    .like(page.getRepositoryName() != null, RepositoryInfo::getRepositoryName, page.getRepositoryName())
    .eq(!StringUtils.isEmpty(page.getRepositoryCode()), RepositoryInfo::getRepositoryCode, page.getRepositoryCode())
	.ge(page.getRepositoryStartDateFrom() != null, RepositoryInfo::getRepositoryStartDate, page.getRepositoryStartDateFrom())
	.le(page.getRepositoryStartDateTo() != null, RepositoryInfo::getRepositoryStartDate, page.getRepositoryStartDateTo())
	.eq(page.getRepositoryState() != null && page.getRepositoryState() != -1, RepositoryInfo::getRepositoryState, page.getRepositoryState())
	.orderByAsc(RepositoryInfo::getRepositoryPhone);


// 查询
List<RepositoryInfo> list = repositoryInfoService.list(queryWrapper);


// SQL
SELECT
	repository_id,
	repository_name,
	repository_code,
	repository_phone,
	repository_state,
	repository_address,
	repository_start_date 
FROM
	repository_info 
WHERE
	( repository_name LIKE ? AND repository_code = ? AND repository_start_date >= ? AND repository_start_date <= ? AND repository_state = ? ) 
ORDER BY
	repository_phone ASC

空值查询 .isNull() 字段 IS NULL  .isNotNull() 字段 IS NOT NULL

筛选查询 .in() 字段 IN (values.get(0), values.get(1), …)  .notIn() 字段 NOT IN (values.get(0), values.get(1), …)
​               .inSql() 字段 NOT IN ( sql语句 )

追加SQL .last( sql 语句 ) 将 sql 语句 拼接到 sql 的最后

        // 条件
        LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>()
	        .isNotNull( BrandInfo::getBrandCnName)
	        .in(page.getNums() != null && page.getNums().size() > 0, BrandInfo::getBrandNum, page.getNums())
	        .last( " limit  10 " );


        // 查询
        List<BrandInfo> list = brandInfoService.list(queryWrapper);


        // SQL 
        SELECT
	        brand_id,
	        brand_cn_name,
	        brand_en_name,
	        brand_logo_path,
	        brand_web_url,
	        brand_num,
	        brand_info,
	        brand_founded_date 
        FROM
	        brand_info 
        WHERE
	        ( brand_cn_name IS NOT NULL AND brand_num IN ( ?,?,? ) ) 
	    LIMIT 10

2、一重缠是一重关

.and() : 相连的条件必须同时满足, 默认都是 and 相连

.or() : 主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)

两个配合通常可以 建立比较 复杂的查询

.nested() : 正常嵌套 不带 AND 或者 OR

        // 条件
        LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>()
            .eq( num != null, BrandInfo::getBrandNum, num )
            .like( !StringUtils.isEmpty(name), BrandInfo::getBrandCnName, name)
            .or()
            .like( !StringUtils.isEmpty(name), BrandInfo::getBrandEnName, name);


        // 查询
        List<BrandInfo> list = brandInfoService.list(queryWrapper);


        // SQL 
        SELECT
            brand_id,
            brand_cn_name,
            brand_en_name,
            brand_logo_path,
            brand_web_url,
            brand_num,
            brand_info,
            brand_founded_date 
        FROM
            brand_info 
        WHERE
            ( brand_num = 2 AND brand_cn_name LIKE %hua% OR brand_en_name LIKE %hua% )

        // 条件
        LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>()
            .eq(num != null, BrandInfo::getBrandNum, num )
            .or(i->i.like( !StringUtils.isEmpty(name), BrandInfo::getBrandCnName, name)
                .or()
                .like( !StringUtils.isEmpty(name), BrandInfo::getBrandEnName, name)
               );


        // 查询
        List<BrandInfo> list = brandInfoService.list(queryWrapper);


        // SQL
        SELECT
	        brand_id,
	        brand_cn_name,
	        brand_en_name,
	        brand_logo_path,
	        brand_web_url,
	        brand_num,
	        brand_info,
	        brand_founded_date 
        FROM
	        brand_info 
        WHERE
	        ( brand_num = 2 OR ( brand_cn_name LIKE %hua% OR brand_en_name LIKE %hua% ) )

        // 条件
        LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>()
            .eq(num != null, BrandInfo::getBrandNum, num )
            .and(i->i.like( !StringUtils.isEmpty(name), BrandInfo::getBrandCnName, name)
                 .or()
                 .like( !StringUtils.isEmpty(name), BrandInfo::getBrandEnName, name)
                );


        // 进行查询
        List<BrandInfo> list = brandInfoService.list(queryWrapper);


        // SQL 
        SELECT
	        brand_id,
	        brand_cn_name,
	        brand_en_name,
	        brand_logo_path,
	        brand_web_url,
	        brand_num,
	        brand_info,
	        brand_founded_date 
        FROM
	        brand_info 
        WHERE
	        ( brand_num = 2 AND ( brand_cn_name LIKE %hua% OR brand_en_name LIKE %hua% ) )

        // 条件
        String name = "hua";
        Integer num = 2;
        LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>()
            .nested(i->i.eq( BrandInfo::getBrandNum, num).like(BrandInfo::getBrandCnName, name))
            .or()
            .nested(i->i.like(BrandInfo::getBrandEnName, name));


        // 查询
        List<BrandInfo> list = brandInfoService.list(queryWrapper);


        // SQL 
        SELECT
	        brand_id,
	        brand_cn_name,
	        brand_en_name,
	        brand_logo_path,
	        brand_web_url,
	        brand_num,
	        brand_info,
	        brand_founded_date 
        FROM
	        brand_info 
        WHERE
	        ( ( brand_num = ? AND brand_cn_name LIKE ? ) OR ( brand_en_name LIKE ? ) )

3、关门如有八重险,不出阴阳八卦形

.func(i->{ if(条件) { i.条件(); } else{ i.条件(); } }) : 根据 条件 动态调整SQL 结构

.select() : 相当于定义 select 查询的字段

.lambda() : 将 QueryWrapper() 转换成 LambdaQueryWrapper() , 就可以使用 Lambda 语法

.groupBy() : 分组

.having( sql ) : 对 分组结果 进行筛选, 可以使用 SQL 调用 聚合函数


        // 条件
        LambdaQueryWrapper<BrandInfo> queryWrapper = new QueryWrapper<BrandInfo>()
            .select("brand_num", " count(0) count")
            .lambda()
            .groupBy(BrandInfo::getBrandNum)
            .having( " count(0) > 2");


        // 查询
        List<BrandInfo> list = brandInfoService.list(queryWrapper);

        System.out.println("list = " + list);

        SELECT brand_num, count( 0 ) count FROM brand_info GROUP BY brand_num HAVING count( 0 ) > 2

.func(i->{ if(条件) { i.条件(); } else{ i.条件(); } }) : 根据 条件 动态调整SQL 结构
String name = "hua";
Integer num = 2;


        // 条件
        LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>()
            .func(i->{if( num > 2 ){
                i.like(BrandInfo::getBrandCnName, name);
            }else{
                i.like(BrandInfo::getBrandEnName, name);
            }});


        // 查询
        List<BrandInfo> list = brandInfoService.list(queryWrapper);


        // SQL
        SELECT
            brand_id,
            brand_cn_name,
            brand_en_name,
            brand_logo_path,
            brand_web_url,
            brand_num,
            brand_info,
            brand_founded_date 
        FROM
            brand_info 
        WHERE
            ( brand_en_name LIKE ? )

.apply( sql , params ) : sql 包含 函数 , 可以使用 {index} 进行占位 , params 为 传入的值
String date = "2020-09-08";


        // 条件
        LambdaQueryWrapper<BrandInfo> queryWrapper = new LambdaQueryWrapper<BrandInfo>()
            .apply( "date_format(brand_founded_date,'"2020-09-08"') = {0} " , date );


        // 查询
        List<BrandInfo> list = brandInfoService.list(queryWrapper);


        // SQL
        SELECT
            brand_id,
            brand_cn_name,
            brand_en_name,
            brand_logo_path,
            brand_web_url,
            brand_num,
            brand_info,
            brand_founded_date 
        FROM
            brand_info 
        WHERE
            ( date_format( brand_founded_date, '%Y-%m-%d' ) = '2020-09-08' )

二、寻龙千万里

以下条件构造器的方法入参中的column均表示数据库字段

1、左手罗盘、右手铲

    /**
     * 名字包含静并且年龄小于40
     * <p>
     * WHERE name LIKE '%静%' AND age < 40
     */
    @Test
    public void selectByWrapperOne() {
        QueryWrapper<User> wrapper = new QueryWrapper();
        wrapper.like("name", "静").lt("height", 160);
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 名字包含静
     * 身高大于150小于160
     * qq不能为空
     * <p>
     * WHERE name LIKE '%静%' AND height BETWEEN 150 AND 160 AND qq IS NOT NULL
     */
    @Test
    public void selectByWrapperTwo() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.like("name", "静").between("height", 150, 160).isNotNull("qq");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 名字为苏性
     * 或者身高大于等于160
     * 按照身高降序排序,身高相同按照id升序排序
     * <p>
     * WHERE name LIKE '苏%' OR height >= 160 ORDER BY height DESC , id ASC
     */
    @Test
    public void selectByWrapperThree() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.likeRight("name", "苏").or()
                .ge("height", 160).orderByDesc("height").orderByAsc("id");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询创建时间为2019年2月14
     * 并且上级领导姓苏
     * <p>
     * WHERE date_format(create_time,'%Y-%m-%d') = '2019-02-14' AND manager_id IN (select id from user where name like '苏%')
     */
    @Test
    public void selectByWrapperFour() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14")
                .inSql("manager_id", "select id from user where name like '苏%'");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询苏姓
     * 并且身高小于160或者qq不为空
     * <p>
     * WHERE name LIKE '苏%' AND ( height < 160 OR qq IS NOT NULL )
     */
    @Test
    public void selectByWrapperFive() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.likeRight("name", "苏").and(qw -> qw.lt("height", 160).or().isNotNull("qq"));
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询苏姓
     * 并且身高大于150、身高小于160、邮箱不能为空
     * <p>
     * WHERE name LIKE ? OR ( height BETWEEN ? AND ? AND qqIS NOT NULL )
     */
    @Test
    public void selectByWrapperSix() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.likeRight("name", "苏").or(
                qw -> qw.between("height", 150, 160).isNotNull("qq")
        );
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * (身高小于150或者qq不为空) 并且名字姓苏
     * WHERE ( height < 40 OR qq IS NOT NULL ) AND name LIKE '苏%'
     */
    @Test
    public void selectByWrapperSeven() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.nested(qw -> qw.lt("height", 150).or().isNotNull("qq"))
                .likeRight("name", "苏");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询height为150、160、170
     * WHERE height IN (?,?,?)
     */
    @Test
    public void selectByWrapperEight() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.in("height", Arrays.asList(150, 160, 170));
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询一条数据
     * limit 1
     */
    @Test
    public void selectByWrapperNine() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.in("height", Arrays.asList(150, 160, 170)).last("limit 1");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }

2、泼天富贵在眼前

1)、ge、gt、le、lt、isNull、isNotNull

 
    @Test
    public void testDelete() {
 
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper
            .isNull("name")
            .ge("height", 160)
            .isNotNull("qq");
        int result = userMapper.delete(queryWrapper);
        System.out.println("delete return count = " + result);

    }

UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND height >= ? AND qq IS NOT NULL

2)、eq、ne

	/**
     * eletOne返回的是一条实体记录,当出现多条时会报错
	 */
	@Test
	public void testSelectOne() {
		QueryWrapper<User> queryWrapper = new QueryWrapper<>();
		queryWrapper.eq("name", "小苏");
		
		User user = userMapper.selectOne(queryWrapper);
		System.out.println(user);

	}

3)、between、notBetween

	/**
     * 包含大小边界
	 */
	@Test
    public void testSelectCount() {
 
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.between("height", 150, 160);
 
        Integer count = userMapper.selectCount(queryWrapper);
        System.out.println(count);
    }

SELECT COUNT(1) FROM user WHERE deleted=0 AND height BETWEEN ? AND ?  

4)、allEq 

    @Test
    public void testSelectList() {
 
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        Map<String, Object> map = new HashMap<>();
        map.put("id", 2);
        map.put("name", "苏");
        map.put("height", 180);
 
        queryWrapper.allEq(map);
        List<User> users = userMapper.selectList(queryWrapper);
 
        users.forEach(System.out::println);
    }

SELECT id,name,height,qq,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = ? AND id = ? AND height = ? 

5)、like、notLike、likeLeft、likeRight 

@Test
public void testSelectMaps() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .notLike("name", "苏")
        .likeRight("qq", "0");
 
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表
    maps.forEach(System.out::println);

}

6)、in、notIn、inSql、notinSql、exists、notExists

@Test
public void testSelectObjs() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //queryWrapper.in("id", 1, 2, 3);
    queryWrapper.inSql("id", "select id from user where id < 3");
 
    List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
    objects.forEach(System.out::println);
}

7)、指定要查询的列

@Test
public void testSelectListColumn() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("id", "name", "height");
 
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

......

三、口诀牢记不心慌

天赋为前,手脑知后,键盘犹剑,鼠标似刀,

目光如炬,心如细发,勤学苦练,先贤共进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值