本篇介绍在easymybatis中如何设置主键策略,easymybatis的主键策略类似于hibernate的主键生成策略。
数据库主键设置自增后,这样设置:
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
这样在做insert后,id会自动填充自增后的值。
数据库主键是varchar类型,insert后自动填充uuid,并返回。
@Id
@Column(name = "id")
@GeneratedValue(generator = "system-uuid")
private String id;
这样在做insert后,id字段会自动填充uuid。
如果不希望使用底层数据库的uuid,可自定义自己实现,实现方式如下:
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private String id;
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生成方式
}
}
# 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生成方式
}
}
这样就能区分出自增主键和自定义主键了。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/thc1987/article/details/79347077
内容来源于网络,如有侵权,请联系作者删除!