MySQL+Mybatis插入数据后如何正确获取自增ID?keyProperty避坑指南

深入理解Spring Boot与MyBatis整合:插入数据后获取自增ID 本文将深入探讨在Spring Boot项目中,如何通过集成MyBatis框架,实现向数据库插入数据并获取自增ID的操作。通过清晰的语法结构、详细的示例代码、运行结果的分析以及注意事项等方面,为读者提供全面的指导,使其能够轻松应用这一功能于实际项目开发中。无论是新手开发者还是有一定经验的工程师,都能从本文中获得实用的知识和经验。 阅读详情

MySQL+Mybatis插入数据后如何正确获取自增ID?keyProperty避坑指南

最近在做一个订单系统的开发,遇到一个挺有意思的问题。我们有个需求,用户下单后需要立刻生成一个唯一的订单号,并且后续的支付、物流环节都要用这个ID来关联。团队里一个刚毕业不久的小伙伴,在Mybatis的Mapper里配置了useGeneratedKeys,满心欢喜地以为执行完insert方法,返回值就是那个自增的主键ID。结果呢?日志里打印出来的永远是“1”。他挠着头来找我:“哥,这数据库是不是坏了?怎么每次插进去都返回1,ID不应该是个很大的数字吗?”

我一看就乐了,这场景太经典了。很多刚开始用Mybatis的朋友,尤其是从一些其他ORM框架转过来的,很容易在这个点上踩坑。那个返回值“1”其实代表的是影响的行数,而真正的自增ID,早就悄无声息地“溜”进了你传入的那个实体对象里。今天我们就来彻底搞明白useGeneratedKeys和keyProperty这对搭档是怎么工作的,以及如何避开那些常见的“坑”。

1. 理解Mybatis的“返回值”陷阱:为什么你拿到的是1?

我们先从最让人困惑的地方说起。当你调用Mybatis的插入方法,比如int insert(Order order),这个方法执行完毕后返回的int值,永远代表的是该条SQL语句影响数据库的行数。对于单条INSERT语句,成功插入就是1,失败或异常就是0。这是JDBC规范定义的,Mybatis只是忠实地传递了这个结果。

那么自增ID去哪了?这就引出了JDBC的Statement.getGeneratedKeys()方法。支持自增主键的数据库(如MySQL、SQL Server),在执行插入语句后,可以通过这个接口拿到数据库内部生成的主键值。Mybatis的useGeneratedKeys功能,本质上就是帮你调用了这个方法,并且将取到的值,设置(回填)到你传入的Java实体对象的指定属性里。

关键理解:useGeneratedKeys机制是一个“副作用”操作。它不改变Mapper接口方法的返回值,而是修改了你传入的那个参数对象的状态。

我们来看一个典型的错误代码和正确理解的对比:

// Service层 - 错误的理解和用法
public Long createOrder(OrderDTO dto) {
    Order order = convertToEntity(dto);
    // 错误:以为insert方法的返回值就是新生成的ID
    Long generatedId = orderMapper.insert(order);
    return generatedId; // 这里返回的永远是 1!
}

// Service层 - 正确的理解和用法
public Long createOrder(OrderDTO dto) {
    Order order = convertToEntity(dto);
    // 正确:insert方法执行后,自增ID已经被注入到order对象的id属性中
    orderMapper.insert(order);
    // 从原对象中获取被回填的ID
    return order.getId();
}

这个“返回值是影响行数,ID回填到参数对象”的设计,其实有它的合理性。它保证了Mapper接口方法签名的一致性(int表示操作结果),同时通过参数引用的方式隐式地返回了额外的生成数据。但对于不熟悉机制的人来说,这确实是个容易掉进去的坑。

2. useGeneratedKeys与keyProperty的配置三叉戟

知道了原理,我们来看看怎么配置。Mybatis提供了三个不同层级的配置位置,它们的影响范围和优先级各不相同,就像一把三叉戟,用对了威力无穷,用错了可能伤到自己。

