创建具有以下私有属性的类
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());
}
}
代码未执行,请帮助我修复它。
您的代码几乎是正确的,但是有一些小问题:
您的Hall类没有默认的构造函数,但是在HallDC类中,新的Hall实例是通过调用Hall hall = new Hall();
创建的。将默认构造函数添加到Hall类,或使用ResultSet中的值实例化它。
对于JDBC驱动程序v4,不再需要调用Class.forName("com.mysql.jdbc.Driver");
。只需确保对mysql JDBC驱动程序的依赖性在您的类路径中即可。
在创建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块进行连接和准备好的语句要短一些。
在访问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
}