mybatis获取insert操作自增主键值

发布时间 2023-12-19 17:30:15作者: Crazy_Joker

大家好,我是joker,希望你快乐。

在日常使用mybatis时,经常会遇到数据库表的主键是自增id的情况。数据库的表结构又设计成主子表的情况,在插入主表数据后,为了维护主子表关系,通常需要获取插入主表中的自增id。

代码示例

  1. mapper.xml

    <insert id="insertCity" parameterType="City" useGeneratedKeys="true"
                keyProperty="id">
            INSERT INTO `city` (`Name`, `CountryCode`, `District`, `Population`) VALUES (#{Name},#{CountryCode},#{District},#{Population})
    </insert>
    
  2. mapper.java

    public interface CityMapper {
        public int insertCity(City city);
    }
    
  3. serviceImpl.java

    @Service
    public class CityServiceImpl implements ICityService {
        @Autowired
        private CityMapper cityMapper;
    
        @Override
        public int insertCity(City city){
             int res = cityMapper.insertCity(city);
             System.out.println(city.getId());
             return res;
        }
    }
    

insert, update 和 delete属性说明

<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">

<update
  id="updateAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

<delete
  id="deleteAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

Insert, Update, Delete 元素相关属性说明

  • id

在命名空间中唯一的标识符,可以被用来引用这条语句。

  • parameterType

将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。

  • parameterMap

用于引用外部 parameterMap 的属性,目前已被废弃。请使用行内参数映射和 parameterType 属性。

  • flushCache

将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:(对 insert、update 和 delete 语句)true。

  • timeout

这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。

  • statementType

可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。

  • useGeneratedKeys

(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。

  • keyProperty

(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。

  • keyColumn

(仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。

  • databaseId

如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。

总结

到这里mybatis获取insert操作自增主键值就介绍完了,获取主键值的具体实现下一篇我们查看源码进行分析。