本文内容来自尚硅谷
代码从MyBatis总结(十一)--增加一条数据时,如何获取自动设置主键的id值
获取非自增主键值两种方式
方式一:在执行insert语句前查询出序列
映射文件如下写法
<!--
获取非自增主键的值:
Oracle不支持自增;Oracle使用序列来模拟自增;
每次插入的数据的主键是从序列中拿到的值;如何获取到这个值;
-->
<insert id="addEmp" databaseId="oracle">
<!--
keyProperty:查出的主键值封装给javaBean的哪个属性
order="BEFORE":当前sql在插入sql之前运行
AFTER:当前sql在插入sql之后运行
resultType:查出的数据的返回值类型
-->
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
select EMPLOYEES_SEQ.nextval from dual
</selectKey>
insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL)
values(#{id},#{lastName},#{email<!-- ,jdbcType=NULL -->})
</insert>
说明一:databaseId=oracle:表示在oracle数据库时使用。此时在mybatis配置文件中已经配置了各个数据库厂商的别名
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
说明二:selectKey标签中order=before表示再执行insert语句前就先执行该查询语句,查询出下一个序列
说明三:keyProperty:查出的主键值封装给javaBean的哪个属性
获取到主键值
public void test03() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//1、获取到的SqlSession不会自动提交数据
SqlSession openSession = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
//测试添加
Employee employee = new Employee(null, "jerry4",null, "1");
mapper.addEmp(employee);
System.out.println(employee.getId());
openSession.commit();
}finally{
openSession.close();
}
}
方式二:在执行insert语句后再查询出序列
映射文件方式如下
<insert id="addEmp" databaseId="oracle">
<selectKey keyProperty="id" order="AFTER" resultType="Integer">
select EMPLOYEES_SEQ.currval from dual
</selectKey>
insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL)
values(employees_seq.nextval,#{lastName},#{email})
</insert>
说明一:这里的selectkey执行的查询语句与方式二不一样的放,order值为after,且获取的是当前序列值而不是nextval值
说明二:insert语句插入序列值,不再是#{id}而是直接employees_seq.nextval
这里建议使用方式一来获取非自增主键的值:因为在高并发的情况下,使用方式二很容易获取到的di值都是一样的
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: