Mybatis使用中遇到的问题-selectOne与返回值类型

Mybatis实操遇到的问题-

由selectOne和返回值类型引发的一系列问题

先是一个简单的错误

写了一个简单的测试项目,分为两层:web层和core层,在写core层的DAO操作时候,使用了selecOne方法:

此时为0.1版本代码

BaseDaoImpl.java
public Object queryForObject(String sqlId, Map<String, Object> params) {
    return getSqlSession().selectOne(sqlId, params);
    }

NoticeMapper.xml
<!-- 查询公告列表 -->
<select id="getNotice" parameterType="java.util.Map" resultType="Notice">
    select * from notice
    <where>
        <if test="id!=null">
            ID = #{id}
        </if>
        <if test="content!=null">
            and content = #{content}
        </if>
        <if test="createTime!=null">
            and createTime = #{createTime}
        </if>
    </where>
</select>

使用的时候查了一下API知道会返回一条查询数据,无数据时候返回null,理解为了Mybatis会自动处理数据,当有多条数据的时候,自动返回第一条数据,但是在测试时候,发现理解错误,当有多条数据时候会直接报错:“selectOne会返回一条结果数据,但是当前结果条数:总计:2”。也就是说selectOne只能处理单条数据,超过一条时就会出现错误,使用此函数哟啊慎用。

由于这个问题引发了一个联想的问题,当数据库没有数据的时候,selectOne的结果会是如何的呢?因此进行了测试,清空了数据表之后进行debug,一步步调试的时候很正常,返回结果为null并没有报错,也就是selectOne的操作可以处理数据为空的清空,但是调试到为了方便查看结果写下的print语句:System.out.println("getnotice"+notice.toString());时竟然开始报Java错误了,看到错误原因才想到因为notice的结果是null,所以null.toString()就会报Java的错误。

结论:

1.使用selectOne时必须确保返回的结果条数小于等于一条在实际环境中感觉实用性一般。

2.如果需要将selectOne的返回值传递进行操作的话,必须考虑可能的返回null的情况,否则程序就会异常。

引发的第二个问题

由于selectOne使用有问题,而数据库内数据不确定性较大,考虑改为使用List<Map<*,*>>来接收返回值,因此更新了DAO的操作:

0.2版本 BaseDaoImpl.java
public List<Map<String, Object>> queryForList(String sqlId,
        Map<String, Object> param) {
    List<Map<String, Object>> list = getSqlSession().selectList(sqlId, param);
    List<Map<String, Object>> beans = ConvertUtil.convertSqlMap2JavaMap(list);
    return beans;
}

在更新完成后,进行测试,依旧报错,debug之后发现犯了低级的错误,在更改了DAO的操作之后没有联动的去更新NoticeMapper.xml文件内容,在0.1版本中select的返回值类型是Notice,需要将其更改为java.util.Map。

0.2版本 NoticeMapper.xml
<!-- 查询公告列表 -->
<select id="getNotice" parameterType="java.util.Map" resultType="java.util.Map">
    select * from notice
    <where>
        <if test="id!=null">
            ID = #{id}
        </if>
        <if test="content!=null">
            and content = #{content}
        </if>
        <if test="createTime!=null">
            and createTime = #{createTime}
        </if>
    </where>
</select>

结论:每次的修改都要细致的考虑整个逻辑流程,级联更改所有可能涉及的部分。

需要自己深思的地方

  • 写代码不能太急,在写的过程中,要细心,保持逻辑清楚。

  • selectOne的问题值得深思,因为返回null时感觉不容易考虑到,所以自己进行简单测试不容易发现,有必要学习一些自动化的测试方法,在完成功能编写后对代码自己先进行测试。

### MyBatis-Plus 中 `selectOne` 方法的使用教程 #### 方法概述 `selectOne` 是 MyBatis-Plus 提供的一个便捷方法,用于查询单条记录。它适用于通过唯一条件(如主键或其他唯一字段)查找数据的情况。如果查询结果超过一条,则会抛出异常[^1]。 #### 参数说明 该方法接受一个封装了查询条件的对象作为参数,通常是 `Wrapper` 接口的具体实现类(如 `QueryWrapper` 或 `LambdaQueryWrapper`)。这使得开发者可以灵活地构建复杂的查询逻辑。 #### 示例代码 以下是使用 `selectOne` 查询单条记录的示例: ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; public class UserService { @Autowired private UserMapper userMapper; public void getUserById() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", 1); // 设置查询条件:id=1 User user = userMapper.selectOne(queryWrapper); System.out.println(user); } } ``` 上述代码展示了如何通过 `id` 字段查询用户表中的单条记录。需要注意的是,当存在多条符合条件的数据时,程序将抛出 `MybatisSystemException` 异常,并提示底层 SQL 错误信息。 #### 常见注意事项 1. **唯一性约束** 调用 `selectOne` 方法前应确保查询条件具有唯一性,否则可能导致运行时错误。 2. **返回值校验** 如果查询不到任何匹配的结果,`selectOne` 将返回 `null`。因此,在实际应用中建议对返回值进行判空处理。 3. **性能优化** 避免在高并发场景下频繁调用此方法执行复杂查询操作,以免影响系统性能[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值