很多时候,我们插入一条数据之后需要获得他的主键值,在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>

 

 

Logo

更多推荐