mybatisplus的查询,分页查询,自定义多表查询,修改的几种写法

使用mybatisplus的Db类简化写法

  1. 使用静态调用的方式,执行CRUD方法,避免Spring环境下Service循环注入、简洁代码,提升效率
  2. 需要项目中已注入对应实体的BaseMapper
  3. 完整使用方式见官方测试用例:官方测试用例地址
  4. 对于参数为Wrapper的,需要在Wrapper中传入Entity或者EntityClass供寻找对应的Mapper
  5. 不建议在循环中调用,如果是批量保存,建议将数据构造好后使用 Db.saveBatch(数据) 保存

查询,修改简易写法

查询 lambdaQuery

模糊部门的名称为测试部门,并且部门层级不为2级的部门

java 复制代码
List<SysOrg> list = Db.lambdaQuery(SysOrg.class).like(SysOrg::getOrgName, "测试部门")
                    .ne(SysOrg::getOrgLevel, 2).list();
修改 lambdaUpdate

将部门的状态修改为有效,条件是部门的id为orgId

java 复制代码
 Db.lambdaUpdate(SysOrg.class).set(SysOrg::getStatus, SysOrgStatusEnum.VALID.getId())
                        .eq(SysOrg::getId, orgId).update();

如果service实现类继承了mybatisplus的serviceImpl的话,也支持如下写法:

查询:

java 复制代码
List<SysOrg> list = lambdaQuery().eq(SysOrg::getOrgName, "测试部门").ne(SysOrg::getOrgLevel, 2).list();

修改:

java 复制代码
lambdaUpdate().set(SysOrg::getOrgName, "新的测试部门的名字")
                .set(SysOrg::getOrgNameAbbr, "新的测试部门缩写")
                .eq(SysOrg::getOrgId, orgId)
                .update();

原生单表分页查询

