mybatis04返回主键

本文探讨了在使用MyBatis进行数据库操作时,如何针对自增与非自增主键实现主键返回,包括MySQL环境下的具体配置与代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

探索这一章的原因在于,在实际插入操作时,可能会遇到表之间的关联,就好像入学或入职的时候要填多张表,但是学号和工号是一样的。所以,在类似的情况下,在执行插入操作的时候,需要返回主键。可是,对于主键有自增非自增两种,操作会不会不一样呢?

对于自增主键的插入操作

对于主键返回,数据库中有对应的语句,这里对MySQL展开研究

MySQL前提

MySQL中,对于自增主键有select last_insert_id(),这条语句执行于insert语句之后

代码配置
  • sqlmapper.xml配置,这里是user.xml文件

      <!-- 添加user信息:
      因为user表中id是自增的,所以不需要写关于id的字段
       -->
       <insert id="insertUser" parameterType="com.model.User">
       	<!-- 主键返回:
       	keyProperty: 对应model中的主键字段
       	order: 执行于语句之前OR之后
       	 -->
       	<selectKey keyProperty="id" order="AFTER" resultType="int">
      		SELECT LAST_INSERT_ID()
      	</selectKey>
       	insert into user(userName, userAge, userAddress) value(#{userName},#{userAge},#{userAddress})
       </insert>
    
  • Test.java编写相关代码,注意语句是sqlSession.insert(),之前我以为把以前的复制过来就好,没想到这一行也要改动

      public static void insertUser() throws IOException {
      	
      	// mybatis 配置文件
      	String resource = "Configuration.xml";
      			
      	// 得到配置文件流
      	InputStream inputStream = Resources.getResourceAsStream(resource);
      			
      	// 创建会话工厂,传入mybatis配置
      	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      			
      	// 通过工厂得到SqlSession
      	SqlSession sqlSession = sqlSessionFactory.openSession();
      	
      	User user = new User();
      	
      	user.setUserName("小亮");
      	user.setUserAge(18);
      	user.setUserAdress("武汉");
      	
      	// 通过SqlSession操作数据库
      	sqlSession.insert("test.insertUser", user);
      	
      	// 提交
      	sqlSession.commit();
      			
      	System.out.println(user.getId());
      	
      	// 释放资源
      	sqlSession.close();
      	
      }
    
  • 测试

    在这里插入图片描述


对于非自增主键的插入操作

MySQL前提

MySQL中,对于自增主键有select uuid(),这条语句执行于insert语句之前

代码配置
  • 首先,建立一张id非自增的表,并创建对应的model
    注意在建立非自增id条目时,设置为vachar,长度设长一点,因为uuid在生成id的时候是很长的序列号,我这里为了不必要的麻烦,长度设置为50

  • 新建并配置sqlmapper.xml,这里是article.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">
      
      <!-- namespace: 命名空间 -->
      <mapper namespace="testArticle">
      
      	<!-- 这里面开始写sql -->
      	<!-- 添加article信息:
      	因为article表中id是非自增的,所以需要写关于id的字段
      	 -->
      	 <insert id="insertArticle" parameterType="com.model.Article">
      	 	<!-- 主键返回:
      	 	keyProperty: 对应model中的主键字段
      	 	order: 执行于语句之前OR之后
      	 	resultType: 注意要改为String
      	 	 -->
      	 	<selectKey keyProperty="id" order="BEFORE" resultType="String">
      			SELECT UUID()
      		</selectKey>
      	 	insert into article(id, userid, title, content) value(#{id},#{userId},#{title},#{content})
      	 </insert>
          
      </mapper>
    
  • Configuration.xml添加新的sqlmapper映射

      <mapper resource="sqlmap/article.xml"/>
    
  • Test.java中编写相应代码

      public static void insertArticle() throws IOException {
      	
      	// mybatis 配置文件
      	String resource = "Configuration.xml";
      			
      	// 得到配置文件流
      	InputStream inputStream = Resources.getResourceAsStream(resource);
      			
      	// 创建会话工厂,传入mybatis配置
      	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      			
      	// 通过工厂得到SqlSession
      	SqlSession sqlSession = sqlSessionFactory.openSession();
      	
      	Article article = new Article();
      	
      	article.setId("10");
      	article.setUserId(1);
      	article.setTitle("title");
      	article.setContent("content");
      	
      	// 通过SqlSession操作数据库
      	sqlSession.insert("testArticle.insertArticle", article);
      	
      	// 提交
      	sqlSession.commit();
      			
      	System.out.println(article.getId());
      	
      	// 释放资源
      	sqlSession.close();
      	
      }
    
  • 测试结果

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值