源:http://www.iteye.com/topic/215571
评:
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>
通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。
相关推荐
主键是数据库表中用于唯一标识一条记录的字段,它的正确设置对数据完整性和一致性至关重要。下面我们将详细探讨Ibatis如何处理SQL主键的生成。 首先,了解Ibatis的基本工作原理。Ibatis允许开发者直接编写SQL语句,...
主键在数据库表中通常用来唯一标识一条记录,确保数据的唯一性。在Ibatis中,主键的生成方式有多种,可以根据不同的数据库类型和业务需求选择合适的方法。 1. **序列(Sequence)**:这是在Oracle数据库中常用的...
// 插入数据并返回包含主键的实体 @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(Model-View-Controller)** ASP...
4. **编写sqlmapconfig.xml**:这是iBatis的核心配置文件,其中定义了数据源、事务管理器、映射文件位置等关键配置。 5. **编写sqlmap.xml**:这是一个或多个包含具体SQL映射的XML文件,用于定义具体的SQL语句及其...
- **queryForObject**:用于获取单个对象,当查询结果只有一条记录时使用。 - **queryForList**:用于获取结果集,可以处理多条记录的返回。 - **Insert**:插入数据到数据库。 - **Delete**:删除数据。 - **Update...
4. **批量操作**:iBatis 支持批量插入、更新和删除,这在处理大量数据时非常有效。可以通过 `<foreach>` 标签来迭代集合,并在 SQL 语句中使用。 5. **与Spring的整合**:iBatis 可以与 Spring 框架无缝集成,利用...
这些语句可以用于数据的增删改查,如插入一条记录(insert)、更新记录(update)、删除记录(delete)以及查询数据(select)。iBATIS提供了灵活的查询API,查询结果可以是int、Student对象、Map或其他自定义类型。...
此方法实现了批量插入的功能,通过`SqlMapClientTemplate`进行操作,并且每500条数据执行一次批量提交,以减少网络传输次数,提高性能。 #### 五、性能优化 批量操作相比于单条数据操作有显著的性能优势。根据实际...
接着,我们向表中插入了两条示例数据。 接下来是DAO(Data Access Object)接口,`IDAO`,它定义了对`ibatis`表进行CRUD(创建、读取、更新、删除)操作的方法。这些方法包括获取所有记录、根据名称或ID获取记录、...
- **自动生成的主键**:支持插入后自动生成主键。 - **存储过程**:支持调用存储过程。 ##### 4.2 参数处理 - **parameterClass**:指定参数对象的类。 - **parameterMap**:定义复杂的参数映射规则。 - **...
在映射文件中,你可以定义一个包含多个`<insert>`标签的SQL语句,每个`<insert>`标签对应一条插入语句。然后通过`<foreach>`标签遍历传入的Java集合对象,动态生成对应的SQL语句。例如,如果你有一个User对象的List...
### 五、插入一个实体对象 **A. insert标签** 示例: ```xml INSERT INTO STUDENT (NAME, AGE) VALUES (#{name}, #{age}) ``` **B. 业务逻辑插入一个实体对象** 示例: ```java Student student = new ...
插入操作的示例展示了如何调用`insert()`方法向数据库中插入一条记录。创建一个`User`对象,设置属性值,然后调用`userMapper.insert(user)`即可完成插入。 在面试中,对于MyBatisPlus的理解可能包括但不限于以下几...
众所周知Oracle提供了ROWNUM实现数据数据库内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。 <br>第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的...
前者根据主键获取一条记录,后者则可以根据自定义SQL或HQL(Afinal的简化版Hibernate查询语言)进行复杂查询。 更新操作:`Session.update()`方法用于更新数据,同样接受实体对象作为参数,Afinal会根据对象的变化...
<br> <br>下面三张表格罗列的测试数据,可以明显看出AppFramework数据库访问组件的性能全面超越了IBatisNet: <br> <br>表I –10并发20循环(数据库和测试机分开) <br>对比项目 iBatis2.0 ...
创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` ...
现在,我们可以在Mapper接口中使用通用的CRUD方法,例如插入一条新的用户记录: ```java // 假设已经有了一个UUID实例 UUID userId = UUID.randomUUID(); User user = new User(); user.setId(userId); user.set...