很多时候,我们插入一条数据之后需要获得他的主键值,在mybatis中我们该咋整呢???接下来分两种情况,一种是自增主键值,例如我们的mysql数据库;一种是非自增主键值,例如orcale数据库,他是使用的序列来模拟自增。接下来我们按照这两种情况说明一下我们该如何获取主键值。
自增主键值的获取
自增主键值的获取是比较简单的,在使用原生JDBC的时候我们可以使用statement.getGenreatedKeys()方法获取自增主键,在mybatis中我们同样可以使用该方法来获得自增主键。
我们需要在insert标签中配置如下两个属性:
useGeneratedKeys :使用自增主键获取主键值策略
keyProperty:指定对应的主键属性。意思就是获取到主键值之后,将这个值封装给been的某个属性
<insert id="insert" parameterType="cc_study.pojo.Employee"
useGeneratedKeys="true" keyProperty="id">
insert into employee (name,email,gender) values(#{name},#{email},#{gender})
</insert>
配置成功之后,我们测试的时候就可以直接获取主键值了。
@Test
public void testCURD() throws IOException {
String resource = "mybatis_config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
SqlSession openSession = sqlSessionFactory.openSession(true);
try {
EmployeeMapper employeeMapper = openSession
.getMapper(EmployeeMapper.class);
Employee employee = new Employee(null, "Tom", "1", "456@163.com");
employeeMapper.insert(employee);
System.out.println(employee.getId());
} catch (Exception e) {
e.printStackTrace();
} finally {
openSession.close();
}
}
非自增主键值的获取
Orcale数据库是不支持自增的;使用序列来模拟自增。我们在插入的时候,主键都是从序列中获取的。
下面贴一个示例,注释写在代码里面;我们要稍微注意一下他的运行顺序
before的运行顺序:
先运行selectKey查询id的sql;查出主键值封装给been中的id
在运行插入的sql,就可以取出id属性对应 的值
<insert id="insert" databaseId="orcale">
<!--
keyProperty:指定对应的主键属性
order="BEFORE":当前sql在插入sql之前运行
resultType:查出数据的返回类型
-->
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
<!-- 编写查询主键的sql,当前序列的下一个值 -->
select EMPLOYEES_SEQ.nextval from dual
</selectKey>
<!-- 插入时候的主键是从序列中那到的 -->
insert into employee (id,name,email,gender) values(#{id},#{name},#{email},#{gender})
</insert>
既然有在插入语句之前找主键,那肯定也有在插入语句之后找主键,注意下面代码和上面代码的区别。
after的运行顺序:
先运行插入的sql(从序列中取值作为新的id)
在运行selectKey查询id的sql(序列的当前值,不是下一个值了!!)
<insert id="insert" databaseId="orcale">
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
<!-- 序列的当前值 -->
select EMPLOYEES_SEQ.currval from dual
</selectKey>
<!-- 插入时候的主键是从序列中那到的 employees_seq.nextval -->
insert into employee (id,name,email,gender) values(employees_seq.nextval,#{name},#{email},#{gender})
</insert>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16879.html