zoukankan      html  css  js  c++  java
  • Mybatis 示例之 SelectKey(转)

    参考:http://blog.csdn.net/isea533/article/details/21153791

    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上查看代码片派生到我的代码片
     
    1. <insert id="insert" parameterType="map">  
    2.     insert into table1 (name) values (#{name})  
    3.     <selectKey resultType="java.lang.Integer" keyProperty="id">  
    4.       CALL IDENTITY()  
    5.     </selectKey>  
    6.   </insert>  


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

     

     

     

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. @Insert("insert into table2 (name) values(#{name})")  
    2. @SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)  
    3. int insertTable2(Name name);  

    上面是注解的形式。

  • 相关阅读:
    Vasya and Endless Credits CodeForces
    Dreamoon and Strings CodeForces
    Online Meeting CodeForces
    数塔取数 基础dp
    1001 数组中和等于K的数对 1090 3个数和为0
    1091 线段的重叠
    51nod 最小周长
    走格子 51nod
    1289 大鱼吃小鱼
    POJ 1979 Red and Black
  • 原文地址:https://www.cnblogs.com/wql025/p/5003927.html
Copyright © 2011-2022 走看看