mybatis04返回主键

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

对于自增主键的插入操作

对于主键返回,数据库中有对应的语句,这里对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();
      	
      }
    
  • 测试

    mybatis04返回主键


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

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();
      	
      }
    
  • 测试结果

    mybatis04返回主键