java 复制代码
public IPage<SysOrg> getSysOrgPage(SysOrgBo bo, Integer pageNo, Integer pageSize) {
        Page<SysOrg> page = new Page<>(pageNo, pageSize);
        page.addOrder(new OrderItem("create_time", false));
        // 3 查询条件
        Page<SysOrg> page = lambdaQuery()
                .like(ObjectUtils.isNotBlank(bo.getOrgName()), SysOrg::getOrgName, bo.getOrgName())
                .in(ObjectUtils.isNotBlank(bo.getOrgId()),  SysOrg::getOrgId, bo.getOrgIds())
                .eq(ObjectUtils.isNotBlank(bo.getState()), SysOrg::getState, bo.getState())
                .page(page);
return page;	
// 在查询结果为空时,将记录设置为空列表的操作是多余的。因为Page对象在查询结果为空时,其getRecords()方法本身就应该返回一个空列表

// 写法2:
 		IPage<Entity> page = Db.page(new Page<>(1, 1), Entity.class);
        Assertions.assertEquals(2, page.getTotal());
        Assertions.assertEquals(Db.list(new Page<Entity>(1, 1), Entity.class).size(),page.getRecords().size());

        page = Db.page(new Page<>(1, 1), Wrappers.lambdaQuery(Entity.class));
        Assertions.assertEquals(1, page.getRecords().size());

        Assertions.assertEquals(Db.list(new Page<Entity>(1, 1), Wrappers.lambdaQuery(Entity.class)).size(),page.getRecords().size());

自定义分页多表查询

通过map构造查询条件
java 复制代码
 // service实现类
 @Override
    public IPage<SysOrgVo> selectCustomList(SysOrgBo bo) {
        Page<SysOrgVo> page = new Page<>(bo.getPageNo(), bo.getPageSize());
        Map<String, Object> map = getQueryParams(bo);
        Page<SysOrgVo> p = baseMapper.selectCustomList(page, map);
        if (ObjectUtils.isBlank(p.getRecords())) {
            p.setRecords(Collections.emptyList());
        } else {
          for (SysOrgVo vo : p.getRecords()) {
                	// 后置操作,如补充某个字典值,字典key
                vo.setAxx(axx);
                vo.setBxx(bxx));
            }
           
        }
        return p;
    }
 
	// 拼凑查询条件
 	private Map<String, Object> getQueryParams(SysOrgBo bo) {
        // 获取当前登录用户
        LoginUser loginUser = LoginUserUtil.getLoginUser();
        if(loginUser ==null){
        	throw new serviceException("获取登录用户信息失败");
        }
        // 2 查询条件
        Map<String, Object> map = new HashMap<>();
        map.put("userId", loginUser.getId());
        map.put("orgId", orgId);
        map.put("delFlag","1");
        map.put("orgIds",Arrays.asList(1,2,3))
        if (ObjectUtils.isNotBlank(bo.getOrgName()) {
            map.put("orgName", "%" + bo.getOrgName()+ "%");
        }
        if (ObjectUtils.isNotBlank(bo.getOrgCode())) {
            map.put("orgCode", bo.getOrgCode());
        }
        return map;
    }
    
    // mapper.java
        Page<SysOrgBo> selectCustomList(Page<SysOrgBo> page, @Param("params") Map<String, Object> params);
        
    // mapper.xml
         <select id="selectCustomList" resultType="org.jeecg.modules.sys.vo.SysOrgVo" parameterType="java.util.HashMap">
	        select
	        	sysorg
	        from
	       sys_org a
	        left join 字典表1 b on b.org_id = a.id
	        where
	        a.del_flag = 0
	        and b.del_flag = 0
	        <if test="params.orgCode!= null  and params.orgCode!= ''"> and a.org_code= #{params.orgCode}</if>
	        <if test="params.orgName!= null  and params.orgName!= ''"> and a.org_name like #{params.orgName}</if>
	        <if test="ids!=null and ids.size>0">
            and t.ID in
            <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
	        order by a.create_time desc
    </select>
通过mybatisplus的queryWrapper构造查询条件
java 复制代码
// service实现类
QueryWrapper<SysOrg> qw= new QueryWrapper<>();
qw.eq("t.del_flag", CommonConstant.DEL_FLAG_0);
qw.orderByAsc("t.depart_order");
qw.in("t.org_code", ids.split(SymbolConstant.COMMA));
qw.and(q->q.isNull(true,"t.parent_id").or().eq(true,"t.parent_id",""));

List<SysOrgVo> list = departMapper.selectCustomList(qw);

// mapper.java
	List<SysOrgVo> selectCustomList(@org.apache.ibatis.annotations.Param(Constants.WRAPPER) Wrapper<SysOrg> queryWrapper);

// mapper.xml
  select t.*, soeb.XXX
        from sys_org t
                 LEFT JOIN sys_org_ext_business soeb on t.id = soeb.org_id
            ${ew.customSqlSegment}
直接返回查询结果的某个字段
java 复制代码
  String name = Db.getObj(Wrappers.lambdaQuery(Entity.class).eq(Entity::getId, 1L), Entity::getName);
  Assertions.assertEquals("ruben", name);
相关推荐
@ 李青龙6 天前
MybatisPlus--mybatis升级版
mybatis·mybatisplus
Charlie__ZS7 天前
MybatisPlus-配置加密
mybatis·mybatisplus·aes加密
it界的哈士奇10 天前
麒麟系统+达梦数据库+MybatisPlus+Redis+SpringBoot
数据库·spring boot·redis·达梦·mybatisplus
mikey棒棒棒14 天前
Mybatis-Plus
java·mybatisplus
Yaml417 天前
MyBatis高效SQL写法指南
java·sql·mybatis·mybatisplus
刚贴瞎18 天前
MyBatisPlus 暂时分页失效原因以及解决方法
java·数据库·mybatis·mybatisplus
墨鸦_Cormorant21 天前
MyBatis-Plus介绍及基本使用
mybatis·mybatisplus·mybatis-plus
无奈何杨22 天前
MybatisPlus字段类型处理器TypeHandler
mybatisplus·版本控制·字段类型处理器
码农派大星。1 个月前
MyBatis-Plus快速上手
java·spring·mybatis·mybatisplus
郭天宇 abfore2 个月前
MybatisPlus
java·mybatis·mybatisplus·1024程序员节