JDBC-创建具有以下私有属性的类Hall [关闭]

问题描述 投票:-1回答:1

创建具有以下私有属性的类Hall

  • id为int,
  • 名称为字符串,
  • costPerDay为Double。

使用适当的构造函数,getter和setter。

使用以下方法创建类HallDC

public Hall getHall(int id)-根据以下信息查找大厅的所有详细信息大厅编号并返回。

使用数据库凭据:

  • 驱动程序类:com.mysql.jdbc.Driver使用您自己的数据库,用户名和密码
  • 表名称:大厅
  • id-int
  • 名称-varchar(30)
  • costPerDay-double

创建驱动程序类Main以显示项目详细信息。

Testcase1:

i/p: 2
o/p: ID   Name   CostPerDay
     2    BWM    20000.0

Testcase2:

i/p: 4
o/p: ID   Name   CostPerDay
     4    PSR    40000.0

我不知道如何编写getHall函数。

到目前为止我写的代码是:

import java.util.*;
import java.io.*;
import java.sql.*;

class Hall{
  private int id;
  private String name;
  private double costPerDay;

  public Hall(int id, String name, double costPerDay){
    this.id = id;
    this.name = name;
    this.costPerDay = costPerDay;
  }

  public int getId(){
    return id;
  }
  public void setId(int id){ 
    this.id = id;
  }
  public String getName(){
    return name;
  }
  public void setName(String name){
    this.name = name;
  }
  public double getCostPerDay(){ 
    return costPerDay;
  }
  public void setCostPerDay(double costPerDay){ 
    this.costPerDay = costPerDay;
  }
}


class HallDC{
  public Hall getHall(int id){
  ...
  }
}


public class Main{
  public static void main(String args[]){
  ...
  }
}

我已经为getHall()编写了代码,在这里是:

public Hall getHall(int id){
     try{
       Class.forName("com.mysql.jdbc.Driver");
       Connection con = DriverManager.getConnection("jdbc:mysql://localhost/ri_db","test","test123");
       PreparedStatement stmt = con.prepareStatement("Select * from HALL where id = ?");
       stmt.setInt(1,id);
       ResultSet rs = stmt.executeQuery();
       Hall hall = new Hall();
       hall.setId(rs.getInt(1));
       hall.setName(rs.getString(2));
       hall.setCostPerDay(rs.getDouble(3));
       return hall;
       }catch(Exception e)
          {System.out.println(e));
       }
      }

主要功能代码:

public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
HallDC h = new HallDC();
h = h.getHall(n);
System.out.println(h.getId()+" "+h.getName()+" "+h.getCostPerDay());
}
}

代码未执行,请帮助我修复它。

java mysql jdbc
1个回答
0
投票

您的代码几乎是正确的,但是有一些小问题:

  1. 您的Hall类没有默认的构造函数,但是在HallDC类中,新的Hall实例是通过调用Hall hall = new Hall();创建的。将默认构造函数添加到Hall类,或使用ResultSet中的值实例化它。

  2. 对于JDBC驱动程序v4,不再需要调用Class.forName("com.mysql.jdbc.Driver");。只需确保对mysql JDBC驱动程序的依赖性在您的类路径中即可。

  3. 在创建Connection,PreparedStatement和ResultSet时,您需要确保在完成使用它们后将关闭这些资源。否则,您的JDBC连接将泄漏,从而可能导致数据库方面的问题。要关闭这些资源,建议使用try-with-resources语法(从Java 7开始可用):

    try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost/ri_db","test","test123")) {
        try(PreparedStatement stmt = con.prepareStatement("Select * from HALL where id = ?")) {
            // set parameters
            try(ResultSet rs = stmt.executeQuery()) {
                // here the work with result set is done
            } // here is closed result set
        } // here is closed prepared statement
    } catch(Exception e) {
        System.out.println(e));
    } // here is closed connection
    

关于这一点,可能会有不同的意见:有人说,仅关闭连接就足够了,带有结果集的准备好的语句将自动关闭。有人说,使用一个try-with-resources块进行连接和准备好的语句要短一些。

  1. 在访问ResultSet数据之前,您需要访问其第一行:

    if(rs.next()) { // works when you expect single row to be found
        // extract data from result set
    }
    

    while(rs.next()) { // works when you expect many rows to be found
        // extract data from result set
    }
  1. 方法getHall()返回Hall实例。您应该决定在异常情况下以及在找不到给定ID的数据的情况下应采取何种行为。在两种情况下都可以返回null(可能是最简单的解决方案),或者在两种情况下都可以引发一些异常。但是每种解决方案都有其自身的含义:当返回null时,应检入main()方法,确认getHall()方法的结果不为null;否则,返回null。引发异常时,您应该捕获该异常并以某种方式处理(例如,输出错误消息)。
© www.soinside.com 2019 - 2024. All rights reserved.