一、selectKey标签作用
该标签是用来定义insert、update中主键生成的策略,在执行insert或update操作的之前或之后生成自定义主键。
二、selectKey标签属性
序号 | 属性名 | 说明 |
1 | |
该查询返回主键的类型(一般是Integer或String) |
2 | |
接收返回主键的属性名 |
3 | |
在update、insert操作之后或之后,取值为BEFORE、AFTER |
4 | |
|
三、案例
插入一条新数据,并且该数据的ID使用随机获取。
映射文件:
<insert id="insert" parameterType="com.my.entity.Person" keyProperty="id" useGeneratedKeys="true">
<!-- 随机产生ID -->
<selectKey keyProperty="id" order="BEFORE" resultType="int">
select round(RAND()*1000000)
</selectKey>
insert into person(id,name,sex,telephone,address,age) values(#{id},#{name},#{sex},#{telephone},#{address},#{age})
</insert>
说明:selectKey标签需要写在insert、update的标签内,通过一个查询,把返回结果作为主键。
测试类:
public class MybatisTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException {
String resource = "mybatis-config.xml";
//1.使用mybatis的工具读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//2.创建sqlSessionFactory
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
inputStream.close();
}
/**
* 测试selectKey
*/
@Test
public void testSelectKey() {
//3.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.获取mapper接口实现类
PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
//5.调用方法
Person person = new Person();
person.setName("xuye");
person.setAge(20);
person.setTelephone("123465789");
person.setSex("女");
person.setAddress("美国");
personMapper.insert(person);
System.out.println(person.getId());
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
}
}
说明:最后输出结果主键是一个随机数。
三、补充说明
selectKey通过编写SQL然后把返回的结果作为主键,如Mybatis会自动产生主键,所以用自增主键的话则不需要设置,如果其它的数据库需要自定义主键,则可以通过该标签进行设置。