`

Mybatis 示例之 SelectKey

阅读更多
SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。

不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。


selectKey Attributes 属性 描述
keyProperty selectKey 语句结果应该被设置的目标属性。
resultType 结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
statementType 和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表 PreparedStatement 和CallableStatement 类型。


SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。

像Oracle这样取序列的情况,需要设置为before,否则会报错。


另外在用Spring管理事务时,SelectKey和插入在同一事务当中,因而Mysql这样的情况由于数据未插入到数据库中,所以是得不到自动增长的Key。取消事务管理就不会有问题。


下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了:

[html] view plaincopy在CODE上查看代码片派生到我的代码片

    <insert id="insert" parameterType="map"> 
        insert into table1 (name) values (#{name}) 
        <selectKey resultType="java.lang.Integer" keyProperty="id"> 
          CALL IDENTITY() 
        </selectKey> 
      </insert> 


上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数类型还要一致,否则会报错。


[java] view plaincopy在CODE上查看代码片派生到我的代码片

    @Insert("insert into table2 (name) values(#{name})") 
    @SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class) 
    int insertTable2(Name name); 

上面是注解的形式。
http://blog.csdn.net/isea533/article/details/21153791
分享到:
评论

相关推荐

    Mybatis示例之SelectKey的应用

    Mybatis示例之SelectKey的应用 Mybatis是一种流行的持久层框架,提供了简洁的数据持久化解决方案。今天我们将讨论Mybatis的一个重要特性:SelectKey。SelectKey是Mybatis提供的一种机制,用于解决Insert数据时不...

    mybatis连接oracle实例

    id NUMBER PRIMARY KEY, age NUMBER, username VARCHAR2(50), password VARCHAR2(50) ); ``` 这将创建一个包含`id`(主键)、`age`、`username`和`password`四个字段的表。 2. **配置MyBatis**: 创建...

    MyBatis学习之三动态SQL语句[借鉴].pdf

    本篇将深入探讨MyBatis的动态SQL语句,主要关注`selectKey`和`if`标签的使用。 ### 3.1 `selectKey`标签 `selectKey`标签主要用于在插入数据时自动生成主键,尤其是在Oracle中使用序列或MySQL中使用函数生成ID的...

    mybatis教程之动态sql语句[收集].pdf

    MyBatis 的 `&lt;selectKey&gt;` 标签就为此目的设计,它可以在插入语句之前或之后执行,用来获取新生成的主键。 以下是对 `&lt;selectKey&gt;` 标签的详细解释: 1. **keyProperty**:这个属性用于指定生成的主键应该设置到...

    MyBatis3.2.4完全自学手册

    ### MyBatis3.2.4完全自学手册 #### 一、快速入门 **1、MyBatis简介** MyBatis起源于Apache的一个开源项目iBatis,在2010年由Apache Software Foundation迁移到Google Code并更名为MyBatis。之后在2013年11月,该...

    springmybatis

    mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现...

    mybatis总结

    - **Oracle主键生成**:在Oracle数据库中,可以通过`selectKey`标签配合自定义SQL语句来实现主键生成。 - **示例**: ```xml &lt;selectKey keyProperty="id" resultType="int" order="BEFORE"&gt; SELECT mi_user_...

    SpringBoot+Mybatis,返回Map的时候,将Map内的Key转换为驼峰的命名

    @Select("SELECT * FROM user") Map, Object&gt; getAllUsers(); } ``` 然后在Service层中调用`MapUtils.toCamelCaseMap`进行转换: ```java @Service public class UserService { @Autowired private UserMapper...

    中文版mybatis3.2.3开发文档

    此外,MyBatis 还支持使用 `@SelectKey` 注解来执行插入语句后的自增主键获取。 5. **事务管理**:MyBatis 提供了基于编程和声明式的事务管理。在 Spring 环境下,可以使用 Spring 的事务管理器来配合 MyBatis 进行...

    mybatis 教程讲解

    id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age INT ); INSERT INTO users (name, age) VALUES ('孤傲苍狼', 27); INSERT INTO users (name, age) VALUES ('白虎神皇', 27); ``` 执行以上 SQL 脚本...

    mybatis详细使用讲解

    dept_id INT PRIMARY KEY AUTO_INCREMENT, dept_name VARCHAR(50), dept_address VARCHAR(50) ); INSERT INTO dept (dept_name, dept_address) VALUES ('研发部一部', '广州'); INSERT INTO dept (dept_name, ...

    mybatis_demo.zip

    接着,我们来看`mybatis_demo`这个目录,它包含了MyBatis示例项目的主体部分。这里通常会有以下关键组件: 1. **mybatis-config.xml**:MyBatis的核心配置文件,定义了数据源、事务管理器、SqlSessionFactory等核心...

    MyBatis笔记

    - 对应的Key值分别为: - `mybatis-3-mapper.dtd`:`http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd` - `mybatis-3-config.dtd`:`http://mybatis.org/dtd/mybatis-3-config.dtd` ##### 3. 创建数据库配置...

    mybatis的Helloworld

    10. **运行程序**:现在你可以运行`Main.java`,如果一切配置正确,程序会输出`users`表中的所有用户名,完成MyBatis的“Hello World”示例。 通过这个简单的例子,我们了解了MyBatis的基本工作流程,包括配置文件...

    mybatis笔记

    - **使用 Map 传参**:Map 的 key 必须与 SQL 中的 #{key} 相对应。 - **使用 @Param 传参**:为参数添加注解,提高代码可读性。 #### 八、SQL 语法差异 - **# 和 $ 的区别**: - **#**:将传入的数据当作字符串...

    mybatis开发步骤

    -- map作为参数时,#{id}里面的字段一定要map设置的key一致 --&gt; &lt;!-- 条件查询,返回值以键值对形式存在List,Object&gt;&gt;中 --&gt; &lt;select id="findByMap" resultType="java.util.HashMap" &gt; select id,studentId,...

    mybatis简单demo

    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在本"mybatis简单demo"中,...通过理解并实践这个示例,你可以更好地掌握MyBatis的基本用法,为进一步深入学习和应用MyBatis打下坚实的基础。

    MyBatis动态条件通用查询

    动态SQL是MyBatis的重要特性之一,它允许我们在映射文件或者Mapper接口中编写条件语句,这些语句可以根据传入的参数动态生成。在处理Map条件时,通常会用到`&lt;if&gt;`、`&lt;choose&gt;`(相当于switch-case)、`&lt;when&gt;`、`...

    MyBatis中文文档

    3. **参数映射**:MyBatis提供了多种参数映射方式,包括Map参数、@Param注解的命名参数以及使用注解@SelectKey进行主键生成。 4. **结果映射**:通过`&lt;resultMap&gt;`标签,MyBatis可以实现复杂的数据结构映射,包括一...

Global site tag (gtag.js) - Google Analytics