mybatis-plus 和 lambda()

    @Override
    public List<String> selectSubject() {
        LambdaQueryWrapper<Faq> lambdaQueryWrapper = new QueryWrapper<Faq>()
                .lambda()
                .select(Faq::getSubject)
                .orderByDesc(Faq::getCreateDate)
                .eq(Faq::getState, StateEnum.NORMAL.getCode());
        List<Faq> faqList = faqMapper.selectList(lambdaQueryWrapper);
        List<String> subjectList = new ArrayList<>();
        for (Faq item : faqList) {
            if (!subjectList.contains(item.getSubject())) {
                subjectList.add(item.getSubject());
            }
        }
        return subjectList;
    }

 

SystemConfigService
package com.bfr.telinksemifourm.manage.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bfr.telinksemifourm.manage.mapper.SystemConfigMapper;
import com.bfr.telinksemifourm.manage.service.ISystemConfigService;
import com.bfr.telinksemifourm.shared.model.Faq;
import com.bfr.telinksemifourm.shared.model.SystemConfig;
import com.bfr.telinksemifourm.shared.model.enums.StateEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Created by .
 * Copyright (c) 2020, All Rights Reserved.
 * 
 */
@Service
@Transactional
public class SystemConfigService implements ISystemConfigService {

    @Autowired
    private SystemConfigMapper systemConfigMapper;

    private static Map SYSTEM_CONFIG;

    @Override
    public Map selectAllConfig() {
        List<SystemConfig> systemConfigs = systemConfigMapper.selectList(null);
        SYSTEM_CONFIG = systemConfigs.stream().filter(systemConfig -> systemConfig.getPid() != 0).collect(Collectors
                .toMap(SystemConfig::getKey, SystemConfig::getValue));
        return SYSTEM_CONFIG;
    }

    // 根据键取值
    @Override
    public SystemConfig selectByKey(String key) {
        QueryWrapper<SystemConfig> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(SystemConfig::getKey, key);
        return systemConfigMapper.selectOne(wrapper);
    }

    @Override
    public Map<String, Object> selectAll() {
        Map<String, Object> map = new LinkedHashMap<>();
        LambdaQueryWrapper<SystemConfig> lambdaQueryWrapper = new QueryWrapper<SystemConfig>()
                .lambda()
                .eq(SystemConfig::getState, StateEnum.NORMAL.getCode());
        List<SystemConfig> systemConfigs = systemConfigMapper.selectList(lambdaQueryWrapper);
        // 先提取出所有父节点
        List<SystemConfig> p = systemConfigs.stream().filter(systemConfig -> systemConfig.getPid() == 0).collect
                (Collectors.toList());
        // 遍历父节点取父节点下的所有子节点
        p.forEach(systemConfig -> {
            List<SystemConfig> collect = systemConfigs.stream().filter(systemConfig1 -> systemConfig1.getPid().equals
                    (systemConfig.getId())).collect(Collectors.toList());
            map.put(systemConfig.getDescription(), collect);
        });
        return map;
    }

    // 在更新系统设置后,清一下selectAllConfig()的缓存
    @Override
    public void update(List<Map<String, String>> list) {
        for (Map map : list) {
            String key = (String) map.get("name");
            String value = (String) map.get("value");
            // 如果密码没有变动,则不做修改
            if ((key.equals("mail_password") && value.equals("*******")) || (key.equals("redis_password") && value.equals
                    ("*******")) || (key.equals("oauth_github_client_secret") && value.equals("*******"))) {
                continue;
            }
            SystemConfig systemConfig = new SystemConfig();
            systemConfig.setKey(key);
            systemConfig.setValue(value);
            QueryWrapper<SystemConfig> wrapper = new QueryWrapper<>();
            wrapper.lambda().eq(SystemConfig::getKey, systemConfig.getKey());
            systemConfigMapper.update(systemConfig, wrapper);
        }
        // 更新SYSTEM_CONFIG
        SYSTEM_CONFIG = null;
    }

    // 根据key更新数据
    @Override
    public void updateByKey(String key, SystemConfig systemConfig) {
        QueryWrapper<SystemConfig> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(SystemConfig::getKey, key);
        systemConfigMapper.update(systemConfig, wrapper);
        // 更新SYSTEM_CONFIG
        SYSTEM_CONFIG = null;
    }

}

 

