Java 添加新对象(H2 数据库)
Java add new object (H2 database)
我在向 sql 添加新对象时遇到 ID 问题 table。
我的超级 class 有 name 和 id + 2 个构造函数:
public Car(String name ) {
this.name = name ;
}
public Car(long id, String name ){
this.id = id;
this.name = name ;
}
Subclass 也有 2 个带 id 和不带 id 的构造函数。
从 H2 我是这样读的:
public static List<Car> addAllCars() throws SQLException, IOException {
Connection connection= connectToDatabase();
List<Car> listOfCars= new ArrayList<>();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM CARS");
while(rs.next()){
Long id = rs.getLong("id");
String name= rs.getString("name");
Integer noOfDoors = rs.getInt("noOfDoors");
Car newCar= new Car(name, noOfDoors);
newCar.setId(id);
listOfCars.add(newCar);
}
closeConnectionToDataBase(connection);
return listOfCars;
}
当我添加新车时(用户输入名称和 noOfDoors,我应该得到新的 id)
Connection connection= Database.connectToDatabase();
PreparedStatement query=
veza.prepareStatement("INSERT INTO CAR(name,noOfDoors) VALUES(?,?) ");
query.setString(1, cars.getName());
query.setInt(2, cars.getNoOfDoors());
query.executeUpdate();
Database.closeConnectionToDataBase(connection);
问题是我进口了 5 辆汽车。 ID 从 1 到 5。但是当我添加一辆新车时,它从 id 40 开始,并且总是增加 1。如果我导入 10 辆汽车,我会从 40 到 50。如果我删除这 10 辆汽车,它也会从 id 50 继续等等。我以为h2里面的id会自动自增
不要期望主键 ID 是连续的。
认为主键应该是连续的是一种常见的误解。唯一的要求是 PK 应该具有 唯一的 值,因此它可以充当行标识符。
如果值一个一个增长,或者有差距,或者数字是随机的,那都没有关系。只要它们是唯一的,您的应用程序就会运行良好。
数据库引擎通常会为不同的线程缓冲数字段,因此不同的用户在添加新行时不会踩到彼此的脚趾。副作用是您会在 table 中看到未使用值的间隙。同样,这非常不重要。
同样典型的是序列中的数字不会被回收。您稍后可以删除行,但这些行的标识符号不会再次分配给新行。同样,这意味着您的 table 的行号中可能会出现间隙,这 非常 不重要。
我在向 sql 添加新对象时遇到 ID 问题 table。
我的超级 class 有 name 和 id + 2 个构造函数:
public Car(String name ) {
this.name = name ;
}
public Car(long id, String name ){
this.id = id;
this.name = name ;
}
Subclass 也有 2 个带 id 和不带 id 的构造函数。
从 H2 我是这样读的:
public static List<Car> addAllCars() throws SQLException, IOException {
Connection connection= connectToDatabase();
List<Car> listOfCars= new ArrayList<>();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM CARS");
while(rs.next()){
Long id = rs.getLong("id");
String name= rs.getString("name");
Integer noOfDoors = rs.getInt("noOfDoors");
Car newCar= new Car(name, noOfDoors);
newCar.setId(id);
listOfCars.add(newCar);
}
closeConnectionToDataBase(connection);
return listOfCars;
}
当我添加新车时(用户输入名称和 noOfDoors,我应该得到新的 id)
Connection connection= Database.connectToDatabase();
PreparedStatement query=
veza.prepareStatement("INSERT INTO CAR(name,noOfDoors) VALUES(?,?) ");
query.setString(1, cars.getName());
query.setInt(2, cars.getNoOfDoors());
query.executeUpdate();
Database.closeConnectionToDataBase(connection);
问题是我进口了 5 辆汽车。 ID 从 1 到 5。但是当我添加一辆新车时,它从 id 40 开始,并且总是增加 1。如果我导入 10 辆汽车,我会从 40 到 50。如果我删除这 10 辆汽车,它也会从 id 50 继续等等。我以为h2里面的id会自动自增
不要期望主键 ID 是连续的。
认为主键应该是连续的是一种常见的误解。唯一的要求是 PK 应该具有 唯一的 值,因此它可以充当行标识符。
如果值一个一个增长,或者有差距,或者数字是随机的,那都没有关系。只要它们是唯一的,您的应用程序就会运行良好。
数据库引擎通常会为不同的线程缓冲数字段,因此不同的用户在添加新行时不会踩到彼此的脚趾。副作用是您会在 table 中看到未使用值的间隙。同样,这非常不重要。
同样典型的是序列中的数字不会被回收。您稍后可以删除行,但这些行的标识符号不会再次分配给新行。同样,这意味着您的 table 的行号中可能会出现间隙,这 非常 不重要。