使用Mybatis-Plus时service层中baseMapper.selectOne报错

使用Mybatis-Plus时service层中baseMapper.selectPage报错

最后找到因,引入的包是错的,引成了apache的page包

你提供的代码: ```java return baseMapper.selectOne(Wrappers.<CargoName>lambdaQuery().eq(CargoName::getCode, cargoCode)); ``` 这是使用 **MyBatis-Plus** 框架进行数据库查询的典型写法。下面我将: 1. ✅ 逐行解释这段代码 2. ✅ 分析其作用和返回值 3. ✅ 提示潜在问题与最佳实践 4. ✅ 给出改进建议(如判空、异常处理) --- ### ✅ 一、代码详解 ```java return baseMapper.selectOne( Wrappers.<CargoName>lambdaQuery() .eq(CargoName::getCode, cargoCode) ); ``` #### 🔍 各部分含义: | 代码片段 | 说明 | |--------|------| | `baseMapper` | 通常是继承了 `BaseMapper<CargoName>` 的 Mapper 接口实例,由 Spring 注入 | | `Wrappers.<CargoName>lambdaQuery()` | 创建一个类型安全的 Lambda 查询条件构造器,泛型为 `CargoName` 实体类 | | `.eq(CargoName::getCode, cargoCode)` | 添加等值条件:`WHERE code = ?`,其中 `getCode` 是实体类中的 getter 方法引用 | | `selectOne(...)` | 执行 SQL 查询,返回最多一条记录(0 或 1 条),结果封装为 `CargoName` 对象 | --- ### ✅ 二、实际生成的 SQL 示例 假设: - 表名:`cargo_name` - `CargoName::getCode` 对应字段 `code` 则该语句等价于: ```sql SELECT * FROM cargo_name WHERE code = #{cargoCode} LIMIT 1; ``` > ⚠️ 注意:MyBatis Plus 默认只查非逻辑删除的数据(如果配置了 `@TableLogic`) --- ### ✅ 三、返回值说明 ```java CargoName result = baseMapper.selectOne(...); ``` | 情况 | 返回值 | |------|--------| | 找到唯一一条记录 | 返回 `CargoName` 实例 | | 没有匹配数据 | 返回 `null` | | 多条匹配(不推荐) | 返回第一条(按主键或默认排序),但应避免这种情况 | > ❗ 因此调用方必须做 **null 判断**! --- ### ✅ 四、常见问题 & 改进建议 #### ❌ 问题 1:未对 `cargoCode` 判空,可能导致 SQL 注入风险或异常 ```java // 错误示例:如果 cargoCode 为 null,可能查不到数据或报错 Wrappers.<CargoName>lambdaQuery().eq(CargoName::getCode, null) // -> WHERE code = NULL ``` ✅ 建议先校验参数: ```java if (StringUtils.isBlank(cargoCode)) { return null; // 或抛出 IllegalArgumentException } ``` --- #### ✅ 改进版完整方法示例: ```java @Service public class CargoNameService { @Autowired private CargoNameMapper baseMapper; public CargoName getByCargoCode(String cargoCode) { // 参数校验 if (StringUtils.isBlank(cargoCode)) { return null; } // 查询 return baseMapper.selectOne( Wrappers.<CargoName>lambdaQuery() .eq(CargoName::getCode, cargoCode.trim()) ); } } ``` --- #### ✅ 更安全的方式(使用 Optional 避免空指针) ```java public Optional<CargoName> findOptionalByCargoCode(String cargoCode) { if (StringUtils.isBlank(cargoCode)) { return Optional.empty(); } CargoName result = baseMapper.selectOne( Wrappers.<CargoName>lambdaQuery() .eq(CargoName::getCode, cargoCode.trim()) ); return Optional.ofNullable(result); } ``` 调用: ```java Optional<CargoName> opt = service.findOptionalByCargoCode("C001"); opt.ifPresent(cargo -> System.out.println(cargo.getName())); ``` --- ### ✅ 五、性能提示 - 确保数据库表 `cargo_name` 的 `code` 字段上有 **索引**(最好是唯一索引) - 如果 `code` 是业务唯一键,建议加 `@TableField(value = "code")` 并建唯一约束 --- ### ✅ 六、扩展:其他常用 MyBatis-Plus 查询方式 ```java // 查询所有 code 在列表中的记录 List<CargoName> list = baseMapper.selectList( Wrappers.<CargoName>lambdaQuery() .in(CargoName::getCode, Arrays.asList("C001", "C002")) ); // 模糊查询 + 不等于 List<CargoName> likeList = baseMapper.selectList( Wrappers.<CargoName>lambdaQuery() .like(CargoName::getName, "石油") .ne(CargoName::getStatus, "DELETED") ); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值