多表关联时,新增数据要考虑的问题。

本文介绍在MyBatis中使用useGeneratedKeys属性来自动获取Customer表插入后的自增ID,并通过Customer实体类的getId()方法返回。同时提供了解决多表关联时如何获取关联表ID的方法。
<insert id="addCustomer" parameterType="com.pd.gch.moudles.customer.model.Customer" useGeneratedKeys="true" keyProperty="id">
    <!--<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id">-->
      <!--SELECT LAST_INSERT_ID() AS id-->
    <!--</selectKey>-->

 

Customer,Organization, RefOrganizationCustomer三张表。ID都是自增。(mysql数据库)

 

有多张表有关联关系时,新增关系表RefOrganizationCustomer的数据时,如何获取Customer和Organiaztion的ID!!!

mybatis的<insert>时,加上useGeneratedKeys属性,设为true,KeyProperty的值对应的是customer表对应的customer实体类的主键ID,假如名字叫A,

那么这里的值就为A。

 

执行完<insert>后,新增的customer表的ID就被赋值到它对应的customer实体类里了。这个时候customer.getId()获取到的就是新增后的ID值了。

 

上面的<selectKey>是Oracle的用法。

 

 

 

转载于:https://www.cnblogs.com/bboymonk/p/6411131.html

<think>嗯,用户现在的问题是"在连接查询如何新增数据",并提到"如何在数据库连接查询的场景下插入新数据"。这明显是一个数据库操作的具体技术问题。通过查看提供的引用材料,可以看到引用[1]介绍了MySQL数据库操作、备份优化等,引用[2]详细说明了临变量的用法。这些恰好对回答用户当前问题很有帮助。用户可能正在开发一个涉及关联的系统,遇到了数据插入的困惑。ta的真正需求应该是在保持数据库结构完整性的前提下,如何正确地向关联添加数据。从问题语境判断,用户至少已经掌握了基础SQL语法,但缺乏对操作的经验。值得展开的关键问题应该是:当存在外键约束,如何避免插入数据报错?为此需要先确定几点技术要点:外键约束的作用、插入顺序的重要性、事务管理、以及临等工具的使用场景。考虑到引用[2]中提到临变量在查询中的作用,这个知识点可以特别强调。例如在批量插入,先通过临暂存数据,再分别插入各个主,最后处理关联。同也要提醒用户注意作用域限制——如果用户想复用中间数据,临会比变量更合适。需要具体举一个例子以便用户理解。比如订单系统中的典型插入:先插客户,再插订单,最后插订单明细。每一步都要通过last_insert_id()获取自增ID用于后续操作。如果用户需要代码示例,则提供标准SQL语法或Python连接MySQL的示例代码(引用[1]中正好有关联内容)。最后还应提醒常见的错误场景,比如违反外键约束导致的报错和处理方法。整个回答要保持阶梯递进:从理论原则→操作步骤→优化工具(临)→错误预防,这样用户能逐步构建完整的知识框架。</think> 在连接查询场景下插入新数据**不可直接进行**,因为连接(JOIN)用于查询而非写入操作。新增数据需要针对单个执行 `INSERT` 语句,并通过**合理顺序和数据关联**确保数据一致性。以下是具体操作逻辑: --- ### **核心原则** 1. **明确插入目标**:确定数据要插入到哪个具体中。 2. **解决数据依赖关系**:被引用(如主)需先插入数据,再操作引用(如从)。 3. **获取关联键值**:通过 `LAST_INSERT_ID()`(MySQL)、`RETURNING`(PostgreSQL)或编程语言接口获取自增ID,用于后续关联。 --- ### **操作步骤(以订单系统为例)** 假设需插入新订单数据,涉及三张: - `customers`(客户):主键 `customer_id` - `orders`(订单):主键 `order_id`,外键 `customer_id` - `order_items`(订单明细):外键 `order_id` #### **1. 优先插入主(被引用)** ```sql -- 插入客户(若客户不存在) INSERT INTO customers (name, email) VALUES ('张三', 'zhangsan@example.com'); -- 获取刚插入的 customer_id SET @new_customer_id = LAST_INSERT_ID(); ``` #### **2. 插入关联(引用主)** ```sql -- 插入订单(引用 customer_id) INSERT INTO orders (order_date, customer_id) VALUES (NOW(), @new_customer_id); -- 获取刚插入的 order_id SET @new_order_id = LAST_INSERT_ID(); ``` #### **3. 插入子(引用关联)** ```sql -- 插入订单明细(引用 order_id) INSERT INTO order_items (order_id, product_id, quantity) VALUES (@new_order_id, 101, 2), (@new_order_id, 205, 1); ``` --- ### **需
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值