MyBatis返回主键Id, MyBatis 插入数据返回主键Id

         MyBatis返回主键Id, MyBatis 插入数据返回主键Id

 

一、业务场景

1、如用户表User添加一个新用户后,同时需要添加子表user_files,记录用户上传的多个附件。而 user表id是user_files表的外键。

2、假设User表id是由数据库自增的,在使用MyBatis 完成向User表插入数据后,需要将id返回回来,在MyBatis中如何配置呢?

二、数据库支持生成主键

1、如: MySQL 和 SQL Server

2、MyBatis DAO xml 如下:

<insert id="insert"	useGeneratedKeys="true" keyProperty="id" keyColumn="id">
	INSERT INTO user (username,password)
 	VALUES (#{username},#{password})
</insert>

三、数据库不支持生成主键

1、针对数据库不支持生成主键或不使用数据库生成的主键

2、MyBatis DAO xml 如下:

<insert id="insert"	useGeneratedKeys="true" keyProperty="id" keyColumn="id">
	 <selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE">
		 SELECT UUID() FROM DUAL 
	 </selectKey>
	INSERT INTO user (id , username,password)
  	VALUES (#{id} , #{username},#{password})
</insert>

3、selectKey 元素的属性理解:

属性

描述

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

四、MyBatis多行批量插入数据

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

参考资料:MyBatis 官方文档

发布了156 篇原创文章 · 获赞 159 · 访问量 49万+

猜你喜欢

转载自blog.csdn.net/HaHa_Sir/article/details/100188476