关于MyBatis的通用Mapper的自增ID实现
tx-mapper是在MyBatis的原来的基础上面添加单表的CRUD的常用操作,方便开发人员快速开发,无须重复写代码。
这里主要记录自己在使用过程中,关于自增id的使用,以及过程遇到的问题,防止以后自己重返再发生错误。
一:
本人使用是作者目前更新的最新的jar包,这是使用的是@KeySql注解替换@GeneratedValue注解,之前使用的自增,在数据库里面设计表的时候,勾选自增的id选项(这里主要说的是MySQL数据库),然后使用注解@GeneratedValue(generator= "JDBC"),这样在使佣insert方法的时候,实体对象的id,直接已经复制了。但是前天你的数据类型必须是Integer或者Long类型,String这里,我是没有是成功,若有高手知道,希望能够告知,表示感谢。
二:
我的想法,为什么在自增id不可以自定义,难道作者没有想到(其实原作者老早已经想到会有这样的结果,奥秘就在@KeySql注解里面)这里面有个属性:getId,就是实现的关键。首先观看源码便知:
public interface GenId<T> {
T genId(String table, String column);
class NULL implements GenId {
@Override
public Object genId(String table, String column) {
throw new UnsupportedOperationException();
}
}
}
作者默认没有实现,所以需要自己实现,这里面提供两个参数,一个是表名,一个是字段名字,你可以使用,也可以不使用,这里主要通过UUID生成,就不使用参数,直接返回数据便可:
public class UUIDGetId implements GenId<String> {
@Override
public String genId(String table, String column) {
LocalDate localDate = LocalDate.now();
DateTimeFormatter format = DateTimeFormatter.ISO_DATE;
String date = format.format(localDate);
return date + UUID.randomUUID().toString();
}
}
然后将自己的实现类放入里面放入属性便可,记住,这里面只能放入这一个属性,其他属性不可放入,因为他的等级是最低的:
@Id
@KeySql(genId= UUIDGetId.class)
private String id;
这样,自定义主键便已经可以生成实现