2.1 全局配置:一把双刃剑

在Mybatis的核心配置文件(通常是mybatis-config.xml)中,你可以在<settings>标签下进行全局配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 启用二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 允许JDBC支持自动生成主键 -->
        <setting name="useGeneratedKeys" value="true"/>
        <!-- 其他配置... -->
    </settings>
</configuration>

或者在Spring Boot的application.yml中通过configLocation指定上述配置文件,也可以直接在application.yml中配置:

mybatis:
  configuration:
    # 注意:这是configuration下的use-generated-keys,不是config-location
    use-generated-keys: true

这里有一个至关重要的细节:这个全局的useGeneratedKeys设置,只对使用注解的Mapper接口方法生效,对XML映射器完全无效! 这是很多开发者容易混淆的一点。如果你全局开启了useGeneratedKeys,但只在XML中写insert语句,那么自增ID依然不会被回填。

为什么这么设计?我猜测Mybatis团队是为了保持配置的显式性和局部可控性。XML映射器中的SQL语句通常更复杂,可能涉及多个表、子查询等,全局开启自动获取主键可能会带来意想不到的行为。

2.2 XML映射器配置:最常用、最明确的方式

对于大多数项目,尤其是在XML中编写复杂SQL的场景,直接在<insert>标签中配置是最清晰的方式:

<!-- 订单表插入 -->
<insert id="insertOrder" parameterType="com.example.entity.Order"
        useGeneratedKeys="true" keyProperty="id" keyColumn="order_id">
    INSERT INTO t_order (order_no, user_id, amount, status, create_time)
    VALUES (#{orderNo}, #{userId}, #{amount}, #{status}, NOW())
</insert>

这里三个属性各司其职:

  • useGeneratedKeys="true":明确告诉Mybatis,执行这个插入语句后要去获取数据库生成的主键。
  • keyProperty="id":这是Java实体类的属性名。Mybatis会把获取到的主键值,设置到参数对象(这里是Order)的id属性上。这里容易写错成数据库列名。
  • keyColumn="order_id":这是数据库表中的列名。告诉Mybatis数据库生成的主键在结果集中的列名是什么。如果数据库列名与keyProperty指定的属性名相同(或者通过驼峰映射能对应上),这个属性可以省略。

注意:keyProperty支持级联属性。如果你的参数是一个Map,或者实体对象中主键属性是嵌套对象的属性,可以这样写:keyProperty="order.id"。

XML配置的优先级是独立的,不受全局配置影响。也就是说,即使你在全局配置中设置了useGeneratedKeys="false",只要在XML的<insert>标签中明确设置为true,它就会生效。

2.3 注解配置:简洁但功能受限

对于简单的SQL,使用@Insert注解配合@Options可以让代码更紧凑:

public interface OrderMapper {
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    @Insert("INSERT INTO t_order(order_no, user_id, amount) VALUES (#{orderNo}, #{userId}, #{amount})")
    int insert(Order order);
}

注解配置有几个特点:

  1. 覆盖全局配置:如果在接口方法上使用了@Options(useGeneratedKeys = true),它会覆盖全局配置文件中的设置(无论全局是true还是false)。
  2. 仅适用于当前方法:不会影响同一个Mapper接口中的其他方法。
  3. 可读性:配置和SQL写在一起,一目了然,但复杂的SQL还是推荐用XML。

三种配置方式的对比和适用场景,我用一个表格来总结:

配置方式配置位置影响范围优先级适用场景
全局配置mybatis-config.xml 或 application.yml对所有注解Mapper方法生效最低(会被注解覆盖)项目普遍使用注解,且大多数插入需要返回ID
XML映射器配置Mapper XML文件中的<insert>标签仅对当前XML中的SQL生效独立(与全局配置互不影响)复杂SQL、动态SQL、项目主要使用XML
注解配置Mapper接口方法上的@Options注解仅对当前方法生效最高(覆盖全局配置)简单SQL、快速原型、偏好注解风格

实际项目中,我个人的习惯是:以XML配置为主,保持一致性。除非是极其简单的单表插入,否则我都会把SQL写在XML里,这样修改和维护起来更方便,也能利用Mybatis强大的动态SQL功能。

3. 深入JDBC驱动层:Mybatis如何与数据库“握手”获取ID?

理解了怎么配置,我们再来看看Mybatis底层是怎么实现的。这对于排查一些诡异的问题很有帮助,比如为什么在某个数据库版本下获取不到ID。

当你在MySQL中执行一个INSERT语句,并且表的主键是AUTO_INCREMENT时,MySQL服务器会在内存中生成这个自增值。但是,这个值怎么从数据库服务器传递到你的Java应用呢?这需要JDBC驱动的配合。

Mybatis的执行流程大致是这样的:

  1. 创建PreparedStatement:Mybatis通过JDBC连接创建PreparedStatement对象。
  2. 设置参数并执行:设置SQL参数,然后执行executeUpdate()。
  3. 判断是否需要获取生成键:如果配置了useGeneratedKeys="true",Mybatis会在创建Statement时通过Connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)来告诉JDBC:“嘿,执行完记得把生成的主键给我”。
  4. 调用getGeneratedKeys:执行插入后,调用statement.getGeneratedKeys()获取一个ResultSet。
  5. 结果集映射:从这个ResultSet中读取第一列的值(如果有多个自增列,按keyColumn指定的顺序),然后通过反射设置到参数对象的keyProperty属性上。
