`
MauerSu
  • 浏览: 509493 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ibatis 插入一条数据返回插入这条数据的主键

 
阅读更多

源:http://www.iteye.com/topic/215571

评:

iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post)。

Oracle设置

Xml代码  收藏代码
  1. <!-- Oracle SEQUENCE -->   
  2. <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">   
  3.     <selectKey resultClass="int" keyProperty="id" type="pre">   
  4.         <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>   
  5.     </selectKey>   
  6.     <![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values(#id#,#description#)]]>   
  7. </insert>   


MS SQL Server配置

Xml代码  收藏代码
  1. <!-- Microsoft SQL Server IDENTITY Column -->   
  2. <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">   
  3.     <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) ]]>   
  4.     <selectKey resultClass="int" keyProperty="id" type="post">   
  5.         <![CDATA[SELECT @@IDENTITY AS ID ]]>  
  6.         <!-- 该方法不安全 应当用SCOPE_IDENTITY() 但这个函数属于域函数,需要在一个语句块中执行。 -->  
  7.     </selectKey>   
  8. </insert>  


上述MS SQL Server配置随是官网提供的配置,但实际上却恰恰隐患重重!按下述配置,确保获得有效主键。

Xml代码  收藏代码
  1. <!-- Microsoft SQL Server IDENTITY Column 改进-->   
  2. <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">   
  3.     <selectKey resultClass="int" keyProperty="id">   
  4.         <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) 
  5.         SELECT SCOPE_IDENTITY() AS ID ]]>  
  6.     </selectKey>   
  7. </insert>  


MySQL配置

Xml代码  收藏代码
  1. <!-- MySQL Last Insert Id -->  
  2. <insert id="insertProduct-Mysql" parameterClass="com.domain.Product">  
  3.     <![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values(#description#)]]>   
  4.     <selectKey resultClass="int" keyProperty="id">  
  5.         <![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>   
  6.         <!-- 该方法LAST_INSERT_ID()与数据库连接绑定,同属统一会话级别,不会发生上述MS SQL Server的函数问题。 -->  
  7.     </selectKey>  
  8. </insert>  


通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。

分享到:
评论

相关推荐

    08_ibatis教程_sql主键生成方式.zip

    主键是数据库表中用于唯一标识一条记录的字段,它的正确设置对数据完整性和一致性至关重要。下面我们将详细探讨Ibatis如何处理SQL主键的生成。 首先,了解Ibatis的基本工作原理。Ibatis允许开发者直接编写SQL语句,...

    08_传智播客ibatis教程_sql主键生成方式

    主键在数据库表中通常用来唯一标识一条记录,确保数据的唯一性。在Ibatis中,主键的生成方式有多种,可以根据不同的数据库类型和业务需求选择合适的方法。 1. **序列(Sequence)**:这是在Oracle数据库中常用的...

    MybatisPlus中插入数据后获取该对象主键值的实现

    // 插入数据并返回包含主键的实体 @PostMapping("add") @ResponseBody public Employee addEmployee() { Employee employee = new Employee(); employee.setLastName("chen") .setAge(18) .setEmail("10000@...

    ASP.NET MVC+iBatis+SQL

    在这个项目中,开发者使用了ASP.NET MVC框架作为后端控制层,iBatis作为数据访问层,以及SQL作为数据库查询语言。下面将详细阐述这三个主要组件以及它们之间的交互。 **ASP.NET MVC(Model-View-Controller)** ASP...

    ibatis技术总结

    4. **编写sqlmapconfig.xml**:这是iBatis的核心配置文件,其中定义了数据源、事务管理器、映射文件位置等关键配置。 5. **编写sqlmap.xml**:这是一个或多个包含具体SQL映射的XML文件,用于定义具体的SQL语句及其...

    ibatis PPT

    - **queryForObject**:用于获取单个对象,当查询结果只有一条记录时使用。 - **queryForList**:用于获取结果集,可以处理多条记录的返回。 - **Insert**:插入数据到数据库。 - **Delete**:删除数据。 - **Update...

    ibatis 的关系映射

    4. **批量操作**:iBatis 支持批量插入、更新和删除,这在处理大量数据时非常有效。可以通过 `&lt;foreach&gt;` 标签来迭代集合,并在 SQL 语句中使用。 5. **与Spring的整合**:iBatis 可以与 Spring 框架无缝集成,利用...

    iBATIS有关资料

    这些语句可以用于数据的增删改查,如插入一条记录(insert)、更新记录(update)、删除记录(delete)以及查询数据(select)。iBATIS提供了灵活的查询API,查询结果可以是int、Student对象、Map或其他自定义类型。...

    iBatis操作

    此方法实现了批量插入的功能,通过`SqlMapClientTemplate`进行操作,并且每500条数据执行一次批量提交,以减少网络传输次数,提高性能。 #### 五、性能优化 批量操作相比于单条数据操作有显著的性能优势。根据实际...

    ibatis案例详解

    接着,我们向表中插入了两条示例数据。 接下来是DAO(Data Access Object)接口,`IDAO`,它定义了对`ibatis`表进行CRUD(创建、读取、更新、删除)操作的方法。这些方法包括获取所有记录、根据名称或ID获取记录、...

    ibatis中文api文档

    - **自动生成的主键**:支持插入后自动生成主键。 - **存储过程**:支持调用存储过程。 ##### 4.2 参数处理 - **parameterClass**:指定参数对象的类。 - **parameterMap**:定义复杂的参数映射规则。 - **...

    ibatis 批量 增删改查

    在映射文件中,你可以定义一个包含多个`&lt;insert&gt;`标签的SQL语句,每个`&lt;insert&gt;`标签对应一条插入语句。然后通过`&lt;foreach&gt;`标签遍历传入的Java集合对象,动态生成对应的SQL语句。例如,如果你有一个User对象的List...

    ibatis学习笔记

    ### 五、插入一个实体对象 **A. insert标签** 示例: ```xml INSERT INTO STUDENT (NAME, AGE) VALUES (#{name}, #{age}) ``` **B. 业务逻辑插入一个实体对象** 示例: ```java Student student = new ...

    MyBaitsPlus快速入门,阿里java技术专家面试.pdf

    插入操作的示例展示了如何调用`insert()`方法向数据库中插入一条记录。创建一个`User`对象,设置属性值,然后调用`userMapper.insert(user)`即可完成插入。 在面试中,对于MyBatisPlus的理解可能包括但不限于以下几...

    AppFramework_V1.0

    众所周知Oracle提供了ROWNUM实现数据数据库内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。 &lt;br&gt;第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的...

    AfinalDemo

    前者根据主键获取一条记录,后者则可以根据自定义SQL或HQL(Afinal的简化版Hibernate查询语言)进行复杂查询。 更新操作:`Session.update()`方法用于更新数据,同样接受实体对象作为参数,Afinal会根据对象的变化...

    AppFramework_V1.0_New

    &lt;br&gt; &lt;br&gt;下面三张表格罗列的测试数据,可以明显看出AppFramework数据库访问组件的性能全面超越了IBatisNet: &lt;br&gt; &lt;br&gt;表I –10并发20循环(数据库和测试机分开) &lt;br&gt;对比项目 iBatis2.0 ...

    springmybatis

    创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` ...

    mybatis通用MapperUUID简单示例共3页.pd

    现在,我们可以在Mapper接口中使用通用的CRUD方法,例如插入一条新的用户记录: ```java // 假设已经有了一个UUID实例 UUID userId = UUID.randomUUID(); User user = new User(); user.setId(userId); user.set...

Global site tag (gtag.js) - Google Analytics