增删改同时获取主键id

引言

        项目中遇到这么一个问题,在做数据库的插入操作时我同时还需要查出主键id,如果写两个方法固然可以,但是也有更简便的实现方式,下面分享给大家。

代码

<span style="font-size:18px;">    public int Add(B_0003Info entity)
        {
            try
            {
                Database db = DBHelper.CreateDataBase();

                string Str = string.Format("insert into [B_0003Info]([DocumentNo],[DepartmentNo],[ConstraintName],[ProblemDescribe],[Solution],[IsSpecial],
[IsSolve],[ISClose],[IsDelete],[CreateDate]) values('{0}','{1}','{2}','{3}','{4}',{5},{6},{7},{8},'{9}');
<span style="color:#FF0000;">select @@IDENTITY"</span>, entity.DocumentNo, entity.DepartmentNo, entity.ConstraintName, entity.ProblemDescribe, entity.Solution, entity.IsSpecial, 
entity.IsSolve, entity.ISClose, entity.IsDelete, entity.CreateDate);//添加相应sql语句

                DbCommand cmd = db.GetSqlStringCommand(Str);
                int id = Convert.ToInt32(db.ExecuteScalar(cmd));
                if (id > 0)
                {
                    UpdateConstraintStates(entity);
                }
                return id;

            }
            catch (Exception ex)
            {
                log4netHelper.WriteLog(typeof(B_0003InfoDAL), ex);
                return 0;

            }
        }</span>

理解   

       大家在代码中看到select @@IDENTITY这行代码。作用就是查出插入行的主键id,然后通过return id就可以将其返回前端。删除和更新也同理,是不是很实用呢。

小结

          做项目中应该多多总结这些干货,多多积累。才能在今后的项目中运用自如。

