教程 > mybatis 中文教程 > 阅读:54

mybatis insert, update 和 delete——迹忆客-ag捕鱼王app官网

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




insert, update, delete 元素的属性

属性 描述
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
parametertype 将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 mybatis 可以通过类型处理器(typehandler)推断出具体传入语句的参数,默认值为未设置(unset)。
parametermap 用于引用外部 parametermap 的属性,目前已被废弃。请使用行内参数映射和 parametertype 属性。
flushcache 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:(对 insert、update 和 delete 语句)true。
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 语句的示例:


  insert into author (id,username,password,email,bio)
  values (#{id},#{username},#{password},#{email},#{bio})


  update author set
    username = #{username},
    password = #{password},
    email = #{email},
    bio = #{bio}
  where id = #{id}


  delete from author where id = #{id}

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

首先,如果你的数据库支持自动生成主键的字段(比如 mysql 和 sql server),那么你可以设置 usegeneratedkeys=”true”,然后再把 keyproperty 设置为目标属性就 ok 了。例如,如果上面的 author 表已经在 id 列上使用了自动生成,那么语句可以修改为:


  insert into author (username,password,email,bio)
  values (#{username},#{password},#{email},#{bio})

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


  insert into author (username, password, email, bio) values
  
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  

对于不支持自动生成主键列的数据库和可能不支持自动生成主键的 jdbc 驱动,mybatis 有另外一种方法来生成主键。

这里有一个简单(也很傻)的示例,它可以生成一个随机 id(不建议实际使用,这里只是为了展示 mybatis 处理问题的灵活性和宽容度):


  
    select cast(random()*1000000 as integer) a from sysibm.sysdummy1
  
  insert into author
    (id, username, password, email,bio, favourite_section)
  values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouritesection,jdbctype=varchar})

在上面的示例中,首先会运行 selectkey 元素中的语句,并设置 author 的 id,然后才会调用插入语句。这样就实现了数据库自动生成主键类似的行为,同时保持了 java 代码的简洁。

selectkey 元素描述如下:


selectkey 元素的属性

属性 描述
keyproperty selectkey 语句结果应该被设置到的目标属性。如果生成列不止一个,可以用逗号分隔多个属性名称。
keycolumn 返回结果集中生成列属性的列名。如果生成列不止一个,可以用逗号分隔多个属性名称。
resulttype 结果的类型。通常 mybatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。mybatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 object 或 map。
order 可以设置为 before 或 after。如果设置为 before,那么它首先会生成主键,设置 keyproperty 再执行插入语句。如果设置为 after,那么先执行插入语句,然后是 selectkey 中的语句 - 这和 oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。
statementtype 和前面一样,mybatis 支持 statement,prepared 和 callable 类型的映射语句,分别代表 statement, preparedstatement 和 callablestatement 类型。

sql

这个元素可以用来定义可重用的 sql 代码片段,以便在其它语句中使用。 参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。比如:

 ${alias}.id,${alias}.username,${alias}.password 

这个 sql 片段可以在其它语句中使用,例如:


也可以在 include 元素的 refid 属性或内部语句中使用属性值,例如:


  ${prefix}table


  from
    

查看笔记

扫码一下
查看教程更方便
网站地图