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。

 

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis是一款基于Java的持久层框架,它的设计理念是将数据操作与具体的SQL语句解耦,通过XML或注解的方式来配置SQL语句,并提供了强大的映射功能,能够将查询结果映射为Java对象。 在MyBatis中,插入数据返回主键有多种方式,其中比较常用的方式是使用数据库的自增长主键。下面是在MyBatis插入数据返回主键的源码解析: 1. 配置SQL语句:在XML文件或注解中配置插入SQL语句,并设置useGeneratedKeys属性为true,以启用主键返回功能。 2. 执行插入操作:通过MyBatis的SqlSession对象调用插入方法,传入SQL语句的参数。 3. SQL语句解析:MyBatis会根据配置的SQL语句解析生成相应的PreparedStatement对象。 4. 执行插入操作返回主键MyBatis会通过PreparedStatement的executeUpdate方法执行插入操作,并获得影响的行数。如果配置了自动生成主键的功能,则会通过PreparedStatement的getGeneratedKeys方法获取到插入数据生成的主键。 5. 主键映射:如果返回主键是自动生成的,则MyBatis会根据配置的主键返回类型自动进行映射,将插入数据生成的主键值设置到对应的Java对象中。 6. 返回结果:最后,MyBatis会将插入操作的结果包装成对应的Java对象,并返回给调用方。 总结来说,MyBatis插入数据返回主键的过程是通过配置SQL语句和设置相关属性,然后执行插入操作并获取主键值,最后将主键值映射到Java对象中,返回给调用方。这样就可以方便地使用自动生成的主键值进行后续操作
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值