转载他人的文章
Batis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post)。
Oracle设置
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>
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配置
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>
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配置随是官网提供的配置,但实际上却恰恰隐患重重!按下述配置,确保获得有效主键。
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>
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配置
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>
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>
通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。
相关推荐
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)**:这是一种分布式...
对于序列主键(如Oracle、DB2中的Sequence),需要在插入语句之前配置`<selectKey>`标签来获取主键值。例如: ```xml SELECT SEQ_TEST.NEXTVAL FROM DUAL insert into .... .... ``` 对于MySQL等支持...
iBATIS支持多种数据库管理系统,如Oracle、MySQL、SQL Server等。 二、SQL Maps概念 SQL Maps是iBATIS的核心组件,负责将Java对象与数据库表之间的映射。SQL Maps提供了一个灵活的方式来定义数据库表的结构和关系...
- **后获取主键**:对于自动增长的主键,如MySQL,`<selectKey>`可以在插入语句之后配置,利用`LAST_INSERT_ID()`获取自增主键。 5. **SQL参数(ParameterClass)**: - 插入操作:`parameterClass`指定传入参数...
3. **支持多种数据库**:ibatis支持多种数据库,包括MySQL、Oracle、SQL Server等。 4. **易于调试**:由于SQL语句是在应用中明确编写的,因此更容易调试和维护。 #### 三、ibatis快速入门 1. **准备工作** - 下载...
例如,在Oracle或DB2等数据库中,可以通过序列(sequence)来生成主键。为此,需要在插入语句之前配置主键生成逻辑: ```xml SELECT SEQ_TEST.NEXTVAL FROM DUAL insert into ... ``` 对于MySQL这样的自增...
在Java代码中,我们需要创建一个接口`StudentMapper`,并在其中声明对应的操作方法,这些方法将由Ibatis自动映射到XML文件中的SQL语句。 ```java public interface StudentMapper { void insertStudent(Student ...
- 包括各种主流关系型数据库系统,如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 ...
在Oracle数据库中,序列是自增ID的一种常见实现方式,而在MySQL或PostgreSQL等数据库中,可能会使用其他方法,如自增字段。 "PinganBBS[new].sql"可能是平安论坛的数据库结构定义或数据初始化脚本,它可能包含了表...
对于主键自动赋值,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中,批量操作提供了更高效、更灵活的方式处理大量数据。理解并熟练应用这些技巧,能显著提升应用程序的性能和可...
1. **SQL语句独立性**:Ibatis将SQL语句从Java源程序中抽离出来,放置于单独的XML文件中编写,这使得在后期对程序进行维护时变得更加便捷。 2. **简化开发工作**:通过封装底层JDBC API的调用细节,Ibatis能够自动将...
- Ibatis 和 Ibatis3:直接修改生成的 `.java` 或 `.xml` 文件中的主键生成策略,如 MySQL 的 `auto_increment`。 - Spring_jdbc:根据策略类型修改 `DAO` 文件中的 `save()` 方法,例如针对 Oracle 的 `sequence`...
MyBatis支持多种数据库,包括MySQL、Oracle、SQL Server等。 2. **MyBatis核心组件** - **SqlSessionFactory**: 是MyBatis的核心,用于创建SqlSession对象,它是线程不安全的,通常在应用启动时创建一个实例并全局...
在 Oracle 和 DB2 中,需要在插入语句之前配置 selectKey 来获取主键值。例如:<insert id="insertAccount" parameterClass="Account"> <selectKey resultClass="long" keyProperty="sctId"> SELECT SEQ_TEST....
- **identity:** 如果数据库支持自动增长,设计表时指定该功能适用于MySQL, SQLServer。 - **sequence:** 如果数据库支持sequence,主键由sequence生成,适用于Oracle。 - **native:** 根据数据库类型自动选择...
在Java领域,常见的关系型数据库有MySQL、Oracle、PostgreSQL等。对于面试,你需要了解SQL语言的基本操作,如SELECT、INSERT、UPDATE、DELETE,以及更高级的概念,如视图、存储过程、事务处理和数据库设计原则,如第...