使用 DAO servlet 和 MYSQL 无法从查询中获取 return,堆栈跟踪 returning null

Using DAO servlets and MYSQL having trouble getting a return from the query, stack trace returning null

我所有的单功能 servlet(几乎只有对数据库的更新)都在工作。但是,我进入了一个更复杂的领域,我需要查询数据库,提取一个值并根据返回的值进行更新。我对我做错了什么有点困惑,没有返回堆栈跟踪,但是我得到了一个空指针异常。代码如下

我目前遇到的问题是 DB findbyusername 方法的查询返回空值并立即跳转到我的 servlet 中的 catch。

这是 userDAO

public interface UserDAO {

 List<User> findAll();
 User findById(String id);
 User findByUserName(String username);
 User findByUserName(String username, Connection conn)throws SQLException;}

这是在 mysqluserdao 中开发的方法。

@Override
public User findByUserName(String username, Connection conn) throws SQLException {
    java.sql.PreparedStatement st = null;
    ResultSet rs =null;
    try {
        rs = st.executeQuery("SELECT FROM userdetails where User_Name =?");
        st.setString(1, username);
        User user = new User();
        user.setUserName(rs.getString("User_Name"));
        user.setFirstName(rs.getString("First_Name"));
        user.setLastName(rs.getString("Last_Name"));
        user.setEmailAddress(rs.getString("Email_Address"));
        user.setType(rs.getString("Type"));
        user.setPassword(rs.getString("password"));
        return user;
    }catch(Exception e) {
        throw e;
    }


}

这是我尝试查询的 servlet,提取一个值,然后更新一个不同的 table。

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    //create connection with work object and make strings to do the work
    Confirmation work = new Confirmation();
    String confirmation = "You have succsessfully rented out the vehicle";

    String carid = req.getParameter("id");
    String username = req.getParameter("User_Name");

    Connection conn = null;
    try {
        //connect with the DB
        conn = DBConnector.createConnection();
        conn.setAutoCommit(false);
        UserDAO userDao = new MySQLUserDAO();

        User user = userDao.findByUserName(username, conn); 
        user.setCarRental(carid);
        userDao.updateUser(user.getId(), user, conn);

        CarDAO carDao = new MySQLCarDAO();
        Car car = carDao.findById(carid, conn);
        car.setAvailable("Unavailable");
        carDao.updateCar(car.getId(), car, conn);}

您没有使用 prerpareStatement。需要先创建,然后加值再执行。

@Override
public User findByUserName(String username, Connection conn) throws SQLException {
    PreparedStatement st = null;
    ResultSet rs =null;
    try {
        st = conn.prepareStatement("SELECT * FROM userdetails where User_Name = ?");
        st.setString(1, username);
        rs = st.executeQuery();
        User user = new User();
        user.setUserName(rs.getString("User_Name"));
        user.setFirstName(rs.getString("First_Name"));
        user.setLastName(rs.getString("Last_Name"));
        user.setEmailAddress(rs.getString("Email_Address"));
        user.setType(rs.getString("Type"));
        user.setPassword(rs.getString("password"));
        return user;
    }catch(SQLException e) {
        throw e;
    }
}