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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 插入数据返回生成的 ID 的使用方法 在 MyBatis 中,可以通过配置 `<insert>` 标签的属性 `useGeneratedKeys` `keyProperty` 来实现插入数据返回生成的主键 ID。以下是详细的说明示例: #### 1. `useGeneratedKeys` 属性属性用于指示 MyBatis 是否应该使用 JDBC 的 `getGeneratedKeys()` 方法来获取数据库自动生成的主键值。如果设置为 `true`,则表示启用该功能。 #### 2. `keyProperty` 属性属性指定了将生成的主键值映射到 Java 对象的哪一个字段。通常情况下,它会指向实体类中的主键字段名称。 --- ### MySQL 数据库示例 假设有一个名为 `query_rate_config` 的表,其结构如下: ```sql CREATE TABLE query_rate_config ( id INT AUTO_INCREMENT PRIMARY KEY, code VARCHAR(50), partner_type TINYINT, search_count INT, booking_count INT, ticket_count INT, rate_type TINYINT ); ``` 对应的 MyBatis 映射文件可以这样定义: ```xml <insert id="insertQueryRateConfig" parameterType="com.demo.domain.CountRateConfig" useGeneratedKeys="true" keyProperty="id"> INSERT INTO query_rate_config (code, partner_type, search_count, booking_count, ticket_count, rate_type) VALUES (#{code,jdbcType=VARCHAR}, #{partnerType,jdbcType=TINYINT}, #{searchCount,jdbcType=INTEGER}, #{bookingCount,jdbcType=INTEGER}, #{ticketCount,jdbcType=INTEGER}, #{rateType,jdbcType=TINYINT}) </insert> ``` 在此配置中,`useGeneratedKeys="true"` 表明启用了自增主键的功能,而 `keyProperty="id"` 则表明生成的主键值会被赋值给传入参数对象的 `id` 字段[^2]。 --- ### Oracle 数据库示例 对于不支持自动增长主键数据库(如 Oracle),可以借助序列(Sequence)触发器(Trigger)或者通过 `<selectKey>` 标签手动获取主键值。 以下是一个基于 Oracle 序列的例子: ```xml <insert id="insertMessageComment" parameterType="com.erp.oa.entity.MessageCommentDO"> <selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE"> SELECT SEQ_MESSAGE_COMMENT.NEXTVAL FROM DUAL </selectKey> INSERT INTO message_comment (ID, comment_man, comment_detail, insert_time) VALUES (#{id,jdbcType=INTEGER}, #{commentMan,jdbcType=INTEGER}, #{commentDetail,jdbcType=VARCHAR}, SYSDATE) </insert> ``` 在这个例子中,`<selectKey>` 被用来提前生成主键值,并将其赋值给 `id` 字段。注意这里的 `order="BEFORE"` 表示在执行插入语句之前先生成主键值[^4]。 --- ### 返回值解释 - **影响行数**:默认情况下,MyBatis 的 `<insert>` 操作返回的是受影响的行数,而不是生成的主键值。 - **主键值**:要获取生成的主键值,必须显式地配置 `useGeneratedKeys=true` 或者使用 `<selectKey>` 标签。 --- ### 注意事项 1. 如果使用了 `useGeneratedKeys=true`,那么 `<selectKey>` 是多余的,两者不可同时存在。 2. 不同数据库对主键生成的支持方式不同,需根据具体数据库特性调整配置。 3. 确保实体类中有与 `keyProperty` 值匹配的字段名,否则无法正确接收生成的主键值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值