本功能的应用场景是人员信息登记,根据日期生成十位编码,例如今天的日期是 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新人水平低下勿喷