iBatis的sqlMap配置文件的
selectKey元素有个
type属性,可以指定
pre或者
post表示前生成(
pre)还是后生成(
post)。
Oracle设置
<!-- Oracle SEQUENCE -->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id" type="pre">
<![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>
</selectKey>
<![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values(#id#,#description#)]]>
</insert>
MS SQL Server配置
<!-- Microsoft SQL Server IDENTITY Column -->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
<![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) ]]>
<selectKey resultClass="int" keyProperty="id" type="post">
<![CDATA[SELECT @@IDENTITY AS ID ]]>
<!-- 该方法不安全 应当用SCOPE_IDENTITY() 但这个函数属于域函数,需要在一个语句块中执行。 -->
</selectKey>
</insert>
上述MS SQL Server配置随是官网提供的配置,但实际上却恰恰隐患重重!按下述配置,确保获得有效主键。
<!-- Microsoft SQL Server IDENTITY Column 改进-->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id">
<![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#)
SELECT SCOPE_IDENTITY() AS ID ]]>
</selectKey>
</insert>
MySQL配置
<!-- MySQL Last Insert Id -->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
<![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values(#description#)]]>
<selectKey resultClass="int" keyProperty="id">
<![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>
<!-- 该方法LAST_INSERT_ID()与数据库连接绑定,同属统一会话级别,不会发生上述MS SQL Server的函数问题。 -->
</selectKey>
</insert>
通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。
分享到:
相关推荐
MySQL、SQL Server等数据库支持字段的自动递增特性。在Ibatis中,只需在Mapper XML文件中的`<insert>`标签中设置`useGeneratedKeys="true"`和`keyProperty="id"`,就可以让数据库自动生成主键。 4. **雪花算法...
3. **Identity(自动增长)**:对于支持自动增长主键的数据库,如MySQL,Ibatis可以通过`identityInsert`属性开启自动增长功能。插入数据后,数据库会自动为新记录分配一个唯一的主键值。 4. **HiLo算法**:在大...
2. **身份列(Identity)**:在MySQL、SQL Server等支持自动增长的数据库中,可以设置某一列为主键并自动递增。在Ibatis中,可以在插入语句后直接获取生成的主键值。 3. **雪花算法(Snowflake)**:这是一种分布式...
iBATIS支持多种数据库管理系统,如Oracle、MySQL、SQL Server等。 二、SQL Maps概念 SQL Maps是iBATIS的核心组件,负责将Java对象与数据库表之间的映射。SQL Maps提供了一个灵活的方式来定义数据库表的结构和关系...
本篇文章将深入探讨如何使用Ibatis框架实现对`student`表的增删改查操作,包括模糊查询以及利用序列自动生成主键。 首先,我们来理解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一个SQL映射...
3. **支持多种数据库**:ibatis支持多种数据库,包括MySQL、Oracle、SQL Server等。 4. **易于调试**:由于SQL语句是在应用中明确编写的,因此更容易调试和维护。 #### 三、ibatis快速入门 1. **准备工作** - 下载...
- **后获取主键**:对于自动增长的主键,如MySQL,`<selectKey>`可以在插入语句之后配置,利用`LAST_INSERT_ID()`获取自增主键。 5. **SQL参数(ParameterClass)**: - 插入操作:`parameterClass`指定传入参数...
对于MySQL等支持自增主键的数据库,`<selectKey>`通常配置在插入语句之后,用于获取新插入记录的自增主键。 5. **SQL输入参数(ParameterClass)**: 在SQL语句中,通过`parameterClass`属性指定输入参数的类型。...
例如,在Oracle或DB2等数据库中,可以通过序列(sequence)来生成主键。为此,需要在插入语句之前配置主键生成逻辑: ```xml SELECT SEQ_TEST.NEXTVAL FROM DUAL insert into ... ``` 对于MySQL这样的自增...
- 包括各种主流关系型数据库系统,如MySQL、Oracle、SQL Server等。 - **3.7 缓存模型** - iBATIS提供了缓存机制来提高性能。 - **3.7.1 读取只读与读写缓存(仅Java)** - 读取只读缓存不会被更新,而读写缓存...
Ibatis提供了两种主要的分页方式:一是使用`limit`和`offset`(MySQL),二是使用`rownum`(Oracle)。在映射文件中,可以通过动态SQL来实现分页功能。 ```xml SELECT * FROM users WHERE 1=1 != null"> AND ...
"sequence.sql"可能是一个数据库脚本,通常用于创建序列,序列在关系型数据库中常用于生成唯一的ID,比如在主键字段上。在Oracle数据库中,序列是自增ID的一种常见实现方式,而在MySQL或PostgreSQL等数据库中,可能...
基于数据库,内建好数据库的model,并支持多种数据库(mysql,sql server,oracle测试通过) 半手工方式,生成的代码放在某个目录,再手工拷贝回来工作区 易于做二次开发,整个生成器本身就是java源代码,源代码核心十分精简,...
4. **高性能查询**:由于Ibatis允许开发者自定义SQL语句,可以根据数据库特性进行优化,因此相比Hibernate等全自动ORM框架,能够提供更高性能的查询能力。 5. **广泛应用**:包括阿里巴巴、慧点科技在内的多家知名...
对于主键自动赋值,iBATIS提供了`<selectKey>`标签来处理。在Oracle中,我们可以这样实现: ```xml SELECT STU_SEQ.NEXTVAL FROM DUAL INSERT INTO STUDENT(ID,NAME,BIRTH_DATE) VALUES(#id#,#name#,#...
3. 考虑数据库的特性,如MySQL的`ON DUPLICATE KEY UPDATE`或Oracle的`BULK COLLECT INTO`。 在Ibatis中,批量操作提供了更高效、更灵活的方式处理大量数据。理解并熟练应用这些技巧,能显著提升应用程序的性能和可...
- Ibatis 和 Ibatis3:直接修改生成的 `.java` 或 `.xml` 文件中的主键生成策略,如 MySQL 的 `auto_increment`。 - Spring_jdbc:根据策略类型修改 `DAO` 文件中的 `save()` 方法,例如针对 Oracle 的 `sequence`...
- **identity:** 如果数据库支持自动增长,设计表时指定该功能适用于MySQL, SQLServer。 - **sequence:** 如果数据库支持sequence,主键由sequence生成,适用于Oracle。 - **native:** 根据数据库类型自动选择...
MyBatis支持多种数据库,包括MySQL、Oracle、SQL Server等。 2. **MyBatis核心组件** - **SqlSessionFactory**: 是MyBatis的核心,用于创建SqlSession对象,它是线程不安全的,通常在应用启动时创建一个实例并全局...
- **identity**:适用于支持自动增长列的数据库,如MySQL和SQL Server。 - **sequence**:针对Oracle、DB2等支持序列的数据库。 - **uuid**:生成128位的UUID字符串主键。 **Configuration类** `Configuration`类...