使用mybatis,在添加数据的时候返回主键,当查询count和属性字段怎么接收返回数据

本文介绍如何使用MyBatis实现添加数据后返回主键的操作,并展示了一个查询消费者订单数量并按数量排序的例子。涉及Mapper文件配置、XML映射文件编写及测试方法调用。

1.使用mybatis添加数据,返回主键

说明:这里主要注意的是Mapper文件,在原来的select中,一般是有返回值,但是返回主键是没有的
①Mapper文件

void save(User user)

② Mapper.xml文件

<insert id="saveOrder" keyColumn="order_id" keyProperty="id" useGeneratedKeys="true">
        insert into orders(order_number) values (#{orderNumber});
    </insert>

③调用Mapper的测试方法

@Test
    public void testSql(){
        Order o = new Order();
        o.setOrderNumber("摩托车");
        orderMapper.saveOrder(o);
        int id = o.getId();
        System.out.println(id);
    }

注:

虽然没有返回值,但是当作为参数的传入对象对象中已经有了id的属性,所以可以直接o.getId()来获取添加对象的id

2.当查询count和属性字段,返回值接受问题

这里写图片描述
获取每一个消费者的订单数,并且按照升序排列
Mapper.xml

<select id="getModels" resultMap="map">
    select customer_id ,count(1) as 'count' from orders 
    group by customer_id order by count DESC
    </select>
    <resultMap type="com.atguigu.mybatis.beans.Model" id="map">
        <id column="customer_id" property="orderNumber" />
        <result column="count" property="counts"/>
    </resultMap>

Model是从新定义一个类来接受select上的两个数据。如果是左外连接要通过customer_id 获取customer对象,那么可以做在model类中加入customer的属性和count属性。
Model类

public class Model {

    private String orderNumber;
    private int counts;
    public String getOrderNumber() {
        return orderNumber;
    }
    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }
    public int getCounts() {
        return counts;
    }
    public void setCounts(int counts) {
        this.counts = counts;
    }

}

Mapper.java文件

List<Model> getModels();
### MyBatis Plus 分页查询出现重复数据的原因及解决方案 MyBatis Plus 的分页功能基于拦截器 `PaginationInterceptor` 实现,通过改写 SQL 语句添加 `LIMIT` `OFFSET` 子句完成分页操作。然而,在某些场景下可能会出现分页查询结果中包含重复数据的问题,其主要原因可能涉及以下几个方面[^1]: #### 1. **SQL 查询未正确排序** 如果在分页查询时未指定明确的排序规则(例如 `ORDER BY`),数据库可能根据自身的默认排序方式返回结果。这种情况下,当数据量较大或存在相同的字段值时,不同页的数据可能出现重复。这是因为数据库无法保证每一页的结果唯一性。 **解决方案**: 在分页查询的 SQL 语句中显式添加 `ORDER BY` 子句,确保结果集按照某一字段进行排序。例如: ```java QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.orderByDesc("id"); // 按照主键降序排列 Page<User> page = new Page<>(currentPage, pageSize); userMapper.selectPage(page, queryWrapper); ``` #### 2. **分布式事务或缓存问题** 在分布式系统中,如果使用了分布式缓存(如 Redis)来存储分页结果,但未正确处理缓存更新逻辑,可能导致缓存中的数据数据库实际数据不一致,从而引发重复数据问题。 **解决方案**: - 确保缓存更新逻辑与数据库操作保持一致性。 - 在高并发场景下,可以考虑使用带有版本号的缓存策略,避免缓存击穿或脏读。 #### 3. **分页插件优化参数配置不当** MyBatis Plus 的分页插件默认会对 SQL 进行优化,尤其是在生成统计总记录数的 `COUNT` 查询时。如果业务逻辑复杂,或者 SQL 中包含子查询、关联查询等复杂表达式,可能导致优化过程出错,进而影响分页结果。 **解决方案**: 可以尝试关闭 `optimizeCountSql` 参数,避免插件对 SQL 进行不必要的优化。例如: ```java Page<User> page = new Page<>(currentPage, pageSize); page.setOptimizeCountSql(false); // 关闭 COUNT SQL 优化 userMapper.selectPage(page, queryWrapper); ``` #### 4. **数据库索引问题** 如果查询字段未建立合适的索引,可能导致数据库在执行分页查询时性能下降,甚至出现错误结果。特别是在大数据量表中,缺少索引会导致查询计划不佳,从而引发重复数据问题。 **解决方案**: - 确保查询字段(尤其是排序字段过滤条件字段)已建立索引。 - 使用 `EXPLAIN` 命令分析查询计划,确认是否使用了索引。 #### 5. **分页逻辑设计不合理** 在某些复杂查询场景下,如果分页逻辑设计不当,例如未正确处理跨页数据或未限制查询范围,也可能导致重复数据问题。 **解决方案**: - 避免在分页查询使用过多的关联查询或嵌套查询。 - 尽量简化查询逻辑,确保每页数据独立且互不干扰。 ### 示例代码 以下是一个完整的分页查询示例,包含排序优化参数设置: ```java // 创建分页对象 Page<User> page = new Page<>(currentPage, pageSize); // 设置关闭 COUNT SQL 优化 page.setOptimizeCountSql(false); // 创建查询条件 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("status", "active").orderByDesc("id"); // 执行分页查询 userMapper.selectPage(page, queryWrapper); // 获取分页结果 List<User> records = page.getRecords(); long total = page.getTotal(); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值