本功能的应用场景是人员信息登记,根据日期生成十位编码,例如今天的日期是 2024年3月22日,那么今天登记的第一个人员编码就是  2403220001,生成以后将其写入数据库,这个操作在Service层实现,需要多次访问数据库。

首先第一步就是准备工作,在实体类中要声明编码的实体,我这里用的是 

private String phyId; //编号
private LocalDate thatDay;

phyId代表要生成的编号,thatDay是要进行日期判断的。

在数据处理层中,首先要截取当天的日期也就是前六位 (例如240322)

//获取当天日期     
LocalDateTime now = LocalDateTime.now();

        
// 将当前年份转换为两位数
        
String year = String.format("%02d", now.getYear() % 100);

        
// 获取月份和日期,转换为4位数
        
String monthDay = now.format(DateTimeFormatter.ofPattern("MMdd"));

至此我们就已经获取到了当前的日期的前六位编码了

接下来要生成后四位编码了,其实这个操作可以使用Redis来实现,这样的话性能更高而且可以减轻MySQL的压力,但是小编是新手对Redis使用没有那么炉火纯青就使用了直接访问数据库的方法。

首先,我是先将DTO的数据拷贝到实体类中了,获取实体类中的当天日期,从数据库中获取当天编码的数量

Integer count = personInfoMapper.getCount(personInfo.getThatDay());

SQL(Mybatis)

<select id="getCount" resultType="java.lang.Integer">
        select count(*) from person_info where that_day = #{thatDay}
</select>

如果数量时小于 1 的,那么直接拼接字符串将数据插入到数据库中

if (count < 1) {
//将0001赋值到code中
   String code = "0001";
//拼接年月日+code生成当天的第一条编码(2403220001)
   String codex = year + monthDay + code;
/将编码参数传到实体对象中去
   personInfo.setPhyId(codex);
//插入到数据库当中
   personInfoMapper.save(personInfo);
}

如果当天的条码数量大于 1 时,那就要从数据库中获取当天最大的编号,并将编号从字符串强转为 Long 类型,再将编号自增。操作如下:

else if (count >= 1) {
//从数据库中获取当天最大编号
String max = personInfoMapper.getMax(personInfo.getThatDay());
//将编号强转为Long 类型
Long code = Long.parseLong(max);
//将最大编号加1
Long codex = code + 1;
//再将Long类型的编码强转为 字符串
String codes = codex.toString();
//将新生成的 编码赋值给实体对象
personInfo.setPhyId(codes);
//写入数据库
personInfoMapper.save(personInfo);
}

 这是获取当天最大值的SQL(Mybatis)

<select id="getMax" resultType="java.lang.String">
        select max(phy_id) from person_info where that_day = #{thatDay}
</select>

这是生成的效果

java 根据当前时间生产编号 java根据日期生成编号_java