CRUD拓展

CRUD拓展

insert插入

@Test
public void testinsert(){
    User u=new User();
    u.setName("joker_dj");
    u.setAge(18);
    u.setEmail("saxon822@qq.com");
    mapper.insert(u);
}

CRUD拓展

ID会自动生成

CRUD拓展

常见的id生成有

CRUD拓展
id生成策略

博客:链接

雪花算法

snowflake是Twitter开源的分布式ID生成算法

自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景。
GUID:采用无意义字符串,数据量增大时造成访问过慢,且不宜排序。

最高位是符号位,始终为0,不可用。
41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
10位的机器标识,10位的长度最多支持部署1024个节点。
12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。
原文:链接

测试不同的主键自增策略

public enum IdType {
    AUTO(0),//主键自增
    NONE(1),//不使用
    INPUT(2),//手动输入
    ID_WORKER(3),//默认全局唯一Id
    UUID(4),//全局唯一id uuid
    ID_WORKER_STR(5);//字符串表示法
}

CRUD拓展

CRUD拓展

update更新

@Test
public void testupdate(){
    User u=new User();
    u.setId(1L);
    //自动拼接动态sql
    u.setName("saxon");
    u.setAge(11);
    u.setEmail("saxon@qq.com");
    mapper.updateById(u);
}

自动填充

创建时间、修改时间、这些操作是自动化完成的,我们不希望手动更新
阿里巴巴手册:所有数据表:gmt_create、gmt_modified几乎所有的表都要配置上!而且需要自动化!

方式一:数据库级别
  1. 在表中新增字段 create_time, update_time
    CRUD拓展

再次测试,同步实体类
CRUD拓展
运行测试

CRUD拓展

注意点:不建议这种方式。

方式二:代码级别

  1. 删除数据库的默认值
    CRUD拓展
  2. 实体类上增加注解
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.INPUT)       //一旦手动输入id后,就需要自己配置id
    private Long id;
    private String name;
    private Integer age;
    private String email;
    // 自动填充内容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}
  1. 编写handler策略
@Slf4j
@Component  //将组件插入到ioc中
public class MyMetaObjectHandler implements MetaObjectHandler {
    /*插入时的填充策略*/
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("填充....");//setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
    /*更新时的填充策略*/
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("更新....");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}
上一篇:基于Hibernate实现CRUD


下一篇:MyBatis-Plus简介