<think>好的,我现在需要回答用户关于SQL增删改操作的返回值含义及如何获取的问题。用户提到了MyBatis的相关引用,所以我需要结合这些引用来组织答案。首先,我得回忆一下SQL中这些操作的基本返回值含义。 INSERT、UPDATE、DELETE在数据库中的执行通常返回的是受影响的行数。比如,插入一条记录返回1,更新三条记录返回3,删除零条则返回0。这是大多数数据库的行为,但不同的数据库可能会有差异,比如Oracle在特定情况下可能返回其他值,但用户的问题可能更多关注常规情况。 接下来要考虑的是如何在不同的编程环境或框架中获取这些返回值。用户提到的MyBatis,根据引用[2],insert、update、delete操作的返回值可以配置,但默认可能返回的是受影响的行数。例如,在MyBatis中,如果使用Mapper接口,方法可以定义为int类型,执行后会得到这个行数。需要确认引用中的内容,比如引用[2]提到“insert, update, delete只支持这些Attributes...”,可能涉及到返回值的配置,如useGeneratedKeys用于获取自增主键,但返回值本身是受影响的行数。 然后,用户可能还关心如何处理批量操作的情况。比如引用[1]和[3]中的批量插入,这时候返回值可能是总的受影响行数。但需要注意,某些数据库如Oracle在批量插入时可能需要特殊处理,比如设置useGeneratedKeys为false,如引用[3]所述,这时候返回值可能还是正确的行数总和吗? 此外,需要明确不同数据库的差异。例如,在MySQL中,执行批量INSERT可能返回插入的总行数,而Oracle使用特定语法时,可能也是如此。但需要参考引用[3]中的例子,其中提到两种Oracle的批量插入方式,并指出必须设置useGeneratedKeys=false。这时候,返回值是否仍然是受影响的行数?可能需要确认,但根据常规理解,MyBatis的返回值应该反映实际影响的行数。 然后,关于如何获取返回值,用户可能需要具体的代码示例。比如在MyBatis的Mapper接口中,定义一个方法int updateUser(User user);,调用后返回的int就是受影响的行数。对于XML配置,如引用[1]中的批量插入,虽然使用了foreach,但最终返回值应该是所有插入操作的总行数。 还要注意,有些情况下,比如执行UPDATE时,如果更新的行内容没有实际变化(例如将age从30设置为30),数据库可能返回0行受影响,这时候返回值是0,但实际没有数据变更。这也是需要提及的细节。 最后,需要总结返回值的主要含义,获取方法,以及在不同框架中的处理方式,特别是MyBatis中的配置和注意事项,比如Oracle批量插入时的useGeneratedKeys设置,避免错误。同时,可能还需要提到异常处理,比如当返回值与预期不符时的错误排。 现在,需要将这些点组织成结构清晰的回答,分点说明,并引用提供的参考资料作为支持。确保使用正确的中文表达,符合用户的要求,并且正确应用LaTeX格式,比如提到数字时用$1$,但根据用户示例,可能更多是自然语言中的数字,所以需要检是否需要数学格式。根据用户之前的示例,可能不需要在行内使用数学表达式,除非有公式,所以可能不需要特别处理。 可能的问题点:用户提供的引用中有关于MyBatis批量插入的配置,比如useGeneratedKeys的设置,这可能影响是否能够正确获取主键,但返回值(受影响行数)是否受影响?根据引用[3],在Oracle批量插入时,必须设置useGeneratedKeys=false才能成功,但返回值可能仍然是插入的行数。需要确认这点,并在回答中说明。 总结回答的结构: 1. 返回值的基本含义:受影响行数 2. 不同操作的具体情况(INSERT返回插入行数,UPDATE返回匹配并修改的行数,DELETE删除的行数) 3. 获取方法: a. JDBC中Statement.executeUpdate()返回int b. MyBatis中Mapper方法返回int c. XML配置中的注意事项(如Oracle批量插入需设置useGeneratedKeys=false) 4. 特殊情况处理(如无变化的更新,批量操作的总行数) 5. 不同数据库的差异(如Oracle批量语法) 然后生成相关问题,如关于MyBatis如何配置批量操作、返回值异常处理、不同数据库差异等。</think>### SQL增删改操作的返回值解析 #### 一、返回值含义 1. **基本定义** SQL的`INSERT`、`UPDATE`、`DELETE`操作默认返回**受影响的行数**,类型为整数: - `INSERT`:成功插入的行数,例如插入单条数据返回$1$。 - `UPDATE`:实际被修改的行数,即使新值与原值相同也会被计数[^4]。 - `DELETE`:实际被删除的行数。 2. **特殊情况** - **批量操作**:返回值是所有操作影响的行数总和。例如批量插入$5$条数据,返回$5$。 - **无实际修改**:如将`age=30`更新为`age=30`,返回$0$。 #### 二、获取返回值的方法 1. **JDBC原生方式** 通过`Statement.executeUpdate()`或`PreparedStatement.executeUpdate()`直接获取返回值: ```java int affectedRows = statement.executeUpdate("DELETE FROM table"); ``` 2. **MyBatis框架** - **Mapper接口定义**:将方法返回值类型设为`int`。 ```java int updateUser(User user); ``` - **XML配置**:无需额外配置,默认返回受影响行数。但需注意: - **批量插入**:需根据数据库类型调整语法。例如Oracle需使用`INSERT ALL`或`UNION ALL`,并设置`useGeneratedKeys="false"`[^3]。 ```xml <insert id="mulAddOracle" parameterType="java.util.ArrayList" useGeneratedKeys="false"> INSERT INTO bill (TX_TYP, REMARK, NO) <foreach collection="list" item="bill" separator=" UNION ALL "> (SELECT #{bill.txTyp}, #{bill.remark}, #{bill.no} FROM dual) </foreach> </insert> ``` #### 三、注意事项 1. **数据库差异** - **MySQL**:直接支持批量操作,返回值即总行数。 - **Oracle**:需使用特定语法(如`INSERT ALL`),且必须关闭`useGeneratedKeys`[^3]。 2. **主键返回** 若需要获取自增主键,需配置`useGeneratedKeys="true"`和`keyProperty`,但此配置不影响返回值(返回值仍为行数)[^2]。 #### 四、示例场景 - **插入操作**: ```sql INSERT INTO student(name) VALUES ('Alice'), ('Bob'); -- 返回2 ``` - **更新操作**: ```sql UPDATE student SET age=20 WHERE id=1; -- 若匹配1行,返回1 ``` - **删除操作**: ```sql DELETE FROM student WHERE score < 60; -- 若删除3行,返回3 ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值