首页 > 其他分享 >mybatis自增主键配置

mybatis自增主键配置

时间:2023-05-16 13:06:20浏览次数:31  
标签:自增 id ID 插入 user mybatis 主键


[url]http://leeyee.github.io/blog/2013/08/22/mybatis-auto-increment-primary-key/[/url]

mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。

[size=x-large][color=red][b]不返回自增主键值[/b][/color][/size]
如果考虑到插入数据的主键不作为其他表插入数据的外键使用,那么可以考虑使用这种方式。

Oracle Sequence 配置

<sql id='TABLE_NAME'>TEST_USER</sql>
 <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
 <!-- 注意这里直接调用sequence的nextval函数 -->
 <insert id="insert" parameterType="User">
     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
         values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )
 </insert>


当插入语句如上配置时,那么针对如下语句


User user = new User();
 user.setName("test");
 user.setAge(24);
 userMapper.insert(user);
 System.out.println(user.id); // user.id 为空


user.id为空,也就是说如上的配置并不能在完成插入操作后将插入时的主键值存放到保存的对象中。



Mysql自增主键配置



由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。


<sql id='TABLE_NAME'>TEST_USER</sql>
 <!-- 注意这里的插入SQL中是没有指明ID字段的! -->
 <insert id="insert" parameterType="User">
     insert into <include refid="TABLE_NAME" /> (NAME,AGE)
         values (#{name}, #{age} )
 </insert>


同样,针对Mysql如此配置mybaits,插入完成后user.id为空。



[size=x-large][color=red][b]插入后获取自增主键值[/b][/color][/size]


上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。



Oracle Sequence 配置


<sql id='TABLE_NAME'>TEST_USER</sql>
 <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
 <!-- 注意这里需要先查询自增主键值 -->
 <insert id="insert" parameterType="User">
     <selectKey keyProperty="id" resultType="int" order="BEFORE">
         select <include refid="TABLE_SEQUENCE" /> from dual
     </selectKey>
     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
         values ( #{id}, #{name}, #{age} )
 </insert>


当使用了<selectKey />后,在实际的插入操作时,mybatis会执行以下两句SQL:



select SEQ_TEST_USER_ID.nextval from dual; // 语句1


insert into (ID,NAME,AGE) values ( ?, ?, ? ); // 语句2


在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后


User user = new User();
 user.setName("test");
 user.setAge(24);
 userMapper.insert(user);
 System.out.println(user.id); // user.id 不为空


user.id是有值的。



Mysql自增主键配置



针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,


<sql id='TABLE_NAME'>TEST_USER</sql>
 <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">
     insert into <include refid="TABLE_NAME" /> ( NAME, AGE )
         values ( #{name}, #{age} )
 </insert>


当然,由于Mysql的自增主键可以通过SQL语句


select LAST_INSERT_ID();


来获取的。因此针对Mysql,Mybatis也可配置如下:


<sql id='TABLE_NAME'>TEST_USER</sql>
 <!-- 注意这里需要先查询自增主键值 -->
 <insert id="insert" parameterType="User">
     <selectKey keyProperty="id" resultType="int" order="BEFORE">
         SELECT LAST_INSERT_ID()
     </selectKey>
     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
         values ( #{id}, #{name}, #{age} )
 </insert>


只不过该中配置需要额外的一条查询SQL!



[size=x-large][color=red][b]小结[/b][/color][/size]


当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.



当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.


标签:自增,id,ID,插入,user,mybatis,主键
From: https://blog.51cto.com/u_3871599/6283466

相关文章

  • Mybatis-Plus使用技巧
    selectOne和selectListselectOne如果没有数据会得到nullselectList如果没有数据会得到长度为0的list自动填充任何使用wrapper的时候,自动填充都是失效的,必须带实体类,可以new一个更新字段为null默认情况:全局配置默认值为not_null,传递的参数中某个字段为null,则默认不会对为nu......
  • Mybatis开发项目操作步骤
    1.创建项目(IDEA中)2.导入依赖(配置pom文件)3.创建并编写MyBatis配置文件(mybatis-config.xml)4.数据库配置信息(jdbc.properties)5.日志配置信息(log4j.properties)6.创建表(数据库表)7.创建实体映射(entity实体)8.定义别名9.创建Dao层10.创建xxDao接口文件11.创建xxDaoMapper.xml配......
  • Java:SpringBoot整合MyBatis-Plus实现MySQL数据库的增删改查
    MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。文档https://baomidou.com/目录一、引入坐标二、配置三、CURD测试四、API数据接口一、引入坐标<dependency><groupId>com.baomidou</groupId><artifactId>m......
  • Springboot集成mybatis
    目的利用Springboot快速集成Mybatis。集成步骤引入依赖在pom文件中加入:<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.0</version></dependency&......
  • Mybatis-Plus 通用枚举
    表中的有些字段值是固定的,例如性别(男或女),此时我们可以使用MyBatis-Plus的通用枚举来实现数据库表添加字段sex创建通用枚举类型packagecom.example.enums;importcom.baomidou.mybatisplus.annotation.EnumValue;importlombok.Getter;@GetterpublicenumSexEnum{......
  • Mybatis-plus——MybatisX 快速开发插件
    MybatisX是一款基于IDEA的快速开发插件,为效率而生。安装方法:打开IDEA,进入File->Settings->Plugins->BrowseRepositories,输入mybatisx搜索并安装。MyBatisX插件用法:https://baomidou.com/pages/ba5b24/......
  • Mybatis-Plus 多数据源
    适用于多种场景:纯粹多库、读写分离、一主多从、混合模式等目前我们就来模拟一个纯粹多库的一个场景,其他场景类似场景说明:我们创建两个库,分别为:mybatis_plus与mybatis_plus_1,mybatis_plus有t_user表,mybatis_plus_1有t_product表,分别获取两个库的两张表,如果都能获取成功,就说......
  • Mybatis-Plus 代码生成器
    mybatis-plus-generator3.5.1以下版本:代码生成器(旧)mybatis-plus-generator3.5.1及其以上版本:代码生成器(新)本地使用mybatis-plus3.5.1版本进行测试。1.引入依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId&......
  • Spring整合Mybatis方式
    方式一student.javapackageorg.example.User;importlombok.Data;@Datapublicclassstudent{privateintid;privateStringusername;privateStringpassword;}userMapper.javapackageorg.example.mapper;importorg.example.User.student;......
  • 对于xml文件里面配置mybatis-spring报错的解决
    问题描述在我在bean的class里面进行查找sqlSessionFactoryBean,发现无论如何也找不到前面的mybatis问题解决在导入这个时:我们还需要导入这个依赖,只是导入mybatis自己爹依赖是不行的,需要导入的是mybatis-spring依赖:<dependency><groupId>org.mybatis</groupId>......