我想做一个网络服务,与本地主机上的一个数据库通信。数据库的名称是“Reservation”,只有一个名为“seats”的矩阵。这个表有4个字段:(int) ID,(varchar) location,(varchar) class (int) taken。例如,一条记录有以下字段:ID=1, location="Window", class="Economy", taken=0。我希望我的 Web 服务更新一条记录,该记录的字段为零。
我的代码是:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService( name = "Reservation", serviceName = "ReservationService" )
public class ReservationSOAP
{
private static final String DATABASE_URL = "jdbc:mysql://localhost:8080/Reservation";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
private Connection connection;
private PreparedStatement lookupSeat;
private PreparedStatement reserveSeat;
// a WebMethod that can reserve a seat
@WebMethod( operationName = "reserve" )
public boolean reserve( @WebParam( name = "seatType" ) String seatType, @WebParam( name = "classType" ) String classType )
{
try
{
connection = DriverManager.getConnection( DATABASE_URL, USERNAME, PASSWORD );
lookupSeat = connection.prepareStatement( "SELECT ID FROM seats WHERE taken = ? AND location = ? AND class = ?" );
lookupSeat.setInt( 1, 0 );
lookupSeat.setString( 2, seatType );
lookupSeat.setString( 3, classType );
ResultSet resultSet = lookupSeat.executeQuery();
// if requested seat is available, reserve it
while ( resultSet.next() )
{
int seat = resultSet.getInt( 1 );
reserveSeat = connection.prepareStatement( "UPDATE seats SET taken = 1 WHERE ID = ?" );
reserveSeat.setInt( 1, seat );
reserveSeat.executeUpdate();
return true;
} // end if
return false;
} // end try
catch ( SQLException e )
{
e.printStackTrace();
return false;
} // end catch
catch ( Exception e )
{
e.printStackTrace();
return false;
} // end catch
finally
{
try
{
lookupSeat.close();
reserveSeat.close();
connection.close();
} // end try
catch ( Exception e )
{
e.printStackTrace();
return false;
} // end catch
} // end finally
} // end WebMethod reserve
} // end class Reservation
问题是 web 方法返回 False,因为数据库没有更新。
最佳答案
首先 - 你应该使用 try-with-resource。您的语句 reserveSeat
可能仍然是 null
在您的 finally
block 中抛出 NullPointerException,导致返回 false。 ResultSet
从不 关闭。
您在 while()
的右大括号上注释 //end if
我会为您的代码推荐局部变量。
考虑这个改变的实现。我还加入了一些 System.out.println
,使您能够检查接收到的参数是否真的适用于您的 SQL。
@WebService(name = "Reservation", serviceName = "ReservationService")
public class ReservationSOAP {
private static final String DATABASE_URL = "jdbc:mysql://localhost:8080/Reservation";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
// a WebMethod that can reserve a seat
@WebMethod(operationName = "reserve")
public boolean reserve(@WebParam(name = "seatType") String seatType,
@WebParam(name = "classType") String classType) {
try (Connection connection = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
PreparedStatement lookupSeat = connection
.prepareStatement("SELECT ID FROM seats WHERE taken = ? AND location = ? AND class = ?")) {
System.out.println("seatType: " + seatType);
System.out.println("classType: " + classType);
lookupSeat.setInt(1, 0);
lookupSeat.setString(2, seatType);
lookupSeat.setString(3, classType);
try (ResultSet resultSet = lookupSeat.executeQuery()) {
// if requested seat is available, reserve it
if (resultSet.next()) {
int seat = resultSet.getInt(1);
System.out.println(
"Found unreserved seat: " + seat + " in class " + classType + " and seatType " + seatType);
try (PreparedStatement reserveSeat = connection
.prepareStatement("UPDATE seats SET taken = 1 WHERE ID = ?")) {
reserveSeat.setInt(1, seat);
reserveSeat.executeUpdate();
return true;
}
}
}
System.out.println("No Seat found.");
return false;
} // end try
catch (SQLException e) {
e.printStackTrace();
return false;
}
} // end WebMethod reserve
} // end class Reservation
关于java - 使用 netbeans 执行 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580767/