主键策略设置

本篇介绍在easymybatis中如何设置主键策略,easymybatis的主键策略类似于hibernate的主键生成策略。

主键自增

数据库主键设置自增后,这样设置:

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

这样在做insert后,id会自动填充自增后的值。

主键使用uuid

数据库主键是varchar类型,insert后自动填充uuid,并返回。

@Id
@Column(name = "id")
@GeneratedValue(generator = "system-uuid")
private String id;

这样在做insert后,id字段会自动填充uuid。

  • 注:uuid的生成方式是调用数据库底层实现,如MySql的实现方式为: SELECT UUID()

自定义uuid

如果不希望使用底层数据库的uuid,可自定义自己实现,实现方式如下:

  • 首先entity中的id字段@GeneratedValue注解设置成AUTO
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private String id;
  • 创建一个类UUIDFill并继承FillHandler类
public class UUIDFill extends FillHandler<String> {
    @Override
    public String getColumnName() {
        return "id"; // 作用在id字段上
    }
    @Override
    public FillType getFillType() {
        return FillType.INSERT; // INSERT时触发
    }
    @Override
    protected Object getFillValue(String defaultValue) {
        return UUID.randomUUID().toString(); // 自定义的uuid生成方式
    }
}
  • 在application.properties中添加
# key:填充器全路径类名,value:构造函数参数值,没有可不填
mybatis.fill.com.xx.aa.UUIDFill=

格式为mybatis.fill.类路径=构造参数(没有可不填)

到此已经可以了,当进行insert操作后,id字段会自动插入自定义的uuid。

但是使用过程中还会有个问题,如果数据库中既有自增主键的表,也有自定义UUID主键的表,那么上面的做法就没办法区分了。因此我们要找出自定义UUID主键的表,解决办法是重写FillHandler的match(Class

public class UUIDFill extends FillHandler<String> {
    /* 重写方法,自定义匹配
        entityClass     实体类class
        field           字段信息
        columnName      给定的数据库字段名
    */
    @Override
    public boolean match(Class<?> entityClass, Field field, String columnName) {
        boolean isPk = field.getAnnotation(Id.class) != null; // 是否有@Id注解

        GeneratedValue gv = field.getAnnotation(GeneratedValue.class);
        boolean isAuto = gv != null && gv.strategy() == GenerationType.AUTO; // 是否有@GeneratedValue注解,并且策略是AUTO

        return isPk && isAuto;
    }

    @Override
    public String getColumnName() {
        return "id"; // 作用在id字段上
    }
    @Override
    public FillType getFillType() {
        return FillType.INSERT; // INSERT时触发
    }
    @Override
    protected Object getFillValue(String defaultValue) {
        return UUID.randomUUID().toString(); // 自定义的uuid生成方式
    }

}

这样就能区分出自增主键和自定义主键了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值