在执行数据插入,如何返回插入的该条数据的主键。各种数据库生成主键的策略各不相同,如使用序列事前生成主键的Oracle和PostgreSQL;事后生成主键的MySQL和SQL Server。下面将介绍使用mybatis统一处理的过程
一、selectKey简介
selectKey会在执行数据插入之前,先为该条待插入的记录生成一个主键。并插入之后,将该主键返回。
<selectKey keyProperty="id" resultType="int" order="BEFORE“ statementType="PREPARED">
属性 描述
keyProperty selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
keyColumn 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
resultType 结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。
statementType 与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。
二、实例
1、oracle例子:(STOCKIDSEQUENCE为已建好的序列)
<insert id="insertProduct-ORACLE" parameterClass="product">
<selectKey resultClass="int" type="pre" keyProperty="id" >
SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL
</selectKey>
insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)
</insert>
2、sql-server例子:
<insert id="insertProduct-MS-SQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
<selectKey resultClass="int" type="post" keyProperty="id" >
select @@IDENTITY as value
</selectKey>
</insert>
3、mysql例子:
<insert id="insertProduct-MYSQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
<selectKey resultClass="int" type="post" keyProperty="id" >
select LAST_INSERT_ID() as value
</selectKey>
</insert>
4、SQLite例子:
<insert id="Create" parameterClass="Subject">
INSERT INTO SUBJECT
(SubjectName,QuestionCount,IsNowPaper)
VALUES(#SubjectName#,#QuestionCount#,#IsNowPaper#)
<selectKey resultClass="int" type="post" property="SubjectId">
SELECT seq
FROM sqlite_sequence
WHERE (name = 'SUBJECT')
</selectKey>
注意:name = 'SUBJECT'中SUBJECT为表名称
5、postgresql例子:
<insert id="insertProduct-Postgres" parameterClass="product">
<selectKey resultClass="int" type="pre" keyProperty="id" >
SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL
</selectKey>
insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)
</insert>
分享到:
相关推荐
自动替换generator.properties中的句号(.)为反斜杠,设置key为key+"_dir"后缀 示例: pkg=com.company => pkg_dir=com/company 九.自动拷贝二进制文件至输出目录 如模板目录下的 zip,rar,doc文件将会自动拷贝至...
SelectKey是Mybatis提供的一种机制,用于解决Insert数据时不支持主键自动生成的问题。 SelectKey的应用 在实际开发中,我们经常遇到需要 Insert 数据时生成主键的问题,而大多数数据库管理系统(DBMS)并不支持...
在MyBatis中,主键自动生成是一种常见且实用的功能,尤其在与支持自动增加主键的数据库(如MySQL)配合使用时。当我们在插入数据时,有时希望数据库能够自动为新记录生成唯一的主键值,而不是手动指定。MyBatis提供...
Mybatis Generator是一款强大的工具,它能够自动生成Mybatis框架所需的SQL映射文件、Mapper接口以及实体类,大大简化了开发工作,提高了效率。通过配置XML文件,我们可以指定数据库连接信息、表名、生成的文件类型等...
运行MyBatis Generator,它会根据配置文件中的设置自动生成相应的Java类和XML文件。这些文件可以被SpringBoot自动扫描并加载,无需额外的配置。 最后,你可以开始在SpringBoot项目中使用这些逆向生成的类进行数据库...
它能够根据数据库中的表自动生成Java实体类、Mapper接口及XML配置文件,极大地提高了开发效率,减少了手动编写重复代码的工作量。下面将详细介绍MyBatis Generator的相关知识点。 一、MyBatis Generator的基本概念 ...
如果需要在插入数据后获取自增的主键值,MyBatis提供了`<selectKey>`元素来实现这一功能。这通常在处理一对多关系,需要新主键值来关联多端数据时非常有用。 对于Oracle,配置如下: ```xml ...
MyBatis 提供了多种主键回填方式,包括使用动态代理方式实现主键回填、使用 selectKey 标签实现主键回填和使用 UUID 或时间戳生成唯一主键。 MyBatis 的SQL 语句构建 MyBatis 提供了多种 SQL 语句构建方式,包括 ...
mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...
`#{key}`是参数占位符,MyBatis会将传入的`key`值替换并添加到`CONCAT('%', #{key}, '%')`中,从而实现模糊查询。 对应的Java接口`UserMapper.java`中,需要定义对应的方法: ```java List<User> queryUserByKey...
在第19集中,教程详细阐述了如何在映射文件中使用insert标签,并配合selectKey来获取非自增主键的值。这对于那些不依赖数据库自动生成主键的表来说是非常关键的。 第17、18集则关注于自增主键的处理,17集展示了...
MyBatis会自动生成主键(如果存在的话)。例如: ```java @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})") int insertUser(User user); ``` 4. **@Update**: 用于标注更新数据的SQL语句。例如: `...
- **主键自动生成**:在MySQL中,可以通过设置`useGeneratedKeys="true"`和`keyProperty`属性来自动生成主键。 - **示例**: ```xml INSERT INTO mi_user (username, password) VALUES (#{username}, #{...
MBG的主要功能是对数据库表(或多个表)进行分析,并自动生成可以用于访问这些表的代码。这极大地简化了与数据库表交互时初始对象和配置文件的设置过程。尽管MBG对简单的CRUD操作(创建、读取、更新、删除)有显著...
这里我们使用Mybatis的注解来定义SQL语句,`@Insert`用于创建临时表,`@Select`用于查询临时表中的数据。注意,临时表在会话结束时会被自动删除,所以它们只对当前连接可见。 接着,我们需要创建一个对应的实体类`...
7. **自动生成主键(Auto-generating Primary Keys)**:在关联表中,MyBatis可以通过`useGeneratedKeys`和`keyProperty`属性,配合数据库的自动增长字段,自动生成关联表的主键。 8. **连接查询(Join Queries)**...
MyBatis逆向工程工具可以帮助开发者自动生成数据库表对应的Java实体类、Mapper接口以及XML映射文件等,极大地提高了开发效率。 总结起来,MyBatis是一个功能强大、易于使用的持久层框架,通过其丰富的特性和灵活的...
对于某些不支持`useGeneratedKeys`属性的数据库,MyBatis提供了`<selectKey>`元素来显式执行一个查询来获取新生成的主键。这通常在插入后立即执行,确保获取到正确的值。例如: ```xml <selectKey keyProperty...
3. **参数映射**:MyBatis提供了多种参数映射方式,包括Map参数、@Param注解的命名参数以及使用注解@SelectKey进行主键生成。 4. **结果映射**:通过`<resultMap>`标签,MyBatis可以实现复杂的数据结构映射,包括一...