因为日程表添加删除或修改都会涉及到添加到发送定时消息表的数据处理问题,因为不想破坏原有发送消息的统一的sys_sms表内容,所以在日程表添加一个关联的sys_sms消息表ID,那如何获取呢?
因为这个save实际是用到了mybatisplus里的IService<T>中的
public interface IService<T> { /** * 默认批次提交数量 */ int DEFAULT_BATCH_SIZE = 1000; /** * 插入一条记录(选择字段,策略插入) * * @param entity 实体对象 */ default boolean save(T entity) { return SqlHelper.retBool(getBaseMapper().insert(entity)); }
mybatisplus对于ID是如何产生的呢?
看public class SysMessage extends JeecgEntity 再继续看
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class JeecgEntity implements Serializable { private static final long serialVersionUID = 1L; /** ID */ @TableId(type = IdType.ASSIGN_ID) @ApiModelProperty(value = "ID") private java.lang.String id; /** 创建人 */ @ApiModelProperty(value = "创建人") @Excel(name = "创建人", width = 15) private java.lang.String createBy; /** 创建时间 */ @ApiModelProperty(value = "创建时间") @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private java.util.Date createTime; /** 更新人 */ @ApiModelProperty(value = "更新人") @Excel(name = "更新人", width = 15) private java.lang.String updateBy; /** 更新时间 */ @ApiModelProperty(value = "更新时间") @Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private java.util.Date updateTime; }
这里可以看到实际上是用到了Mybatis-plus的ASSIGN_ID(雪花算法)
ASSIGN_ID(雪花算法)
如果不设置type值,默认则使用IdType.ASSIGN_ID策略(自 3.3.0 起)。该策略会使用雪花算法自动生成主键 ID,主键类型为 Long 或 String。
雪花算法(SnowFlake)是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的。
使用方法
指定主键生成策略使用雪花算法(默认策略)
当然也可以使用ASSIGN_UUID(
不含中划线的UUID)
如果使用 IdType.ASSIGN_UUID
策略,则会自动生成不含中划线的 UUID
作为主键,主键类型为 String
。
通过下面保存之后,再通过getId来获取保存后的数据ID
@Override public String saveSysMessage(SysMessageVo sysMessageVo) { SysMessage sysMessage = new SysMessage(); sysMessage.setEsContent(sysMessageVo.getEsContent()); sysMessage.setEsReceiver(sysMessageVo.getEsReceiver()); sysMessage.setEsSendNum(sysMessageVo.getEsSendNum()); sysMessage.setEsSendStatus(sysMessageVo.getEsSendStatus()); sysMessage.setEsTitle(sysMessageVo.getEsTitle()); sysMessage.setEsSendTime(sysMessageVo.getEsSendTime()); sysMessage.setEsType(sysMessageVo.getEsType()); sysMessageService.save(sysMessage); log.info("sysMessage getid="+sysMessage.getId()); return sysMessage.getId(); }
注意事项:Mysql 的默认值只有在insert语句中没有这个字段时才会生效,如果insert中有插入该字段而该字段取值又为null,null值将被插入到表中,默认值此时失效。使用Mybatis操作也是一样的道理,只要这个实体里面含有这个字段,并且值为null,则不会插入默认值。