【问题标题】:variable counter is not incrementing with adding new booking objects [closed]变量计数器不会随着添加新的预订对象而增加[关闭]
【发布时间】:2018-06-13 09:28:47
【问题描述】:

// 预订实体类

公开课预订{

    private int distance;
    private static int bookingId = 1000;
    private int cabId;
    private int customerId;
    private int billingAmount;


    public Booking() {

        bookingId++;
        System.out.println(bookingId);

    }

}

// 预订的服务类,我这里设置所有参数。

公共课 BookCab {

    public Booking bookCab(int distance, int customerId){
        Booking book = new Booking();


        CabDao cabDao = new CabDaoImpl();

        book.setDistance(distance);
        book.setCustomerId(customerId);

        book.setCabId(cabDao.getCabId()); //retrieving cab data from database

        if(distance>10) {book.setBillingAmount(305 + (distance-10)*25);}
        else if (distance <10 & distance>5) {

            book.setBillingAmount(180 + (distance-5)*25);
        }
        else if (distance <5 & distance>1) {

            book.setBillingAmount(100 + (distance-1)*20);
        }
        else    book.setBillingAmount(100);

        return book;
    }

}

// 这是访问数据库的 DAO 实现。

公共类 BookingDaoImpl 实现 BookingDao {

Connection connection = null;
PreparedStatement ptmt = null;
ResultSet resultSet = null;

public BookingDaoImpl() {};

private Connection getConnection() throws SQLException {
    Connection conn;
    conn = DbUtil.getInstance().getConnection();
    return conn;
}

public void addBooking(Booking booking) {

    try {
        String queryString = "INSERT INTO Booking(bookingId, customerId, cabId, distance, chargingAmount) VALUES(?,?,?,?,?)";
        connection = getConnection();
        ptmt = connection.prepareStatement(queryString);
        ptmt.setInt(1, booking.getBookingId());
        ptmt.setInt(2, booking.getCustomerId());
        ptmt.setInt(3, booking.getCabId());
        ptmt.setInt(4, booking.getDistance());
        ptmt.setInt(5, booking.getBillingAmount());
        ptmt.executeUpdate();
        System.out.println("Data Added Successfully");
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (ptmt != null)
                ptmt.close();
            if (connection != null)
                connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

}

// 驱动类

公共类主视图 {

public static void main(String[] args) {

    BookCab bookCab = new BookCab();

    BookingDao bookingDao = new BookingDaoImpl();
    bookingDao.addBooking(bookCab.bookCab(16, 691744));


}

}

/* 输出

    1001
    Data Added Successfully

    1001
    Data Added Successfully

    1001
    Data Added Successfully

*/

    Counter is not working  
    booking id is not increamenting

我已经尝试在增加后立即打印计数器,但那里也一样。

【问题讨论】:

  • 只发布代码不会告诉我们什么是行不通的。顺便说一句,我很确定缺少代码 - 至少我没有看到 Booking.getBookingId() 定义。
  • bookingDao.addBooking 被调用一次,为什么输出中有 3 行?
  • 应该写一些关于这个代码中面临的问题的解释。

标签: java static counter dao


【解决方案1】:

您只在您的main 中创建一个Booking 实例(或者,准确地说,您创建一个BookCab 实例并调用bookCab.bookCab(16, 691744),这将创建一个Booking 实例),这意味着它应该打印 1001。

如果您多次运行该应用程序(根据您的输出,我假设您这样做了),Booking 类将在每次执行时加载并初始化,因此它将计数器重置回 1000。

如果您希望 static 变量的值在应用程序的执行过程中存在,您必须将其保存在某个文件或数据库表中,并在 Booking 类初始化时加载它。

P.S.,您可能希望将当前的 bookingId 值存储在某个实例变量中,以便每个 Booking 实例与唯一的 bookingId 值相关联。

【讨论】:

  • 如果 OP 多次运行 sn-p,这就是答案
  • @Andrew 给出了问题中的代码和问题中的输出,这是一个合理的假设。
  • @Eran 是很好的解决方案,设置数据库表来存储“bookingId”肯定有助于在我每次运行此应用程序时保留此 ID。
【解决方案2】:

您的 main 方法只创建一个预订,每次运行应用程序时都会有 Id 1001。

在您的主要方法中创建一个循环以进行多个预订,并检查它是否正在增加。

所以改变你的主从

public static void main(String[] args) {

    BookCab bookCab = new BookCab();

    BookingDao bookingDao = new BookingDaoImpl();
    bookingDao.addBooking(bookCab.bookCab(16, 691744));


}

public static void main(String[] args) {
    for (int i = 0; i < 3; ++i) {
        BookCab bookCab = new BookCab();
        BookingDao bookingDao = new BookingDaoImpl();
        bookingDao.addBooking(bookCab.bookCab(16, 691744));
    }
}

【讨论】:

    【解决方案3】:

    静态变量增量不会帮助您解决这里的整体实现问题,当您为 Booking 类创建多个对象时,它只是按您预期的方式工作,但是如果应用程序重新启动,这里的问题是什么?

    计数器设置回起点,即 1000。

    @Eran 已经在评论中指出了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-28
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多