mybatis连接mysql删除多条数据时返回被删除的数据的主键
时间: 2024-10-09 08:15:31 浏览: 32
在MyBatis中,当你需要删除多行MySQL数据并且同时获取被删除记录的主键时,通常不会直接通过Delete操作返回具体的主键。因为Delete主要是用于数据库级别的批量删除,并不是设计用于查询结果。
不过,你可以结合事务和自增ID的方式来实现这个需求。首先,在执行Delete语句前,你可以开启一个事务;然后执行Delete操作;接着,如果需要返回被删除记录的主键,可以选择在事务提交之前执行一次查询,条件是你知道刚刚删除的数据的范围,比如通过删除时间戳或者其他唯一标识。
例如,你可以在`<delete>`标签中加入一个`selectKey`属性,指定在删除后立即执行一个SELECT语句获取主键:
```xml
<delete id="deleteWithGeneratedKeys" parameterType="map">
DELETE FROM your_table WHERE condition
<selectKey resultType="int" order="BEFORE">
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'your_table'
</selectKey>
</delete>
```
但是请注意,这种方式并不是MyBatis的原生特性,而是通过SQL Server特有的语法或特定数据库系统实现的,其他数据库可能不支持或有差异。
相关问题
mysql mybatis原生save 自增主键怎么是乱的
在MySQL中,如果你使用MyBatis原生的save操作来插入一条数据,并且表中的主键是自增的,那么插入的数据的主键值可能看起来是乱序的。这是因为MySQL的自增主键是基于当前连接的最大值进行生成的。
当多个连接同时插入数据时,每个连接都会使用当前最大的主键值加上自增步长来生成新的主键值。这可能会导致插入的数据的主键值出现乱序。
如果你希望插入数据的主键值是按照顺序递增的,可以将表的引擎设置为InnoDB,并且将事务隔离级别设置为Serializable。这样可以保证每次插入操作都会获取到当前最大的主键值,并且其他连接无法同时插入数据,从而避免了主键乱序的问题。
另外,如果你没有特殊要求,也可以不用在意主键的顺序,因为自增主键的乱序并不会影响数据的查询和使用。
已知mysql的表结构为CREATE TABLE `dtx_verify_rule_type` ( `id` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id', `business_id` varchar(40) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '业务id', `type_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '规则类型名称', `product_class_codes` json DEFAULT NULL COMMENT '可生产对象类', `version` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '版本号', `oid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '原始记录ID', `ack_state` tinyint(1) DEFAULT '0' COMMENT '确认状态:0-未确认(默认)、1-已确认', `ack_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '确认人', `operate` tinyint(1) DEFAULT '-1' COMMENT '操作方式:-1-未变化(默认)、0-删除、1-新增、2-修改', `creator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', `creation_time` char(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建时间', `modifier` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最后修改人', `modified_time` char(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最后修改时间', `valid` tinyint NOT NULL DEFAULT '1' COMMENT '合法标识', `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '乐观锁', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='数据校验类型表,因采用mybatis-plus.暂不分表表示类型与交付阶段的关系';,product_class_codes 字段存储数据格式为:["project", "building", "floor", "partition", "shaft", "space", "system", "equipment"] ,怎么根据product_class_codes 查询"equipment"的数据,mysql实现
可以使用MySQL的JSON_CONTAINS函数来查询JSON类型的字段中是否包含某个值。具体的查询语句如下:
```
SELECT * FROM dtx_verify_rule_type WHERE JSON_CONTAINS(product_class_codes, '["equipment"]');
```
这条语句会查询出包含"equipment"的所有记录。如果要查询包含多个值的记录,可以使用JSON_CONTAINS_ANY函数,语法与JSON_CONTAINS类似。
阅读全文