spring+mybatis useGeneratedKeys返回主键

在数据库操作中,当我们插入数据时往往需要当前插入数据的主键id,初学时比较笨,在插入之后再做一遍查询来获取id,这样会出现很多的问题。其实java提供了useGeneratedKeys方法,可以直接返回id,直接上代码:

正常插入语句是这样的

 

<insert id="addTeacher" parameterType="com.kk.demo.bean.Teacher">
       insert into teacher(tsex,tbirth) values(#{tsex},#{tbirth})
 </insert>

使用MySql和SQL server,我们只需要返回id时只需要加入useGeneratedKeys 和keyProperty即可,因为这两个数据库支持auto-generated key field(即自增主键)

 

<insert id="addTeacher" useGeneratedKeys="true" keyProperty="tid" parameterType="com.kk.demo.bean.Teacher">
      insert into teacher(tsex,tbirth) values(#{tsex},#{tbirth})
</insert> 

useGeneratedKeys:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。MySql和SQLServer执行auto-generated key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了

keyProperty:用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中,tid 是表中的自增主键

 

问题:getId返回值为空

问题代码:

 

 //DAO
 long add(@Param("item") Item item);

//mapper.xml
<insert id="add" useGeneratedKeys="true" keyProperty="itemId">
    insert into item(item_price,item_sales) VALUES (#{itemPrice},#{itemSales})
</insert>

使用useGeneratedKeys生成主键时,不能在DAO层使用@Param注解传递参数,否则无法获取主键

注意:不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。

正确代码:

//DAO
long add(Item item);

//mapper.xml
<insert id="add" useGeneratedKeys="true" keyProperty="itemId" parameterType="com.kk.springboot.bean.Item">
    insert into item(item_price,item_sales) VALUES (#{itemPrice},#{itemSales})
</insert>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章