1、Mybatis
Mybatis提供了几种获取自动生成的主键值的方式:
1. 使用<selectKey>元素:可以在插入语句执行后,通过<selectKey>元素来获取自动生成的主键值。例如:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (username, password) VALUES (#{username}, #{password})
</insert>
在上面的例子中,useGeneratedKeys属性设置为true表示开启自动生成主键值的功能,keyProperty属性指定了主键值将被设置到哪个属性中。
2. 使用<selectKey>元素的order属性:可以通过order属性来指定获取主键值的顺序。例如:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
<selectKey keyProperty="id" order="AFTER" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user (username, password) VALUES (#{username}, #{password})
</insert>
在上面的例子中,order属性设置为AFTER表示在插入语句执行后获取主键值。
3. 使用<selectKey>元素的statementType属性:可以通过statementType属性来指定获取主键值的方式。例如:
<insert id="insertUser" parameterType="User">
<selectKey keyProperty="id" statementType="PREPARED" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user (username, password) VALUES (#{username}, #{password})
</insert>
在上面的例子中,statementType属性设置为PREPARED表示使用预编译语句来获取主键值。
4. 使用<selectKey>元素的order属性和statementType属性的组合:可以通过order属性和statementType属性的组合来灵活地获取主键值。例如:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
<selectKey keyProperty="id" order="AFTER" statementType="PREPARED" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user (username, password) VALUES (#{username}, #{password})
</insert>
在上面的例子中,order属性设置为AFTER表示在插入语句执行后获取主键值,statementType属性设置为PREPARED表示使用预编译语句来获取主键值。
5.在<insert>标签中使用 useGeneratedKeys 和 keyProperty 两个属性来获取自动生成的主键值。
例如:
<insert id="insertname" usegeneratedkeys="true" keyproperty="id">
insert into names (name) values (#{name})
</insert>
业务层使用
int rows = userMapper.insertUser(user);
//执行完毕后,id已经被设置到对象中
System.out.println(user.getId()); // 会输出自动生成的id
总结起来,使用<selectKey>元素是获取自动生成的主键值的常用方式,可以根据具体情况选择不同的属性来实现不同的获取方式。
2、Mybatis-plus
如果使用Mybatis-Plus的话,获取自动生成的主键值的方式如下:
1. 使用实体对象的getId()方法:在插入数据后,通过实体对象的getId()方法获取自动生成的主键值。例如:
User user = new User();
user.setUsername("test");
user.setPassword("123456");
userMapper.insert(user);
Long id = user.getId();
在上面的例子中,userMapper.insert(user)会将数据插入数据库,并自动生成主键值,然后通过user.getId()方法获取该主键值。
2. 使用实体对象的自增主键注解:在实体对象的主键字段上添加@TableId(type = IdType.AUTO)注解,可以指定主键为自增类型。例如:
public class User {
@TableId(type = IdType.AUTO)
private Long id;
// other fields and methods
}
在上面的例子中,@TableId(type = IdType.AUTO)注解指定了主键为自增类型。在插入数据后,通过实体对象的getId()方法获取自动生成的主键值。
3. 使用KeyGenerator类:可以通过KeyGenerator类来获取自动生成的主键值。例如:
User user = new User();
user.setUsername("test");
user.setPassword("123456");
userMapper.insert(user);
KeyGenerator keyGenerator = Jdbc3KeyGenerator.INSTANCE;
Object id = keyGenerator.execute(userMapper);
在上面的例子中,userMapper.insert(user)会将数据插入数据库,并自动生成主键值。然后通过KeyGenerator类的execute()方法获取该主键值。
总结起来,Mybatis-Plus提供了多种方式来获取自动生成的主键值,可以根据具体情况选择适合的方式来实现。