最近用到插入oracle数据库时,主键id是sequnce自动生成,具体写法如下
对于oracle:
<insert id="insertUser" parameterClass="ibatis.User">
<selectKey resultClass="long" keyProperty="id">
select SEQ_USER_ID.nextval as id from dual
</selectKey>
insert into user
(id,name,password)
values
(#id#,#name#,#password#)
</insert>
对于mysql:
<insert id="insertUser" parameterClass="ibatis.User">
insert into user
(name,password)
values
(#name#,#password#)
<selectKey resultClass="long" keyProperty="id">
SELECT LAST_INSERT_ID() AS ID
</selectKey>
</insert>
上面是两种数据库的实现。
下面我们看看源码是如何做的
//-- Basic Methods
/**
* Call an insert statement by ID
*
* @param sessionScope - the session
* @param id - the statement ID
* @param param - the parameter object
* @return - the generated key (or null)
* @throws SQLException - if the insert fails
*/
public Object insert(SessionScope sessionScope, String id, Object param) throws SQLException {
Object generatedKey = null;
MappedStatement ms = getMappedStatement(id);
Transaction trans = getTransaction(sessionScope);
boolean autoStart = trans == null;
try {
//开始事务
trans = autoStartTransaction(sessionScope, autoStart, trans);
SelectKeyStatement selectKeyStatement = null;
if (ms instanceof InsertStatement) {
selectKeyStatement = ((InsertStatement) ms).getSelectKeyStatement();
}
// Here we get the old value for the key property. We'll want it later if for some reason the
// insert fails.
Object oldKeyValue = null;
String keyProperty = null;
boolean resetKeyValueOnFailure = false;
//对于oracle适用于执行insert之前执行selectKey获取id值
if (selectKeyStatement != null && !selectKeyStatement.isRunAfterSQL()) {
keyProperty = selectKeyStatement.getKeyProperty();
oldKeyValue = PROBE.getObject(param, keyProperty);
//sequnce获取id的值
generatedKey = executeSelectKey(sessionScope, trans, ms, param);
resetKeyValueOnFailure = true;
}
StatementScope statementScope = beginStatementScope(sessionScope, ms);
try {
//执行sql语句
ms.executeUpdate(statementScope, trans, param);
}catch (SQLException e){
// uh-oh, the insert failed, so if we set the reset flag earlier, we'll put the old value
// back...
if(resetKeyValueOnFailure) PROBE.setObject(param, keyProperty, oldKeyValue);
// ...and still throw the exception.
throw e;
} finally {
endStatementScope(statementScope);
}
//对于mysql适用于执行完insert后,获取id值
if (selectKeyStatement != null && selectKeyStatement.isRunAfterSQL()) {
generatedKey = executeSelectKey(sessionScope, trans, ms, param);
}
//提交事务
autoCommitTransaction(sessionScope, autoStart);
} finally {
//结束事务
autoEndTransaction(sessionScope, autoStart);
}
return generatedKey;
}
分享到:
相关推荐
解析这个XML文件的过程涉及到DOM或SAX解析器,源码中这部分功能通常在`org.apache.ibatis.io.Resources`和`org.apache.ibatis.builder.Configuration`类中实现。 三、Executor执行器 Executor执行器是iBatis的核心...
在本主题中,我们关注的是iBATIS 2.3.4版本的jar包及其源码。 首先,`ibatis-2.3.4.jar` 是包含iBATIS核心库的二进制文件,用于在Java应用中集成iBATIS。这个jar包包含了所有必要的类和资源,如SQL映射接口、数据...
通过分析Ibatis的源码,我们可以了解其内部如何处理SQL映射、参数绑定、结果映射等核心任务,以及它如何与各种框架(如Struts)协同工作。这对于我们优化数据库访问、理解和解决实际开发中的问题都有极大的帮助。...
2. **SqlMap接口和SqlMapClient**:SqlMap是与数据库交互的接口,而SqlMapClient是其实现,提供了执行SQL映射文件中的SQL语句的方法,如select、insert、update和delete。 3. **动态SQL**:iBATIS支持动态SQL,允许...
iBATIS框架源码剖析
【描述】描述中提到的"IBatis.Net流风通用管理框架源码"意味着这是一个包含了整个框架的源代码,用户可以深入理解其内部工作原理,同时也方便开发者进行二次开发或自定义调整。通用管理框架通常包括用户认证、权限...
【描述】中的"可以直接与myeclipse进行关联"意味着该源码包可以方便地在MyEclipse集成开发环境中导入和使用。MyEclipse是一款强大的Java EE集成开发工具,支持直接导入外部项目源码,便于开发者进行代码阅读、学习和...
1. 源码阅读:源码中包含Ibatis的所有核心组件,如SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等。通过阅读源码,可以深入了解其工作原理,例如如何加载配置文件、如何创建和管理SqlSession、如何执行...
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。是一个基于SQL映射支持Java和·NET的持久层框架。
ibatis 2.3.4 的源码 public abstract Object insert(String paramString, Object paramObject) throws SQLException; public abstract Object insert(String paramString) throws SQLException; public ...
在这个压缩包中,包含的文件是《ibatis框架源码剖析》的全文内容。 ibatis作为一个轻量级的Java持久层框架,其核心功能在于将SQL语句与Java代码解耦,提供了一种灵活的数据访问接口。它在设计上采用了基于XML或注解...
本项目源码提供了一个完整的 Spring + iBATIS 的 Demo 示例,旨在帮助开发者理解和学习如何将这两个框架集成到一个Java项目中。下面将详细介绍这个项目的相关知识点。 **Spring 框架** Spring 是一个全面的后端开发...
《IbatisDemo入门源码详解》 IbatisDemo是一个典型的基于Ibatis框架的入门示例,它为我们展示了如何在Java项目中使用Ibatis进行数据库操作。Ibatis,一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件...
ibatis源码 学习参考 对于学习ibatis很有帮助
通过学习和分析这个源码,开发者不仅可以深入了解SpringMVC和iBatis的协同工作原理,还可以掌握如何在Eclipse这样的IDE中配置和运行这样的项目。这有助于提升对MVC模式的理解,提高数据库操作的能力,以及熟练运用...
《Ibatis与Mybatis源码解析》 Ibatis和Mybatis是两个著名的Java持久层框架,它们在数据库操作中提供了高效、灵活的解决方案。本文将深入探讨这两个框架的源码,帮助开发者理解其内部机制,提升Java编程能力。 首先...
Ibatis框架是一个轻量级的Java持久层框架,它...通过分析源码,开发者能够深入理解Ibatis如何处理数据访问,如何与Web层交互,以及如何组织和管理数据库操作。同时,这样的分层结构也有助于代码的可维护性和扩展性。