问题:最近遇到个问题insert操作我需要返回主键ID,该数据库对应表主键为自增

解决:


<insert id="insertSelective" parameterType="com.esint.model.OldPerson" useGeneratedKeys="true" keyProperty="colId">
insert into table.....
</insert>


 

int a=oldPersonMapper.insertSelective(oldPerson);
		try {
			if (a>0) {
				return oldPerson;
			}
		} catch (Exception e) {
			// TODO: handle exception
		}

 返回对象即可看到ID已得到。


一、 insert元素

其属性如下:

parameterType

keyColumn

keyProperty

useGeneratedKeys

statementType

flushCache

timeout

 

databaseId

二、一般的INSERT操作——返回值为插入的记录数目

mapper接口代码:

/**
 * 添加学生信息
 * @param student 学生实例
 * @return 成功操作的记录数目
 */
int add(EStudent student);

 mapper.xml:

 



<insert id="add" parameterType="EStudent">
  insert into TStudent(name, age) values(#{name}, #{age})
</insert



 三、执行INSERT操作后获取记录主键

mapper接口代码:



/**
 * 添加学生信息
 * @param student 学生实例
 * @return 成功操作的记录数目
 */
int add(EStudent student);



至于mapper.xml则分为两种情况了,一种是数据库(如MySQL,SQLServer)支持auto-generated key field,另一种是数据库(如Oracle)不支持auto-generated key field的。

 1. 数据库(如MySQL,SQLServer)支持auto-generated key field的情况

    手段①(推荐做法):



<insert id="add" parameterType="EStudent" useGeneratedKeys="true" keyProperty="id">
  insert into TStudent(name, age) values(#{name}, #{age})
</insert>



  手段②:



java mysql insert时返回自增id_java



<insert id="add" parameterType="EStudent">
  // 下面是SQLServer获取最近一次插入记录的主键值的方式
  <selectKey resultType="_long" keyProperty="id" order="AFTER">
    select @@IDENTITY as id
  </selectKey>
  insert into TStudent(name, age) values(#{name}, #{age})
</insert>



java mysql insert时返回自增id_java



  由于手段②获取主键的方式依赖数据库本身,因此推荐使用手段①。

 2. 数据库(如Oracle)不支持auto-generated key field的情况



java mysql insert时返回自增id_java



<insert id="add" parameterType="EStudent">
  <selectKey keyProperty="id" resultType="_long" order="BEFORE">
    select CAST(RANDOM * 100000 as INTEGER) a FROM SYSTEM.SYSDUMMY1
  </selectKey>
  insert into TStudent(id, name, age) values(#{id}, #{name}, #{age})
</insert



java mysql insert时返回自增id_java



  注意:mapper接口返回值依然是成功插入的记录数,但不同的是主键值已经赋值到领域模型实体的id中了。

 

五、 selectKey子元素

  作用:在insert元素和update元素中插入查询语句。

  其属性如下:

keyProperty

resultType

order属性

statementType

注意:selectKey操作会将操作查询结果赋值到insert元素的parameterType的入参实例下对应的属性中。并提供给insert语句使用

 

六、批量插入                                 

  方式1:



<insert id="add" parameterType="EStudent">
  <foreach collection="list" item="item" index="index" separator=";">
    INSERT INTO TStudent(name,age) VALUES(#{item.name}, #{item.age})
  </foreach>
</insert>



上述方式相当语句逐条INSERT语句执行,将出现如下问题:
1. mapper接口的add方法返回值将是最一条INSERT语句的操作成功的记录数目(就是0或1),而不是所有INSERT语句的操作成功的总记录数目
2. 当其中一条不成功时,不会进行整体回滚。

  方式2(仅限于MSSQL):



java mysql insert时返回自增id_java



<insert id="add" parameterType="EStudent">
  WITH R AS
  <foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
    SELECT #{item.name} as a, #{item.age} as b
  </foreach>
  INSERT INTO TStudent(name,age) SELECT a, b FROM R
</insert>



java mysql insert时返回自增id_java



上述方式解决了方式1中的问题。但该方式仅限于MSSQL

  方式3(通用解决方法):



INSERT INTO TStudent(name,age) 
  <foreach collection="list" item="item" index="index" open="(" close=")" separator="union all">
    SELECT #{item.name} as a, #{item.age} as b
  </foreach>



 

该方式与方式2效果一样,而且不仅限于MSSQL