在很多业务下,对User表新增一条数据后,往往还要以该数据对其他关联的表格做操作,所以拿到该条数据的主键尤为关键。
以下记录 对Mysal和Oracle中的 User表新增一条数据,并获取该条数据的主键
entity
package com.mybatis.bean;
//User表的实体类
public class User {
//成员变量属性名 建议和 数据库字段保持一致
private Integer id;
private String name;
private Integer money;
private String sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getMoney() {
return money;
}
public void setMoney(Integer money) {
this.money = money;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
main 方法
public static void main(String[] args) throws IOException {
String resource = "mybatis_config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User u =new User();
u.setMoney(1000);
u.setName("小笨");
u.setSex("man");
mapper.save(u); //新增数据
session.commit();
// 新增数据 完成之后,获取主键id值
System.out.println("主键:"+u.getId());
}
DAO持久层
public interface UserMapper {
/**
新增方法
*/
public void save(User u);
}
UserMapper.xml 配置
1.mysql配置
因为mysql的主键id字段设置了主键自增,所以sql指令中没有插入id值,mysql数据库会自动分配值
代码关键:useGeneratedKeys="true" keyProperty="id" 。
<!-- 新增方法 public void save(User u)
useGeneratedKeys="true" : 告诉mybatis使用主键自增 生成策略
keyProperty="id" :将获取到的主键值 封装到com.mybatis.bean.User (入参对象)的 id字段中
-->
<insert id="save" parameterType="com.mybatis.bean.User" databaseId="mysql" useGeneratedKeys="true" keyProperty="id">
<!-- mybatis 支持主键只增,主键的值使用的是原生的jdbc方法 getGeneratedKey -->
INSERT INTO user(name,money,sex) VALUES(#{name},#{money},#{sex})
</insert>
2.oracle 配置
oracle数据库 不支持主键自增,只能借助序列来模拟自增,
每次插入数据的主键值是从序列中拿到的值,如何获取到这个值?
在执行 insert 指令之前 ,先查询 序列的下一个值(selectKey),并将值封装给User对象的id字段,
这样在执行insert指令式,就可以直接从User对象中获取id字段。
<insert id="save" parameterType="com.mybatis.bean.User" databaseId="oracle">
<selectKey keyProperty="id" order="BEFORE" resultType="_int">
<!-- keyProperty=id : 将查询出来的值封装到 User对象的id字段中
order="BEFORE" : 在执行insert插入数据之前---先执行该指令
resultType="_int" :数据返回值类型
-->
<!-- 编写SQL指令,查询序列的下一个值 作为插入 数据的主键 -->
select seq_USERTEMP_id.nextval from dual
</selectKey>
INSERT INTO userTemp(id,name,money,sex) VALUES(#{id},#{name},#{money},#{sex})
</insert>