介绍
当我们准备向两张有关联的表中(父、子)插入完整数据时,就需要在第一次插入父表数据后获取自增id,之后在子表中关联此id
返回的自增id会设置为原对象的id,也就是插入之前用户id为null或者0,插入之后该用户的id为自增id
注解方式
说明
@SelectKey(keyProperty = "id"//对应要返回的实体属性
,keyColumn = "id"//对应数据库中的自增列名称
,before = false//在更新语句执行之前返回还是之后返回
,resultType = Integer.class//和id类型相匹配
,statement = "select last_insert_id()")//查询插入后的自增id
还有一个属性为 statementType,默认值为StatementType.PREPARED
也就是预编译PreparedStatement
使用
UserDao
@Insert("insert into user values(null,#{username},#{password})")
@SelectKey(keyProperty = "id",keyColumn = "id",before = false,resultType = Integer.class,statement = "select last_insert_id()")
int addUserTest(User user);
@Select("select * from user")
List<User> getUsers();
测试类
@Test
public void testSelectUser(){
List<User> user = userDao.getUsers();
System.out.println("lastUser = " + user);//数据库中上一个用户
User user1=new User();
user1.setUsername("小明");
user1.setPassword("123456");
System.out.println("userBeforeInsert = " + user1);//插入之前的用户
userDao.addUserTest(user1);
System.out.println("userAfterInsert = " + user1);//插入之后的用户
}
为了便于结果比较,数据库在插入之前只有一条数据
xml方式
说明
useGeneratedKeys 只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回至原对象。
使用
UserDao
int addUserTest(User user);
@Select("select * from user")
List<User> getUsers();
UserDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--引入DTD约束-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ahy.dao.UserDao">
<insert id="addUserTest" useGeneratedKeys="true" keyProperty="id" parameterType="com.ahy.pojo.User">
insert into user values(null,#{username},#{password})
</insert>
</mapper>
测试结果