三种数据库
本文和大家讲一下如何使用ibatis来获取刚刚插入数据的ID的方法,也是在网上找到的,挺实用。
iBatis的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>
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>
上述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>
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>
通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。
引用:http://sunbin.iteye.com/blog/1450943
分享到:
相关推荐
在Ibatis中,只需在Mapper XML文件中的`<insert>`标签中设置`useGeneratedKeys="true"`和`keyProperty="id"`,就可以让数据库自动生成主键。 4. **雪花算法(Snowflake Algorithm)**: 在分布式环境下,为了保证...
3. **Identity(自动增长)**:对于支持自动增长主键的数据库,如MySQL,Ibatis可以通过`identityInsert`属性开启自动增长功能。插入数据后,数据库会自动为新记录分配一个唯一的主键值。 4. **HiLo算法**:在大...
2. **身份列(Identity)**:在MySQL、SQL Server等支持自动增长的数据库中,可以设置某一列为主键并自动递增。在Ibatis中,可以在插入语句后直接获取生成的主键值。 3. **雪花算法(Snowflake)**:这是一种分布式...
- **后获取主键**:对于自动增长的主键,如MySQL,`<selectKey>`可以在插入语句之后配置,利用`LAST_INSERT_ID()`获取自增主键。 5. **SQL参数(ParameterClass)**: - 插入操作:`parameterClass`指定传入参数...
Ibatis提供了多种主键生成策略,比如`identity`(标识列,适用于自动增长类型)、`sequence`(序列,Oracle常用)和`guid`(全局唯一标识符)。在Oracle环境下,我们通常会创建一个序列对象,然后在映射文件中配置...
- **创建数据库与表结构**:根据示例中的SQL语句创建名为`itcast`的数据库及`student`表,表中包括`id`(主键自增长)、`firstname`和`lastname`三个字段。 - **实体类定义**:定义一个名为`Student`的Java类,...
例如,可以创建一个名为`users`的表,包含`id`(主键)、`username`和`password`等字段。 2. Java实体类:根据数据库表结构,创建对应的Java对象,如`User`类,包含相应的属性。 3. SQL映射文件(Mapper XML):在...
对于自动增长的主键,iBatis 提供了 `<selectKey>` 标签来处理。在插入数据后,这个标签会执行一个单独的 SELECT 语句来获取新生成的主键值,并将其绑定到 Java 对象的相应属性上。 **优点** iBatis 的优点包括: 1...
- 接着创建`t_user`表,包含三个字段:`id`(自增长主键)、`user_name`(用户名)和`email`(邮箱)。 2. **创建存储过程**: - 定义一个存储过程`showUserData`,用于从`t_user`表中查询所有用户的详细信息,并...
在上面的代码中,`selectKey` 元素将获取最后插入的自动增长的主键值,并将其赋值给参数对象的 `id` 字段。 在实际应用中,我们可能需要在插入数据之后执行其他操作,例如,获取插入后的主键值,以便进行下一步的...
- **identity:** 如果数据库支持自动增长,设计表时指定该功能适用于MySQL, SQLServer。 - **sequence:** 如果数据库支持sequence,主键由sequence生成,适用于Oracle。 - **native:** 根据数据库类型自动选择...
- 示例:在 1NF 的基础上增加主键,并确保所有非主键字段直接依赖于主键。 - **第三范式 (3NF)** - 在满足 2NF 的基础上,消除传递依赖。 - 示例:从表中移除可以通过其他非主键字段间接获得的信息。 #### 存储...
- **查询**:根据用户ID查询用户信息,可以使用`select`标签定义SQL语句。 - **模糊查询**:根据用户名模糊查询,利用动态SQL功能实现。 - **添加**:使用`insert`标签定义插入语句,并处理自增主键返回。 - **删除*...
4. Delete(删除):删除操作通常基于主键ID,但建议先通过ORM查询对象,确保正确的目标被删除。 在实际开发中,选择合适的ORM框架,理解并熟练掌握其原理和最佳实践,是提高效率、减少错误的关键。常见的ORM框架如...
<id column="id" property="id" /> 查询列表的语句在 User.xml 中 程序代码 程序代码 <!-- 返回list 的select 语句,注意 resultMap 的值是指向前面定义好的 --> <select id="selectUsers" ...
但是前提是需要在主键的getter上标上 @Id 注解@Id public Integer getId() { return id; }例子@Test public void testGet() throws NoIdAnnotationFoundException, NoColumnAnnotationFoundException, ...
- **内存泄露**:不再使用的对象没有被垃圾回收机制及时回收,导致内存占用持续增加。 - **内存溢出**:当程序申请内存超过系统所能提供的最大内存时,会出现内存溢出错误。 ##### 单例 - **目的**:确保某个类...