• insert, update 和 delete

    insert, update 和 delete

    数据变更语句 insert,update 和 delete 的实现非常接近:

    1. <insert
    2. id="insertAuthor"
    3. parameterType="domain.blog.Author"
    4. flushCache="true"
    5. statementType="PREPARED"
    6. keyProperty=""
    7. keyColumn=""
    8. useGeneratedKeys=""
    9. timeout="20">
    10.  
    11. <update
    12. id="updateAuthor"
    13. parameterType="domain.blog.Author"
    14. flushCache="true"
    15. statementType="PREPARED"
    16. timeout="20">
    17.  
    18. <delete
    19. id="deleteAuthor"
    20. parameterType="domain.blog.Author"
    21. flushCache="true"
    22. statementType="PREPARED"
    23. timeout="20">
    Insert, Update, Delete 元素的属性
    属性描述
    id命名空间中的唯一标识符,可被用来代表这条语句。
    parameterType 将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器推断出具体传入语句的参数,默认值为未设置(unset)。
    parameterMap这是引用外部 parameterMap 的已经被废弃的方法。请使用内联参数映射和 parameterType 属性。
    flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:true(对于 insert、update 和 delete 语句)。
    timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖驱动)。
    statementType STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
    useGeneratedKeys (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
    keyProperty (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认值:未设置(unset)。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    keyColumn (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望使用多个生成的列,也可以设置为逗号分隔的属性名称列表。
    databaseId 如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。

    下面就是 insert,update 和 delete 语句的示例:

    1. <insert id="insertAuthor">
    2. insert into Author (id,username,password,email,bio)
    3. values (#{id},#{username},#{password},#{email},#{bio})
    4. </insert>
    5.  
    6. <update id="updateAuthor">
    7. update Author set
    8. username = #{username},
    9. password = #{password},
    10. email = #{email},
    11. bio = #{bio}
    12. where id = #{id}
    13. </update>
    14.  
    15. <delete id="deleteAuthor">
    16. delete from Author where id = #{id}
    17. </delete>

    如前所述,插入语句的配置规则更加丰富,在插入语句里面有一些额外的属性和子元素用来处理主键的生成,而且有多种生成方式。

    首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标属性上就 OK 了。例如,如果上面的 Author 表已经对 id 使用了自动生成的列类型,那么语句可以修改为:

    1. <insert id="insertAuthor" useGeneratedKeys="true"
    2. keyProperty="id">
    3. insert into Author (username,password,email,bio)
    4. values (#{username},#{password},#{email},#{bio})
    5. </insert>

    如果你的数据库还支持多行插入, 你也可以传入一个 Author 数组或集合,并返回自动生成的主键。

    1. <insert id="insertAuthor" useGeneratedKeys="true"
    2. keyProperty="id">
    3. insert into Author (username, password, email, bio) values
    4. <foreach item="item" collection="list" separator=",">
    5. (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
    6. </foreach>
    7. </insert>

    对于不支持自动生成类型的数据库或可能不支持自动生成主键的 JDBC 驱动,MyBatis 有另外一种方法来生成主键。

    这里有一个简单(甚至很傻)的示例,它可以生成一个随机 ID(你最好不要这么做,但这里展示了 MyBatis 处理问题的灵活性及其所关心的广度):

    1. <insert id="insertAuthor">
    2. <selectKey keyProperty="id" resultType="int" order="BEFORE">
    3. select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
    4. </selectKey>
    5. insert into Author
    6. (id, username, password, email,bio, favourite_section)
    7. values
    8. (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
    9. </insert>

    在上面的示例中,selectKey 元素中的语句将会首先运行,Author 的 id 会被设置,然后插入语句会被调用。这可以提供给你一个与数据库中自动生成主键类似的行为,同时保持了 Java 代码的简洁。

    selectKey 元素描述如下:

    1. <selectKey
    2. keyProperty="id"
    3. resultType="int"
    4. order="BEFORE"
    5. statementType="PREPARED">
    selectKey 元素的属性
    属性描述
    keyProperty selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    keyColumn 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    resultType 结果的类型。MyBatis 通常可以推断出来,但是为了更加精确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
    order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先生成主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。
    statementType 与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。