前言
这段时间用Java基础做了一个小项目的初级功能模块,该项目是为了方便用户购买网店商品,并且对用户购买的信息进行统一管理的系统。
记录一下其中的时间格式转换和 id 自增。
用户的订单编号中包含创建订单时的日期,比如202008171001这样,后面的编号1001自动增加。
订单创建时间格式为创建时的日期时间,比如2020-08-17 18:41这样。
商品实体类的 id 自动增长。
说明:这里是纯 Java 实现,不涉及数据库等其他方面。
下面是我的代码实现:
订单类
订单实体类构造方法之一:
public Order(String name, String phone, String address, String deliveryMode) {
// 时间格式模板
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyyMMdd");
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
// 订单编号
// 当前日期目标格式 + (当前存储 id + 1)
this.orderId = LocalDate.now().format(formatter1) + (getUuid() + 1);
// 创建时间
this.date = LocalDateTime.now().format(formatter2);
// 创建人
this.name = name;
// 联系方式
this.phone = phone;
// 联系地址
this.address = address;
// 派送方式
this.deliveryMode = deliveryMode;
// 覆盖之前存储 id 为当前 id
setUuid(getUuid() + 1);
}
通过以上方式将当前日期和当前时间的默认格式转换成目标格式并应用,其中的 getUuid() 和 setUuid() 两个方法就是利用 IO 流的 DataInputStream 和 DataOutputStream 实现 id 自增,并且当前最新 id 存储在本地文件中,这就保证了断网或服务器关闭等情况不会对其产生太大影响。(注意:这里的 id 并不是完整的 orderId )
下面是用 IO 流实现 id 自增的方法:
private Integer getUuid() {
// 初始化 id
int id = 1000;
// 读取存储的 id 数值
try (DataInputStream dis = new DataInputStream(
new FileInputStream("D:\\JAVA\\data\\currentOrderId"))) {
id = dis.readInt();
} catch (IOException e) {
}
return id;
}
private void setUuid(Integer id) {
// 写入覆盖更新当前 id
try (DataOutputStream dos = new DataOutputStream(
new FileOutputStream("D:\\JAVA\\data\\currentOrderId"))) {
dos.writeInt(id);
} catch (IOException e1) {
e1.printStackTrace();
}
}
因为文件一开始是空的,并没有任何数据,所以 getUuid() 方法先初始化 id 值,之后读取的时候会抛出异常,并且捕获后无需处理。之后通过 setUuid() 方法把值写入到文件中,然后这样不断读取,不断覆盖,实现 id 自增。
还有一种简单的实现 id 自增的方法,不过仅限于服务器运行状态下,即 id 存储在内存中,数据是临时状态,不能永久保存。例如:
产品类
产品实体类属性:
private Integer id;
private static Integer guid = 1001;
private String productName;
private Double price;
定义一个静态的标记 guid 属性,限制了其只初始化一次。
构造方法之一:
public Product(String productName, Double price) {
this.id = guid++;
this.productName = productName;
this.price = price;
}
通过以上方式就可以实现 id 的不断自增,每创建一次对象,id 就加一。
补充
如果用数据库的话,嘿嘿…