Mybatis(二):插入操作返回主鍵

插入數據並返回主鍵這種需求很常見,所以列出來。

一、實現方式

1. 使用useGeneratedKeys+keyProperty (推薦)

簡單來說就是配置:

<insert id="" useGeneratedKeys="true" keyProperty="id">

將插入的ID賦值給設置的keyProperty對象屬性字段裏面,一般也就是對象的ID,比如插入User對象,設置賦值主鍵ID給id字段。

2. 使用selectKey

MySQL 數據庫可以使用如下方式。

<selectKey keyProperty="id" resultType="int" order="AFTER">
    SELECT LAST_INSERT_ID()
</selectKey>

二、具體演示:

基於上篇文章的代碼新增:

package cn.saytime.mapper;

import cn.saytime.domain.User;
import java.util.List;

/**
 * @author L
 * @ClassName cn.saytime.mapper.UserMapper
 * @Description
 */
public interface UserMapper {

    /**
     * 保存用戶,返回主鍵,形式1
     * @param user
     */
    int saveReturnPK1(User user);

    /**
     * 保存用戶,返回主鍵,形式2
     * @param user
     */
    int saveReturnPK2(User user);

}
<?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" >
<mapper namespace="cn.saytime.mapper.UserMapper" >

    <!-- 增,返回主鍵 形式1 -->
    <insert id="saveReturnPK1" parameterType="cn.saytime.domain.User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO `test`.`tb_user`(`username`, age) VALUES(#{username}, #{age})
    </insert>

    <!-- 增,返回主鍵 形式2 -->
    <insert id="saveReturnPK2" parameterType="cn.saytime.domain.User">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO `test`.`tb_user`(`username`, age) VALUES(#{username}, #{age})
    </insert>

</mapper>

測試:

import cn.saytime.domain.User;
import cn.saytime.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by L on 2018/1/3.
 */
public class TestUserMapper {

    SqlSessionFactory sqlSessionFactory = null;
    SqlSession sqlSession = null;
    UserMapper userMapper = null;

    @Before
    public void before(){
        // mybatis 配置文件地址
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 加載配置文件,並構建sqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 獲取sqlSession對象
        sqlSession = sqlSessionFactory.openSession();
        userMapper = sqlSession.getMapper(UserMapper.class);
    }

    @After
    public void after(){
        if(sqlSession != null){
            // 注意這裏的commit,否則提交不成功
            sqlSession.commit();
            sqlSession.close();
        }
    }

    /**
     * 測試保存用戶返回主鍵,注意返回的主鍵塞到了插入對象user的id中
     */
    @org.junit.Test
    public void testSaveReturnPK(){
        // 形式1
        User user1 = new User();
        user1.setUsername("李四");
        user1.setAge(18);
        int c1 = userMapper.saveReturnPK1(user1);
        System.out.println("新增用戶李四,返回主鍵:" + user1.getId() + "  操作數量:" + c1);

        // 形式2
        User user2 = new User();
        user2.setUsername("王五");
        user2.setAge(19);
        int c2 = userMapper.saveReturnPK1(user2);
        System.out.println("新增用戶王五,返回主鍵:" + user2.getId() + "  操作數量:" + c2);
    }

}
新增用戶李四,返回主鍵:3  操作數量:1
新增用戶王五,返回主鍵:4  操作數量:1

再次注意這裏UserMapper.saveResultPK返回之後的數字仍然是操作數量,主鍵在User對象裏面的id。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章