// 简化的伪代码,展示Mybatis核心逻辑
public int insert(String statement, Object parameter) {
    // 1. 获取配置
    MappedStatement ms = configuration.getMappedStatement(statement);
    boolean useGeneratedKeys = ms.getUseGeneratedKeys();
    
    // 2. 创建PreparedStatement
    PreparedStatement ps;
    if (useGeneratedKeys) {
        // 告诉JDBC需要返回生成的主键
        ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    } else {
        ps = connection.prepareStatement(sql);
    }
    
    // 3. 设置参数并执行
    setParameters(ps, parameter);
    int rows = ps.executeUpdate();
    
    // 4. 获取生成的主键
    if (useGeneratedKeys) {
        ResultSet rs = ps.getGeneratedKeys();
        if (rs.next()) {
            Object generatedKey = rs.getObject(1);
            // 5. 通过反射设置到参数对象
            setGeneratedKey(parameter, ms.getKeyProperty(), generatedKey);
        }
        rs.close();
    }
    
    ps.close();
    return rows; // 返回影响行数
}

这里有个技术细节:getGeneratedKeys()返回的ResultSet可能包含多列。如果你插入的表有多个自增列(虽然不常见),或者你通过keyColumn指定了特定的列,JDBC驱动会返回相应的列。Mybatis默认取第一列,这也是为什么通常我们只配置一个keyProperty。

不同的数据库和JDBC驱动,对这个功能的支持程度可能不同。比如,旧版本的某些驱动可能不支持RETURN_GENERATED_KEYS,或者支持得不好。这也是为什么Mybatis官方文档说“需要驱动兼容”。好在现在主流的MySQL Connector/J驱动(5.1.12+)对这个功能支持得很好。

4. 实战避坑:高频问题与最佳实践

理论讲完了,我们来看看实际开发中会遇到哪些坑,以及怎么填平它们。

4.1 坑一:批量插入时keyProperty怎么配?

单条插入没问题,但批量插入呢?这是很多人在实际项目中遇到的第一个挑战。Mybatis是支持批量插入获取自增ID的,但配置上有点小技巧。

