Mybatis 之useGeneratedKeys注意点

文章深入探讨了MyBatis中的useGeneratedKeys属性在不同场景下的作用,包括在Configuration设置、XML映射文件和注解映射中的应用。当useGeneratedKeys设为true时,MyBatis能获取数据库自动生成的主键ID,并通过keyProperty指定的JavaBean属性进行赋值。文章通过例子和官方文档解释了这一特性的实现和影响范围。
摘要由CSDN通过智能技术生成
一.例子
Order.java

public class Order {
	private Long id;
	private String serial;
}



orderMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vic.mybatis.dao.OrderDao">
	<insert id="createOrder" useGeneratedKeys="true" keyProperty="id">
		insert into t_order(serial) values (#{serial})
	</insert>
</mapper>



OrderDao.java
@Mapper
public interface OrderDao {
    public int createOrder(Order order);
}



OrderServiceImpl.java
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {

    @Resource
    private OrderDao orderDao;

    @Override
    public int createOrder(Order order) {
    	// 这个result是否就是插入数据成功后返回的主键ID?
    	int id = orderDao.createOrder(order);
    	log.info(" *****插入数据后返回的id: " + id + " *****");
    	log.info(" *****插入数据后返回的id: " + order.getId() + " *****");
        return result;
    }
}

大家应该懂得都懂哈,下面就围绕useGeneratedKeys探讨上面这两行输出的内容

若数据库支持自动生成主键(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=“true”,表明使用自增主键获取主键值策略,然后再利用 keyProperty 属性指定对应的主键属性,也就是 Mybatis 获取到主键值后,将这个值封装给 JavaBean 的哪个属性。

前提就是你的数据库的的那个字段必须是自增的字段 然后你的mybatis 才可以设置这个字段是一个自增的字段

二. 官网说明

mybatis对于mapper中 useGeneratedKey的描述

(insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally by the database (e.g. auto increment fields in RDBMS like MySQL or SQL Server). Default: false.

mybatis对于Configuration中useGeneratedKey的描述

Allows JDBC support for generated keys. A compatible driver is required. This setting forces generated keys to be used if set to true, as some drivers deny compatibility but still work (e.g. Derby). Default: false.

mybatis对于注解映射中useGeneratedKey

@Options This annotation provides access to the wide range of switches and configuration options that are normally present on the mapped statement as attributes

@Options注解提供了对广泛开关和配置选项的访问,这些开关和配置选项通常作为属性出现在映射语句中,就是也就是说这个配置了后,它会直接作为属性出现在映射语句中,会覆盖上面Configuration(setting)中的配置

三.Mybatis中的useGeneratedKeys
3.1、对于Configuration(setting)中useGeneratedKey
<settings>
	<setting name="useGeneratedKeys" value="true" />
</settings>

在执行insert成功之后可以获取到数据库自动生成的主键ID,因为在settings元素中设置useGeneratedKeys是全局生效的,但实际是只会对接口映射器(没有同时配置@Options注解情况下)产生影响,对xml映射器不起效。

3.2、对于mapper中useGeneratedKey
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vic.mybatis.dao.OrderDao">
	<insert id="createOrder" useGeneratedKeys="true" keyProperty="id">
		insert into t_order(serial) values (#{serial})
	</insert>
</mapper>

在mapper(xml)中配置的useGeneratedKeys属性只会对当前mapper(xml映射器)产生影响,且在settings元素中设置的全局useGeneratedKeys参数值对于mapper(xml映射器)不产生任何作用。

3.3、对于注解映射中useGeneratedKey
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into t_order(serial) values(#{serial})")
Integer createOrder(Order order);

在同时在Configuration(setting) 和 接口映射器中都添加了useGeneratedKeys属性, 无论属性值是否相同, 接口映射器的优先级会高于Configuration(setting) 的优先级;

也就说,不管你在Configuration(setting) 中设置useGeneratedKeys 为 true 或者 false,只要你在接口映射器中设置了@Options(useGeneratedKeys = true), 那么就会返回主键ID,如果@Options(useGeneratedKeys = false),那么就不会返回主键ID

四.总结前面的问题

设置了useGeneratedKeys = true的情况下,执行insert(或者update)后,会返回主键ID,那么我在问题中上面OrderServiceImpl.java中输出两个信息里面, 第一个输出是执行状态,第二是主键ID。
那么在执行完createOrder方法后返回的到底是什么?

在这里插入图片描述
所以说第一个打印返回的是影响行数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值