mybatis 向数据库插入数据时获取其主键值(序列值)的实现小记

本文以oracle数据库为例,简单说明(演示项目用的springboot+mybatis+oracle,只贴部分关键代码):

分两种情况:

01、在mapper接口传参时,以java实体类传参;

public interface UserMapper {
      int insertUser(@Param("user") User user);
}

02、在mapper接口传参时,以map传参;

public interface UserMapper {
      int insertUser(@Param("paramMap") Map<String, Object> paramMap);
}

首先第一种情况(01、在mapper接口传参时,以java实体类传参)

  首先创建一个User实体类:

public class User {
	private Integer id;
	private String name;
	
	set get...方法忽略
}
然后在xml中加如下代码(暂不解释代码,在"02、"统一解释):

<insert id="insertUser" parameterType="com.test.User" >
    <selectKey keyProperty="id" resultType="int" order="BEFORE" >
        select USER_SEQ.nextval from DUAL 
    </selectKey>
    insert into USER
    	(id, name)
    values
    	(#{id}, #{name})
</insert>
在业务层的代码如下:
User user = new User();
user.setName("zhangsan");
//向用户表中新加一个用户,返回数据库受影响的行数
int count = userMapper.insertUser(user);
//获取新用户的主键id值,并打印到控制台
System.out.print(user.getId());

其次第二种情况下(02、在mapper接口传参时,以map传参)

首先在xml中加如下代码:

<insert id="insertUser" parameterType="hashMap" >
    <selectKey keyProperty="paramMap.id" resultType="int" order="BEFORE" >
        select USER_SEQ.nextval from DUAL 
    </selectKey>
    insert into USER
    	(ID, NAME)
    values
    	(#{paramMap.id}, #{paramMap.name})
</insert>

对上面代码简单解释一下:order = "BEFORE" 代表在执行insert语句之前先执行selectKey中的语句,这时我们先获取了User表的序列的下一个值,keyProperty="paramMap.id" 就是将获取到的序列值赋值给paramMap中的id,这时再执行insert语句的时候#{paramMap.id} 就已经是获取到的序列值了,这样我们在程序中也就获取到了新插入数据的id值,关键代码在下面贴上;

然后在代码里面(service层或者controller层),调用dao层时添加如下代码(只贴关键代码)

@Autowired
private UserMapper userMapper;
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("id", null);
paramMap.put("name","zhangsan");
//向用户表中新加一个用户,返回数据库受影响的行数
int count = userMapper.insertUser(paramMap);
//获取新用户的主键id值,并打印到控制台
System.out.print(paramMap.get("id").toString());

猜你喜欢

转载自blog.csdn.net/mayunju/article/details/78869923