在做oracle开发时候经常会遇见主键自增问题,oralce可以了使用序列方式实现主键自增也可以使用uuid方式。
我选择后者,但是今天做项目时候用mybatise想获取插入记录的UUID主键,研究了半天看了官方文档才明白怎么办。
我使用oralce的sys_guid()函数来获取UUID。感觉这种方式对代码侵入少,不用在java中再做处理了。
MyBatise中有一个叫做selectKey的标签,主要是用于获取主键的。
这个标签中主要的属性是
写道
keyProperty selectKey 语句结果应该被设置的目标属性。 Can be a comma separated list of property names if multiple generated columns are expected.
resultType 结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。 MyBatis 允许任何简单类型用作主键的类型,包括字符串。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那 么它会首先选择主键, 设置 keyProperty 然后执行插入语句。 如果 设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素- 这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
statementType 和前面的相 同,MyBatis 支持 STA TEMENT ,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。
resultType 结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。 MyBatis 允许任何简单类型用作主键的类型,包括字符串。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那 么它会首先选择主键, 设置 keyProperty 然后执行插入语句。 如果 设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素- 这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
statementType 和前面的相 同,MyBatis 支持 STA TEMENT ,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。
其中主要是order这个属性由于我是先利用oralce的函数生成UUID,所以要选择before。
我的配置是这样的
<insert id="insert" parameterType="com.wangxiaowei.jqueryui.system.vo.TSystemDepartment"> <selectKey keyProperty="id" resultType="String" order="BEFORE"> select sys_guid() from dual </selectKey> insert into T_SYSTEM_DEPARTMENT (ID,DEPNAME, SUPERID, SORT, STATE) values ( #{id,jdbcType=VARCHAR},#{depname,jdbcType=VARCHAR}, #{superid,jdbcType=DECIMAL}, #{sort,jdbcType=DECIMAL}, #{state,jdbcType=DECIMAL}) </insert>
selectkey中先获取UUID值,通过keyProperty属性告诉mybatise把这个UUID值赋予实体对象的哪个属性。这样生成的insert语句中就已经有UUID的主键值了。
Mybatise会自动在你传入insert方法的参数实体的ID属性的值变成主键值。
测试用例
@Test public void addDepartment(){ TSystemDepartment systemDepartment = new TSystemDepartment(); systemDepartment.setDepname("部门测试1"); systemDepartment.setSort(1); systemDepartment.setState(1); systemDepartment.setSuperid(0); Integer id = systemDepartmentMapper.insert(systemDepartment); System.out.println(systemDepartment.getId()); //输出的值就是数据库中生成的UUID值了。NB。 Assert.assertSame(id, 1); }