@SelectKey(statement = "select last_insert_id()", keyProperty = "id", before = false, resultType = int.class)含义
时间: 2024-04-27 18:25:27 浏览: 213
@SelectKey注解是MyBatis中的一个注解,主要用于在插入数据时获取自增长的主键值。该注解可以配置在@Insert或@InsertProvider注解上,其中statement属性指定获取主键值的SQL语句,keyProperty属性指定主键值赋值给对象的哪个属性,before属性指定SQL语句的执行时间(true表示在SQL执行前执行,false表示在SQL执行后执行),resultType属性指定主键值的类型。
在你的代码中,@SelectKey注解的含义是在插入数据后,通过执行"select last_insert_id()"语句获取自增长的主键值,并将其赋值给MediaFile对象的id属性,id属性类型为int。before属性为false,表示SQL执行后执行。resultType属性为int.class,表示主键值的类型为int。
当插入数据后,@SelectKey注解会自动执行指定的SQL语句获取主键值,然后将其赋值给MediaFile对象的id属性。因此,你可以通过调用insertAndGetId方法插入数据并获取自增长的主键值。
相关问题
@Insert("insert into media_file(name, type, url) values (#{fileName}, #{fileType}, #{fileUrl})") @SelectKey(statement = "select last_insert_id()", keyProperty = "id", before = false, resultType = int.class) int insertAndGetId(MediaFile mediaFile);,表中的id类型是int(20),插入操作是成功的,但是每次返回id都是1,这是为什么
根据你提供的信息,每次插入数据后都返回1的问题可能是由于数据库返回的last_insert_id()类型与你的id字段类型不一致导致的。int(20)类型的id字段最大值是2147483647,而last_insert_id()返回的类型是unsigned bigint,最大值是18446744073709551615,超过了int类型的最大值,因此可能导致类型转换错误,返回的始终是1。
为了解决这个问题,你可以将MediaFile实体类中的id字段类型改为Long类型,同时修改@SelectKey注解的resultType属性为java.lang.Long,即:
```
@Insert("insert into media_file(name, type, url) values (#{fileName}, #{fileType}, #{fileUrl})")
@SelectKey(statement = "select last_insert_id()", keyProperty = "id", before = false, resultType = java.lang.Long.class)
int insertAndGetId(MediaFile mediaFile);
```
另外,你也可以将id字段的类型修改为bigint,以适配last_insert_id()返回的unsigned bigint类型。
请写出@Mapper public interface UsersMapper { @Select("select * from users") List<Users> findAll(); @Insert("insert into users(name,salary) values(#{name},#{salary})") @Delete("DELETE FROM users WHERE id = #{id}") @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = Integer.class) void insert(Users users); } 的相应的XML文件
以下是对应的XML文件:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UsersMapper">
<resultMap id="userResultMap" type="com.example.model.Users">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="salary" column="salary" />
</resultMap>
<select id="findAll" resultMap="userResultMap">
select * from users
</select>
<insert id="insert">
insert into users(name, salary) values(#{name}, #{salary})
<selectKey statement="SELECT LAST_INSERT_ID()" keyProperty="id" order="AFTER" resultType="java.lang.Integer"/>
</insert>
<delete id="deleteById">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
```
其中,`resultMap` 定义了查询结果映射到 Java 对象的方式,`select` 定义了查询语句,`insert` 定义了插入语句,`selectKey` 用于获取插入数据后自动生成的 ID,`delete` 定义了删除语句。这些语句的 ID 对应了 Java 接口中定义的方法名,MyBatis 会自动将其绑定起来。
阅读全文