autocompletar
hora de creación y hora de modificación, gmt_create, gmt_modified
Método 1: nivel de base de datos (no recomendado para el trabajo, porque la base de datos no se puede manipular directamente)
1. Agregar campos directamente en la tabla de la base de datos
gmt_create datetime类型 默认值CURRENT_TIMESTAMP
gmt_modified datetime类型 默认值CURRENT_TIMESTAMP 勾选“根据当前时间戳更新”
2. Actualice la clase de entidad para que corresponda a la base de datos
private Date gmtCreate;
private Date gmtModified;
3. Prueba de actualización
Método 2: nivel de código (recomendado)
-
Operaciones DELETE DEFAULT y UPDATE en la base de datos
-
Anotar propiedades de campo de clase de entidad
//插入的时候自动填充 @TableField(fill = FieldFill.INSERT) private Date gmtCreate; //插入和更新的时候自动填充 @TableField(fill = FieldFill.INSERT_UPDATE) private Date gmtModified;
-
Escriba un procesador para manejar esta anotación
-
Nuevo procesador de creación de paquetes de identificadores MyMetaObjectHandler
package swagger.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; /** * @Author yetong * @Date 2023-06-25 16:07 * @blog https://blog.csdn.net/Xiao_tongtong **/ //把处理器加到 IOC 容器中 @Component public class MyMetaObjectHandler implements MetaObjectHandler { //插入时的填充策略 @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("gmtCreate",new Date(),metaObject); this.setFieldValByName("gmtModified",new Date(),metaObject); } //更新时的填充策略 @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("gmtModified",new Date(),metaObject); } }
candado optimista
Al prepararse para actualizar un registro, se espera que este registro no haya sido actualizado por otros en este momento.
- Al buscar registros, obtener la versión actual
- Al actualizar, traer esta versión
- Al realizar una actualización, configure version = newVersion donde version = oldVersion
- Si la versión es incorrecta, la actualización fallará
-
La base de datos agrega un campo de versión, el valor predeterminado es 1, tipo int y la longitud es 10
-
Agregar atributo de versión a la clase de entidad
@Version private Integer version;
-
registrar componente
package swagger.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @Author yetong * @Date 2023-06-25 14:39 * @blog https://blog.csdn.net/Xiao_tongtong **/ @MapperScan("swagger.mapper") @Configuration //自动管理事务 @EnableTransactionManagement public class MybatisPlusConfig { //注册乐观锁插件 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }
-
prueba
//测试没有通过乐观锁 @Test public void TestUpdate(){ //模拟线程 1 执行一个更新操作 Users users = usersMapper.selectById(1L); users.setName("yetong111"); users.setEmail("[email protected]"); usersMapper.updateById(users); //此时还没有提交更新,然后线程 2 介入,直接提交更新 Users user = usersMapper.selectById(1L); user.setName("yetong2222"); user.setEmail("[email protected]"); usersMapper.updateById(user); //没有乐观锁的话,现在数据已经变成yetong222,线程 1提交后会覆盖成yetong111 usersMapper.updateById(users); } //通过乐观锁 @Test public void testOptimisticLocker(){ Users users = usersMapper.selectById(1L); users.setName("yetong"); users.setEmail("[email protected]"); usersMapper.updateById(users); }