mybatis04返回主键
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(); }
-
测试
对于非自增主键的插入操作
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(); }
-
测试结果