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);
}
ID会自动生成
常见的id生成有
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);//字符串表示法
}
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几乎所有的表都要配置上!而且需要自动化!
方式一:数据库级别
- 在表中新增字段 create_time, update_time
再次测试,同步实体类
运行测试
注意点:不建议这种方式。
方式二:代码级别
-
删除数据库的默认值
- 实体类上增加注解
@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;
}
- 编写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);
}
}