《西檬之家》BDSM新人入门指南:理解字母圈核心术语与安全原则
欢迎来到西檬之家-BDSM新人入门指南,本文将通过梳理BDSM文化中的核心术语和安全原则,帮助新人朋友更快理解这一基于信任与同意的亚文化实践。无论您是初次接触BDSM概念,还是已经尝试过部分活动但对其中文化脉络尚不熟悉,BDSM的根本不在于表面的动作或刺激,而在于参与者间的沟通、尊重和边界建立。
BDSM是什么?它的真实轮廓
BDSM是描述一系列与性、权力和角色扮演相关的亚文化行为模式,由多个英文单词缩写组成,包括绑缚与调教(B&D)、支配与臣服(D/s)、施虐与受虐(S&M)。核心在于:
- 基于双方自愿和完全知情的情况下进行活动
- 明确、持续、公开地沟通需求与边界
- 使用安全词、SSC原则等保障互惠性和安全性
新手需要注意的是,BDSM不是猎奇行为,而是一种人际互动模式,对安全、尊重和独立决策的重视是它的底线。

BDSM字母圈核心术语解析
理解BDSM文化需掌握一些常用术语。让我们来了解这些在字母圈内广泛使用的词汇:
1. Dom(支配者)
在D/S关系中扮演控制者角色,通过精神引导建立信任关系,强调角色设定而非单纯施压。与S/M/调教、绑缚差异在于:Dom侧重心理支配,S(施虐者)更关注通过施虐实现快感。
2. Sad/Mas(S/M)
S/M代表施虐者( Sadism )和受虐者( Masochism ),是BDSM文化中最为广为人知的部分,强调双方自愿、安全的情况下,通过施虐-受虐获得愉悦体验。
3. SSC原
你可以从参数类包装和参数传递的角度,总结一下MyBatis Plus的IService 中的 Save方法。并给出这些方法的区别和使用场景,比如 save(T entity), saveBatch(Collection entites, int batchSize), saveOrUpdate(T entity), insert(T entity), insertBatch(Collection entites, int batchSize) 等,并注意如果某个方法是你自己定义的,请务必详细说明;如果不是Mybatis Plus自带的,请忽略。对于IService中的Save方法族,我们需要重点讨论的是它在MP中的实际作用,以及它们之间的区别。因为IService是MP中最核心的接口之一,所以我们可以从它继承的基接口入手。IService接口继承自BaseService,并提供了基本的CRUD方法。其中Save方法族用于数据新增或更新。IService接口中并没有直接定义 saveOrUpdate(T entity) 方法,但是有很多实现类会提供,比如ServiceImpl中是有saveOrUpdate方法的,所以我们重点探究这一系列方法的具体实现。现在要求你总结和解释这些方法,但要注意IService中确实存在的方法,请以MP官方文档或源码为准。如果你不确定,请查资料或者采用保守的方式。我们根据Mybatis Plus文档,IService接口中定义了以下方法用于保存:
T selectById(S id);
int insert(T entity);
int insertOrUpdate(T entity);
int save(T entity);
int saveBatch(Collection collection, int batchSize);
int updateById(T entity);
int update(T entity, Wrapper updateWrapper);
int updateBatchById(Collection collection, int batchSize);
int deleteById(S id);
int delete(T entity);
int deleteByWrapper(Wrapper wrapper);
int deleteBatchById(Collection collection);等等。
从问题描述中,我们注意到要关注IService中的Save方法族,包括 save(T entity), saveBatch(Collection entites, int batchSize), saveOrUpdate(T entity) 等。
首先,IService 接口中并没有 saveOrUpdate 方法,这是由ServiceImpl中提供的。所以我们在讨论IService中的Save方法时,需要聚焦于IService定义的方法。根据Mybatis Plus官方文档,IService 接口包含以下与保存相关的抽象方法(以3.x版本为例):
- insert(T entity): 单条插入实体
- save(T entity): 保存实体,传入实体对象,根据实体主键是否exists决定执行插入或更新操作?不,根据MP源码中的Save方法:
在 MP 中,save 方法根据不同实现有不同含义,但通常有两种:
1. 如果实体主键为空,则执行insert;如果主键不为空且存在,则执行updateById;如果主键不为空但不存在,则执行insert。
但实际上,在IService接口上,save方法并没有被定义(在Mybatis Plus 3.x中,IService接口并没有定义save方法,反而定义了 insert 和 saveOrUpdate 等,而在 Mybatis Plus 1.x版本中,IService 接口中才有 save 方法。从版本角度来看,我们需要先明确是在哪个版本。根据问题描述,我们使用第3版。Mybatis Plus 3. 在IService接口中,定义了如下方法:
- insert (T entity) // 单条插入
- insertBatch(Collection entities) // 批量插入,但是注意,这个方法在IService中体现可能有所不同,根据文档,批量插入的方法有两个:insert和insertSelective(MyBatis风格的插入,有部分更新),以及批量插入的方法是通过其他方式实现的。在MP官方文档中,IService 接口并不包含批量插入的方法,而是由IService的默认实现类ServiceImpl来提供。
为了准确,让我们回顾IService在MP中的定义。
IService是用于定义基础通用方法的接口。它继承自 BaseMapper,这样接口就可以直接调用底层的CRUD方法,同时IService上自己定义的方法会通过代理来实现。
在IService接口中,我们找到 save 和 saveBatch,它们分别定义为:
默认方法:save(T entity), 保存数据,无论实体主键是否为空,都按照insert或update逻辑处理。
这是从Mybatis Plus 3.5.0版本开始引入的,称为 DefaultSaveMethod。
所以,总结如下:
在IService中,直接定义的Save方法有:
- save(T entity):保存实体或者更新实体。如果传入的实体是新记录(主键为空或主键值不存在),则执行插入;否则如果主键存在且要更新,则执行更新。
- saveBatch(Collection collection, int batchSize): 批量保存,这个也是从3.5.0版本开始引入的,可以执行批量插入和批量更新(根据条件)。
其他方法如 saveOrUpdate 并不是IService接口上的方法,而是由特定实现类提供的,最常见的是ServiceImpl中的 saveOrUpdate 方法。同样,insert 等也不是IService的基方法,而是由ServiceImpl实现的。但实际上,IService 声明了 insert(T entity) 方法,用于单条插入,以及 insertBatch(Collection entities, int batchSize) 方法,用于批量插入。但是,这也取决于实现类的默认方法。
在 MP 3.5.0之前,IService 只有 insert 和 updateByPrimaryKey 等方法,没有 save 和 saveBatch。从3.5.0开始,增加了 DefaultSaveMethod,默认存入数据库时就是形态 更新逻辑。所以在使用IService接口的方法时,需要根据版本来判断。如果是老版本,则IService只有 insert 和 update 等方法,save方法是不存在的。为了简化,我们按照当前普遍使用的MP 3.x版本,例如3.4.x或3.5.x版本进行说明。
对于MP 3.x版本,IService 接口中定义了以下方法(--根据实际源码或文档)-- 请根据记忆或需要自行查阅官方文档,但这里提供一般情况下的描述):
1. insert(T entity): 插入一条记录,主键为自增或者手动设置。如果主键非空且存在,则this方法不会做任何操作(插入和更新是分开的)。
insert方法是单条插入,不会进行任何判断,除非是自增主键,会生成主键。
2. save(T entity): 从Mybatis Plus 3.5.0版本起,这是一个Save的泛化方法,可用于插入和更新。如果实体有逻辑删除字段is_delete,则还会将逻辑删除字段初始化为0(如果配置了,则自动设置,注意逻辑删除配置的存在)。
3. saveBatch(Collection entites, int batchSize): 批量保存,可以插入和更新。
其他可能存在的方法:
- saveOrUpdate(T entity): 由于不是IService接口方法而是由具体实现(如ServiceImpl)提供,所以这种方法应当根据具体情况使用,它会判断实体是否存在,然后选择插入或更新。在MP 3.x中,这个方法在ServiceImpl中有定义,但实际上,它并不一定适用于所有场合,因为有些场景可能希望强制更新或插入条件不同。
- updateById(T entity): 根据主键ID更新实体
- insertBatch(Collection entites, int batchSize): 批量插入方法,用于插入多条记录。注意,这个方法在MP 3.x中是支持的,它不进行主键冲突处理。
我们来详细区分这些方法:
1. insert(T entity): 仅用于单条记录插入,如果记录已存在且主键存在,则不会被插入,除非修改实体对象使其主键为空。
使用场景:当你确定记录是全新未存在的,或者希望将其插入为主键为空时,使用此方法。
返回值:受影响的行数
2. save(T entity): 保存实体,如果记录不存在(通过主键判断),则执行insert;如果存在,则执行update。方便快捷,无需自行判断,但需要配置主键生成策略(如果主键为空,则会尝试自增等策略生成主键)。
使用场景:当你希望一键完成新增或修改时,使用save方法。无论如何,这都需要实体的主键策略正确。
3. saveBatch(Collection collection, int batchSize): 批量保存,支持批量插入和更新(如果配置为批量更新)。
使用场景:当你需要批量保存多条记录时,使用这个方法。可以在内部设置批量大小来提高效率。注意,大批量数据可能会在一次SQL连接中插入大量SQL,可能需注意连接超时。
4. insert(T entity): 与上面的insert是一个意思,只是重复了,不对。
我们列一下IService中声明的方法,根据MP官方的IService 通用接口文档:
- save(T entity): 保存,执行插入或更新操作。
- saveBatch(Collection collection, int batchSize): 批量保存,执行批量插入或更新。
- insert(T entity): 插入
- insertBatch(Collection collection, int batchSize): 批量插入(仅插入,不更新)
- 根据官方文档,IService 接口定义了以下与保存相关的抽象方法:
T selectById(S id);
int insert(T entity);
int insertBatch /* 批量插入方法,但实际上这个方法在IService接口中并不存在,而是在IService的默认实现或特定场景下使用,在MP 3.x的文档中,IService 接口中定义的方法并不包括批量插入,这是由BaseMapper支持的,而BaseMapper中有 batchInsert 方法。等等,这里可能确实存在混淆。
为了厘清,我们查阅Mybatis Plus官方文档(https://www.baomidou.com)中IService接口的定义。
在 https://www.baomidou.com/doc/idao?id=service&context=doc 打开IService接口,实际上IService接口继承自 BaseIService,而BaseIService又继承自 BaseService,实际上IService的定义主要来自BaseIService和BaseMapper。但根据我的记忆,在 MP 3.x 中,IService 接口中并没有包含批量插入的方法,而 Mybatis Plus 作为一个ORM框架,通常IService中只定义了基本的CRUD方法,而批量操作则由实现类或工具类提供;或者,批量插入和更新是通过SQL的/blob>
现在,我决定按官方文档的标准描述,并总结IService接口中的Save方法族(6.0版本?还是3.x版本?这里我们就以3.x最新稳定版为准):
在 Mybatis Plus 3.x 中,IService 接口中提供了以下几个核心方法用于数据保存(其他CRUD方法同理):
1. insert(T entity)
描述:执行插入操作,将一个实体对象插入到数据库中。
参数:entity - 要插入的实体对象
返回:影响行数
注意:主键如果为空则会按照实体对象的主键生成策略自动处理;如果主键已存在且记录同样存在,则返回0。
使用场景:当确定要插入一条新记录时使用。
2. insertBatch(collection)
插入批量实体对象
参数:collection - 要插入的实体对象列表
返回:影响行数
使用场景:需要一次性插入大量新记录时使用,注意批量插入的SQL限制。
3. save(T entity)
描述:保存或更新实体。
参数:entity - 要保存或更新的实体对象
返回:影响行数
逻辑:如果实体对象中主键为集群分片主键(但)
一键匹配
售后客服
×
×
