1 支持自增主键的数据库
比如MySQL就支持自增主键
<!--
parameterType: 指定查询参数类型,已经配置了别名,所以可以直接使用别名,而不需要全类名
useGeneratedKeys: 使用自增主键获取策略
keyProperty: 指定主键对应的java实体属性
-->
<insert id="insert" parameterType="tbUser" useGeneratedKeys="true" keyProperty="id">
insert into
tb_user(`username`, `password`, `phone`,`create_time`,`update_time`)
values (#{username},#{password},#{phone},now(),now())
</insert>
@Test
public void testInsert() throws IOException {
String resource = "mybatis-config.xml";
// 1 加载配置文件
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
// 2 构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 3 获取session, 设置自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 4 获取mapper接口的代理对象
TbUserMapper tbUserMapper = sqlSession.getMapper(TbUserMapper.class);
// 插入
TbUser insert = new TbUser();
insert.setUsername("t-mac");
insert.setPassword("123456");
insert.setPhone("13011112222");
Integer row = tbUserMapper.insert(insert);
System.out.println("row======>" + row);
// 获取新数据的主键
System.out.println("新数据的主键: " + insert.getId());
}
2 不支持自增主键的数据库
使用selectKey
标签:官网介绍
比如Oracle:
- 不支持自增;Oracle使用序列来模拟自增;
- 每次插入的数据的主键是从序列中拿到的值;如何获取到这个值;
# 1 获取用户的序列
select * from user_sequences
select tb_user_seq.nextval from dual;
<insert id="insert" databaseId="oracle">
<!--
keyProperty:查出的主键值封装给javaBean的哪个属性
order="BEFORE":当前sql在插入sql之前运行
AFTER:当前sql在插入sql之后运行
resultType:查出的数据的返回值类型
BEFORE运行顺序:
先运行selectKey查询id的sql;查出id值封装给javaBean的id属性
在运行插入的sql;就可以取出id属性对应的值
AFTER运行顺序:
先运行插入的sql(从序列中取出新值作为id);
再运行selectKey查询id的sql;
-->
<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
<!-- 编写查询主键的sql语句 -->
<!-- BEFORE-->
select tb_user_seq.nextval from dual
<!-- AFTER:
select EMPLOYEES_SEQ.currval from dual -->
</selectKey>
<!-- 插入时的主键是从序列中拿到的 -->
<!-- BEFORE:-->
insert into
tb_user(`id`,`username`, `password`, `phone`,`create_time`,`update_time`)
values (#{id }#{username},#{password},#{phone},now(),now())
</insert>