<!-- 批量插入订单明细 -->
<insert id="batchInsertDetails" parameterType="list" 
        useGeneratedKeys="true" keyProperty="id">
    INSERT INTO t_order_detail (order_id, product_id, quantity, price)
    VALUES 
    <foreach collection="list" item="item" separator=",">
        (#{item.orderId}, #{item.productId}, #{item.quantity}, #{item.price})
    </foreach>
</insert>

注意这里的keyProperty="id",它会作用在list中的每一个元素上。执行后,每个OrderDetail对象的id属性都会被正确设置。

但是,批量插入获取ID有个重要的前提:数据库和JDBC驱动必须支持批量操作时返回多个生成键。MySQL是支持的,但某些数据库可能不支持。如果遇到问题,可以尝试以下方案:

  1. 改为循环单条插入:在Service层循环调用单条插入,虽然性能有损失,但最稳妥。
  2. 使用<selectKey>:对于不支持批量返回ID的数据库,可以用<selectKey>在插入前或插入后获取一个序列值(Oracle风格)。
  3. 业务层生成ID:如果对性能要求极高,可以考虑用雪花算法等在应用层生成分布式ID,完全避免数据库自增ID的获取问题。

4.2 坑二:嵌套对象中的主键回填

有时候我们的参数对象结构比较复杂,主键属性不在顶层对象中,而是在某个嵌套对象里。比如:

public class OrderCreateRequest {
    private Order order;
    private User user;
    // getters and setters
}

public class Order {
    private Long id; // 自增主键在这里
    private String orderNo;
    // ... 其他属性
}

这时候,keyProperty需要写成点分隔的路径形式:

<insert id="insertOrderWithRequest" parameterType="OrderCreateRequest"
        useGeneratedKeys="true" keyProperty="order.id">
    INSERT INTO t_order (order_no, user_id) 
    VALUES (#{order.orderNo}, #{user.id})
</insert>

执行后,自增ID会被设置到request.getOrder().setId(generatedValue)。

4.3 坑三:多数据库兼容性问题

如果你的应用需要支持多种数据库(比如MySQL和PostgreSQL),自增ID的获取方式可能不同。PostgreSQL使用SERIAL类型或IDENTITY,其获取方式与MySQL类似。但Oracle使用的是序列(Sequence),这时就需要用<selectKey>了。

<!-- Oracle示例:使用序列在插入前获取ID -->
<insert id="insertOrder" parameterType="Order">
    <selectKey keyProperty="id" resultType="long" order="BEFORE">
        SELECT order_seq.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO t_order (id, order_no, user_id)
    VALUES (#{id}, #{orderNo}, #{userId})
</insert>

为了保持代码的一致性,我建议在项目中抽象一个ID生成器,根据数据库类型决定使用哪种策略。或者,直接使用应用层生成的分布式ID,这样就不依赖数据库的自增特性了。

4.4 最佳实践总结

根据我多年的项目经验,这里有几个建议:

  1. 始终在XML中显式配置:即使全局开启了useGeneratedKeys,也建议在每个<insert>标签中显式写出useGeneratedKeys和keyProperty。这样代码更清晰,其他开发者一看就知道这个插入操作会回填ID。

  2. 统一命名规范:建议数据库自增主键列名统一叫id,Java实体类属性也统一叫id。这样keyProperty="id"可以成为项目标准,减少配置错误。

  3. Service层统一处理:在Service层,插入后立即从参数对象中取出ID,并记录日志或进行后续处理。形成固定的代码模式:

@Service
public class OrderService {
    @Transactional
    public OrderCreateResult createOrder(OrderCreateCommand command) {
        Order order = convert(command);
        
        // 插入操作
        orderMapper.insert(order);
        
        // 立即获取并记录ID
        Long orderId = order.getId();
        log.info("订单创建成功,订单ID: {}", orderId);
        
        // 后续业务操作,如发送消息、更新缓存等
        eventPublisher.publish(new OrderCreatedEvent(orderId));
        
        return new OrderCreateResult(orderId, order.getOrderNo());
    }
}
  1. 单元测试验证:为Mapper的插入方法编写单元测试,验证ID是否被正确回填:
@Test
public void testInsertOrder_ShouldSetGeneratedId() {
    Order order = new Order();
    order.setOrderNo("ORD202401010001");
    order.setUserId(1001L);
    
    // 执行前id应为null或0
    assertNull(order.getId());
    
    int affectedRows = orderMapper.insert(order);
    
    // 验证影响行数
    assertEquals(1, affectedRows);
    // 验证ID被回填
    assertNotNull(order.getId());
    assertTrue(order.getId() > 0);
}
  1. 监控与告警:在重要的业务插入操作中,添加监控点。如果插入后ID仍然是初始值(比如0或null),可以发出告警,及时发现配置问题。

5. 高级场景:分布式环境下的ID生成思考

虽然useGeneratedKeys解决了单数据库实例下的自增ID获取问题,但在微服务、分布式架构下,数据库自增ID本身可能就是一个需要重新考虑的设计选择。

数据库自增ID的局限性:

  • 扩展性差:分库分表时,自增ID需要特殊处理(如设置不同的初始值和步长)。
  • 安全性问题:连续的自增ID可能暴露业务量,被爬虫利用。
  • 先插入后获取:需要插入后才能知道ID,某些需要先知道ID的业务场景不方便。

分布式ID生成方案对比:

方案示例优点缺点适用场景
数据库自增MySQL AUTO_INCREMENT简单、绝对有序扩展性差、安全性低单库单表、小规模应用
UUIDJava UUID.randomUUID()全局唯一、无需中心化无序、存储空间大、索引效率低对顺序无要求、数据量不大
雪花算法Twitter Snowflake趋势递增、高性能时钟回拨问题、机器ID分配分布式系统、高并发
数据库号段每次从DB取一批ID高性能、可控需要维护号段表、可能浪费中等并发、需要顺序ID
Redis原子操作INCR或INCRBY高性能、简单Redis单点问题、持久化考虑已有Redis、并发量高

如果你的项目正在向分布式架构演进,我建议尽早考虑分布式ID方案。一个常见的做法是使用“雪花算法+数据库号段”的混合模式:平时用雪花算法,遇到需要严格顺序或与旧系统兼容时,用数据库号段。

即使决定继续使用数据库自增ID,在分布式环境下也要注意:

  • 分库分表时,使用SHARDING_KEY + AUTO_INCREMENT的组合。
  • 考虑使用数据库中间件(如ShardingSphere)来统一管理ID生成。
  • 重要业务表可以考虑使用业务自定义ID(如订单号ORD+时间戳+随机数),而不是单纯依赖数据库自增ID。

回到我们开头那个订单系统的例子,后来我们改用了“时间戳+业务编码+随机数”的订单号生成规则,完全摆脱了对数据库自增ID的依赖。这样不仅解决了分布式下的ID生成问题,订单号本身也包含了更多业务信息,运维排查问题时更方便。

技术选型没有银弹,关键是理解每种方案的适用场景和 trade-off。useGeneratedKeys 在合适的场景下依然是一个简单有效的工具,但作为开发者,我们需要知道它的边界在哪里,以及什么时候该考虑更高级的解决方案。

MPC模型预测控制实战:从理论到代码实现(Python示例) 本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。 阅读详情

相关推荐

奈曼-皮尔逊准则

奈曼-皮尔逊准则 如果各个假设的先验概率P(Hi)(i=0,1)P(H_i)(i=0,1)P(Hi​)(i=0,1)已知,并且每种判决的代价函数已知,这时,可以用贝叶斯准则进行判决。 如果进一步假设正确判决不付出的代价,而错误判决代价相同,即c00=c11=0,c01=c10=1c_{00}=c_{11}=0,c_{01}=c_{10}=1c00​=c11​=0,c01​=c10​=1,这时可以用最小平均错误概率准则进行判决。 在不知道先验概率P(Hi)(i=0,1)P(H_i)(i=0,1)P(Hi​)(

little_soldier的专栏 1万+

使用Mybatis进行插入时获取刚刚插入数据的ID(ID是自增字段)

使用Mybatis进行插入时获取刚刚插入数据的ID(ID是自增字段)

刘安皓的博客 8441

从零上手SKILL脚本:在Virtuoso中实现版图绘制自动化

本文详细介绍了如何使用SKILL脚本在Virtuoso中实现版图绘制自动化,从基础操作到高级技巧全面覆盖。通过抓取操作日志、转换交互式函数为程序式函数,以及核心函数深度解析,帮助读者快速掌握SKILL脚本编程,大幅提升版图设计效率。文章还提供了实际工程应用案例和调试优化技巧,适合从零开始的初学者。

weixin_28742653的博客 763

MyBatis中在插入数据后,对象立刻获取Id的方法

在做crm项目,角色添加权限功能,插入角色数据时,需要获取角色id添加到角色权限中间表,但获取的角色id是空,经查询,解决办法如下 获取自增主键,拥有自增主键的数据库:MySQL 在insert标签中,加入keyProperty和useGeneratedKeys两个属性: !-- 增加 --> <!--useGeneratedKeys设置为true,keyProperty设置为出...

Yuncoco的博客 7984

SAM2与Docker的完美组合:5分钟搞定Linux环境下的图像分割部署

本文详细介绍了如何在Linux环境下通过Docker快速部署SAM2图像分割模型,解决安装过程中的常见问题。文章提供了从镜像选择、CUDA版本匹配到容器构建的全流程指南,特别针对GPU加速环境下的'cudnn_frontend: No execution plans support the graph'等报错提供了实用解决方案,帮助开发者在5分钟内完成高效部署。

fern8的博客 933

GameFramework框架详解之 Network网络框架

NetworkManager只负责维护NetworkChannel,实际的有种我们简历网络连接的也是NetworkChannel作为一个网路频道,这样管理起来比较方便,比如:一个游戏可能有多个网络连接,那么我们建立多个网络频道即可,或者当我们一个网络频道断线后,我们可以直接再新建一个,防止数据混乱。/// /// 网络管理器。/// /// 网络频道。/// 用户自定义网络错误事件。/// 检查是否存在网络频道。/// 获取网络频道。/// 获取所有网络频道。

TxNet 3366

mybatis中如何获取mysql数据库中新插入的数据的自增id值?

mybatis中如何获取mysql数据库中新插入的数据的自增id值?

gb4215287的博客 1213

Bash Shell 系统巡检脚本

部分安全相关检查需要root权限,建议通过sudo运行完整检查。

老韩的Linux云计算架构师进阶之路 96

MyBatis中mysql 插入数据并返回自增主键和非自增主键的方式

mysql 插入数据并返回自增主键和非自增主键的方式 MyBatis的insert操作,如何在插入数据的同时返回主键呢?分为两种情况,一种情况是该主键是自增主键,另一种情况是该主键非自增,接下来对两种情况详细解释。 mysql支持自增主键,而Oracle不支持自增主键,在JDBC中可以使用getGeneratedKeys()方法获得自增主键。 获取自增主键的值 CompetitionMapper.java中的接口 int createCompetition(Competition competition

suitianshuang 3590

黑猫带你学eMMC协议第29篇:eMMC设备锁详解(CMD42)

通过cmd42命令,可以给emmc设置密码,并且锁定emmc。这时候就不能对emmc的user分区进行读写数据访问了。设备锁在V4.3版本后的emmc里面,就只能保护user area分区,因此,被锁定的emmc,依旧可以正常访问BOOT\RPMB\GPP分区。emmc内部有128 bit PWD寄存器,用来存放密码,以及有8bit PWD_LEN寄存器,用来密码长度。这两个寄存器非易失性,掉电也不会丢失。

黑猫奥利奥的博客 3237

基于A*算法的二维栅格地图路径规划与避障MATLAB仿真

本文将介绍如何使用MATLAB编写基于A*算法的二维栅格地图路径规划与避障的仿真程序。我们可以使用二维数组表示地图,其中每个元素表示一个栅格的状态,例如1表示障碍物,0表示可行走区域。接下来,我们需要定义A*算法的节点类。G值表示从起始节点到当前节点的代价,H值是启发式函数估计的从当前节点到目标节点的代价。算法,我们可以有效地找到起始点到目标点的最短路径,并在仿真中进行可视化展示。算法的基本思路是从起始节点开始,按照一定的启发式函数选择下一个节点,直到找到目标节点或者遍历完所有可行走区域。

ByteWhizX的博客 1273

mybatis批量插入返回自增ID

返回ID的要求: 1.dao中不要出现@param注解,集合变量名请使用list 2.collection对应的值请使用list 解释: 当我们传递一个 List 实例或者数组作为参数对象传给 MyBatis。MyBatis 会自动将它包装在一个 Map 中,名称为key。List 实例将会以“list” 作为key 而数组实例将会以“array”作为value。所以,当我们传递的是一个List集合时,mybatis会自动把我们的list集合包装成以list为Key值的map。如1要求不使用指定key的话,

weixin_42255981的博客 2008

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

mysql 插入数据后返回自增 ID 的七种方法

引言mysql 和 oracle 插入的时候有一个很大的区别是:oracle 支持序列做 id;mysql 本身有一个列可以做自增长字段。mysql 在插入一条数据后,如何能获得到这个自增 id 的值呢? 一:使用 last_insert_id()SELECT LAST_INSERT_ID();   1. 每次 mysql 的 query 操作在 mysql 服务器上可以理解为一次“原子”操作, ...

QLiuQ 8万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

记录mybatis连接MySQL获取插入某条数据的自增id

记录mybatis连接MySQL获取插入某条数据的自增id 搜索得文章:神雕大侠mu-MYSQL插入一条数据并返回自增id 使用文章中第二种方法实现获取某条新增数据得自增id,id会直接注入到方法的参数,不用设置返回类型。 // xml <insert id="addGroupInfo" parameterType="com.soft.mybatis.model.GroupDto" keyP...

zhou_1997的博客 433

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mybatis 插入一条数据后返回该数据的自增id

MyBatis中获取自增主键值的方法:在insert语句中添加useGeneratedKeys="true"和keyProperty="id"属性,前者表示使用数据库自增主键,后者指定将生成的主键值赋给实体类的id属性。示例中,插入User对象后,通过user.getId()即可获取数据库自动生成的id值。使用@Transactional确保事务完整性,输出结果1表示插入成功条数,3为返回的自增ID值。这种方法简化了获取自增主键的操作流程。

纯洁的小魔鬼 9392

Mybatis中useGeneratedKeys与 keyProperty、以及自增主键

目录 1.起因 2.useGeneratedKeys属性与keyProperty属性 3.注意事项 4.jdbc版本 5.Mybatis如何解决自增主键问题? 5.1.解决思路 5.2.针对支持自增主键的数据库(例如:MySQL) 5.3.针对不支持自增主键的数据库(例如:Oracle) 6.MySQL的LAST_INSERT_ID()函数 1.起因 2021年09月22日在开发项目的时候,需要分别在oracle、mysql上运行,可问题在于数据库的逻辑设计:要求表的主键是自增序列se

狼行千里吃肉 2499

insert into select 主键自增_mysql插入数据后返回自增ID的方法

❝作者:学无止境出处:https://www.cnblogs.com/duanxz/❞mysql插入数据后返回自增ID的方法mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢?方法一:是使用last_insert_idmysql>SELECTLAST...

weixin_39638526的博客 4320

mybatis插入数据后获取不到主键

mybatis插入数据后获取不到主键mybatis插入数据,记录存在,但是获取不到主键问题描述:insert配置信息如下:结论 mybatis插入数据,记录存在,但是获取不到主键 问题描述: 1.GoodsOrder order = this.setOrder(remark…));//此步骤对要插入的对象进行赋值(除了主键,数据库设置的主键自增) 2.dao.insert(order);//插入到数据库中 3.Integer orderId = order.getOrderId();//此处拿到的值为nul

weixin_44347152的博客 3348

mybatis向mysql中插入数据返回自增id 注解+xml方式

注解和xml介绍注解方式说明使用xml方式说明使用 介绍 当我们准备向两张有关联的表中(父、子)插入完整数据时,就需要在第一次插入父表数据后获取自增id,之后在子表中关联此id 注解方式 说明 @SelectKey(keyProperty = "id"//对应要返回的实体属性 ,keyColumn = "id"//对应数据库中的自增列名称 ,before = false//在更新语句执行之前返回还是之后返回 ,resultType = Integer.class//和id类型相匹配 ,s

ROBOT_ADMIN的博客 1320

mysql视图自增id_7种获取MySQL插入数据的自增ID方法,你知道他们的优劣吗?

mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢?方法一:是使用last_insert_idmysql> SELECT LAST_INSERT_ID();产生的ID 每次连接后保存在服务器中。这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_IN...

weixin_35844772的博客 1371

老大,我想获取MySQL插入数据的自增ID,该怎么弄?

mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢?...

emprere的博客 553

mysql批量插入返回id_Mybatis[批量]插入返回自增ID

简介最近在业务功能中需要获取mybatis插入的数据并且返回插入数据的ID,去执行其他的操作,说来也很简单,在正常的insert标签里面加入提供的其他属性即可实现,故现在抽时间整理出来,希望能帮助到需要帮助的朋友环境数据库:mysql(table的id字段设置为自增)依赖:jarorg.mybatismybatis3.2.7org.mybatismybatis-spring1.2.2单条插入返回D...

weixin_31541755的博客 2005

Mybatis获取当前插入数据的ID

Mybatis获取当前插入数据的ID项目场景:问题描述:解决方案: 项目场景: 添加一条记录,操作多张表 例如:最近开发的时候遇到一个问题,有三张表,模板表,字段表,模板字段对应关系表(一个模板可以有多个字段,一个字段也可以对应多个模板) 问题描述: 在字段表添加字段的时候,本身字段表是不保存模板表id的,这时候需要在插入字段表的同时,获取到当前插入后返回的主键,然后将该id和模板表id存入到关联关系表中。 解决方案: 针对自增id可以在mapper.xml中添加参数 useGeneratedKeys=“

ac_cjc的博客 1660

Mybatis 获取自增主键 useGeneratedKeys与keyProperty解答

举个例子,我主表数据库里面的字段未增加数据之前,我的id为1,当我增加完主表之后,我的id就为2了,myabtis会把2传递给我实体类的id 这个字段上,当我再次给我的子表赋值,就是为2了。我在给主表自增的时候,我忘记设useGeneratedKeys与keyProperty 因为我当时寻思着的id是自增的,设不设置问题不大,反正数据库的字段会自增,是因为useGeneratedKeys=“true”,表明使用自增主键获取主键值策略,然后再利用 keyProperty 属性指定对应的主键属性,...

weixin_52361100的博客 1263

MyBatis插入数据,返回新增数据的ID

其实有一些低代码平台生成的代码里本身就有这部分内容,不过不一定实时都能有好用的工具可以用,这是先前的一个疑问点,特此记录以备它用。

qq_41623592的博客 1528

MySQL在mybatis中返回插入的自增id

一、使用 useGeneratedKeys 参数 Mybatis 配置文件 useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。 keyColumn:数据库表中的自增字段名。 keyProperty:数据库自增字段在pojo中的对应属性 ...

带着梦想前行的博客 4463
上一篇: 基于YOLOv8的航拍绵羊检测实战:从数据集构建到模型部署全流程
下一篇: Windows 10 快速搭建FTP服务器:从零到实战
vim8coder
博客等级 码龄1天 0粉丝 1693原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值