<think>好的,我现在需要帮助用户了解MyBatis-Plus中的Lambda用法,包括教程常见问题。首先,我应该回顾用户提供的引用内容,确保回答准确。 用户提到了引用1到4,其中引用13具体提到了LambdaQueryWrapperlambdaUpdate的用法示例,而引用4比较了不同框架的特性。用户的需求是教程常见问题,所以需要分步骤讲解,并结合代码示例。 首先,我应该介绍Lambda表达式的优势,比如类型安全减少字段名的硬编码。然后,详细说明LambdaQueryWrapper的创建方式,如使用Wrappers.lambdaQuery(),并给出查询、更新、删除的示例。 接下来,常见问题部分需要考虑用户可能遇到的坑,比如字段名错误、链式调用顺序、分页查询的注意事项以及性能问题。每个问题需要简要说明原因解决方法,可能结合引用中的内容。 需要确保代码示例正确,符合MyBatis-Plus的最新版本,同时引用用户提供的例子,比如引用3中的代码片段。注意用户提到的静态方法构建LambdaQueryWrapper是推荐做法,需要强调这一点。 另外,用户可能对Lambda表达式普通Wrapper的区别不太清楚,需要对比说明,突出Lambda的优势。还要注意分页查询时是否需要自定义SQL,避免用户在此处出错。 最后,生成的相关问题需要围绕Lambda表达式的其他应用、与普通方式的对比、分页处理以及动态条件构造,这些都是用户可能进一步想了解的内容。 检查是否有遗漏的引用内容,确保每个引用都被合理使用,比如引用4提到的灵活配置多种查询方式,可以在教程部分适当提及。同时,保持回答结构清晰,分点明确,语言简洁。</think>### MyBatis-Plus Lambda 表达式使用教程 MyBatis-PlusLambda 表达式通过类型安全的字段引用(如`User::getName`)替代字符串硬编码,能有效避免 SQL 字段拼写错误,提升代码可维护性[^2][^4]。以下是核心用法: --- #### 一、LambdaQueryWrapper 基础操作 1. **创建 LambdaQueryWrapper** ```java // 推荐使用静态方法创建(引用[1]) LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class); ``` 2. **条件构造示例** ```java // 等于查询(引用[3]) wrapper.eq(User::getName, "张三") .ge(User::getAge, 18); // 年龄 >=18 // IN 查询 wrapper.in(User::getRoleId, Arrays.asList(1, 2, 3)); // 复杂条件(AND/OR) wrapper.and(w -> w.like(User::getEmail, "@qq.com").or().isNull(User::getPhone)); ``` 3. **查询执行** ```java List<User> userList = userMapper.selectList(wrapper); ``` --- #### 二、LambdaUpdateWrapper 更新操作 1. **链式更新语法** ```java // 引用[3]中的示例 userService.lambdaUpdate() .set(User::getStatus, "1") .eq(User::getId, userId) .update(); ``` 2. **批量更新** ```java userService.update( new LambdaUpdateWrapper<User>() .set(User::getScore, 100) .in(User::getId, userIds) ); ``` --- #### 三、Lambda 表达式与 Service 层结合 ```java // 查询单个对象(引用[3]) User user = userService.getOne( new LambdaQueryWrapper<User>() .eq(User::getType, "VIP") .last("LIMIT 1") ); ``` --- ### 常见问题及解决 1. **字段名映射错误** **现象**:`Unknown column 'xxx' in 'field list'` **原因**:实体类字段名与数据库列名未正确映射。 **解决**:使用`@TableField`注解显式指定列名。 2. **链式调用顺序问题** **现象**:条件未生效。 **原因**:链式调用顺序错误,如`.or()`后未紧跟条件表达式。 **正确写法**: ```java wrapper.eq(...).or().gt(...) // 正确 ``` 3. **分页查询失效** **原因**:未配置分页插件或未调用`Page`对象。 **解决**: ```java Page<User> page = new Page<>(1, 10); userMapper.selectPage(page, wrapper); ``` 4. **Lambda 性能问题** **场景**:超大数据量时,Lambda 反射可能影响性能。 **优化**:改用普通`QueryWrapper`或开启 MyBatis-Plus 的字段缓存[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值