Mybatis返回自增主键

本文详细介绍了在MyBatis中如何使用XML和注解方式来处理主键自增的情况。无论是XML还是注解,都有两种场景:返回自增主键和返回非自增主键。在返回自增主键时,通过`useGeneratedKeys=true`和`keyProperty`属性配合JDBC的`getGeneratedKeys`方法获取。而返回非自增主键则使用`<selectKey>`标签或者`@SelectKey`注解,结合数据库特定操作获取主键值。

对于表的主键自动生成的 insert语句 , 在不需要返回自增主键时 , 就和普通的insert语句没有区别 , 在需要的返回的时候 , 情况稍微有点不一样 , 故在此记录一下 . 在MyBatis中 ,  有两种方式编写SQL , 一种XML方式 , 一种是注解方式 . 首先在MYSQL中新建一张表 , 建表语句如下
 

 在使用主键自增的时候 ,  插入数据库后可能需要得到自增的主键值 , 然后使用这个值进行一些其他的操作 . 有些数据库提供主键自增(MYSQL , SQLSERVER) , 有些不提供(ORACLE) , 而是使用序列得到一个值 , 然后将这个值赋给 id , 再讲数据插入.

 

1. XML方式

    1.1 返回自增主键

<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">/* useGeneratedKeys="true"*/
        insert into t_user(userName,password) values(#{userName},#{password})
    </insert>

使用useGeneratedKeys设置为true后 , MyBatis会使用JDBC的getGeneratedKeys方法取出由数据库内部生成的主键 . 获得主键值之后将其赋给keyProperty配置的 id 属性 . 当需要设置多个属性时 , 使用逗号隔开 , 这种情况下 还需要配置 keyColumn属性 , 按顺序指定数据库的列 , 这里列的值会和 keyProperty 配置的属性一一对应 . 由于要使用数据库返回的主键值 , 所以SQL上下两部分的列中去掉了 id 列和对于的 #{id} 属性

1.2 返回非自增主键

    采用 <selectKey>标签获取主键的值 , 这种方式对提供和不提供主键自增功能的数据库同样适用

<insert id="addUser" parameterType="User">/* useGeneratedKeys="true"*/
        <selectKey order="AFTER" keyProperty="id" resultType="Integer" >
            select LAST_INSERT_ID()
        </selectKey>
        insert into t_user(userName,password) values(#{userName},#{password})
    </insert>

selectKey标签的 keyColumn,keyProperty和上面useGeneratedKeys的用法和含义一样 , 这里的resultType用于设置返回值类型. order 属性和数据库相关 , 在MYSQL 中 , order是AFTER , 因为当前及记录的主键值在insert语句执行成功之后才能拿到 , 而在ORACLE中 ,oder是BEFORE , 因为ORACLE需要先从序列取到值 , 再将其作为主键插入到数据库
 

 

2. 注解方式

 2.1 返回自增主键

 

@Insert("insert into sys_user(user_name,password,email,info,create_time)"
			+"values(#{userName},#{password},#{email},#{info},#{createTime})")
	@Options(keyColumn="id",keyProperty="id",useGeneratedKeys=true)
	int insert(SysUser user);

 insert方法上除了 @Insert 注解之外 , 多了一个 @Option 注解 , 在这个注解上配置了useGeneratedKeys 和 keyProperty属性, 用法和 XML 的方式一样 , 当需要配置多个列的时候 , 这个注解也提供了 keyColumn 属性 , 可以像XML中那样配置使用 . 
 

 2.2 返回非自增

@Insert("insert into sys_user(user_name,password,email,info,create_time)"
			+"values(#{userName},#{password},#{email},#{info},#{createTime})")
	@SelectKey(statement="SELECT LAST_INSERT_ID()",
			   keyProperty="id",
			   resultType=Integer.class,
			   before = false)
	int insert(SysUser user);

和XML的方式对比  , 只是XML中的order属性换成了 before属性 , before = true时 , 功能和order = before一样 , before = false时, 功能和order = after一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值