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

Posted

技术标签:

【中文标题】使用 DAO servlet 和 MYSQL 无法从查询中获取返回,堆栈跟踪返回 null【英文标题】:Using DAO servlets and MYSQL having trouble getting a return from the query, stack trace returning null 【发布时间】:2018-04-06 15:31:51 【问题描述】:

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

我目前遇到的问题是数据库 findbyusername 方法的查询返回一个空值并立即跳转到我的 servlet 中的捕获。

这是用户DAO

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,从中提取一个值,然后更新另一个表。

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);

【问题讨论】:

我认为你从未在 findByUserName 中创建过 PreparedStatement st 【参考方案1】:

您没有使用 prepareStatement。您需要先创建它,然后添加值,然后执行它。

@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;
    

【讨论】:

这在这样做方面完全正确,但是我似乎得到了一个空返回,但我不确定到底是什么原因造成的。 你从哪里得到空值? 当我通过 dao 并点击它返回 null 的准备好的语句时,我没有返回结果集,我仔细检查了表格和拼写。它说我有某种 sql 语法错误。 是的,这句话应该是 SELECT * FROM userdetails where User_Name = ?您需要添加 * 来告诉 sql 您想要接收什么,在这种情况下是所有列。 再次修复这个问题,谢谢你,现在我得到一个没有堆栈跟踪信息的 NullPointer,它在语句之后立即被捕获,就好像结果集不存在一样

以上是关于使用 DAO servlet 和 MYSQL 无法从查询中获取返回,堆栈跟踪返回 null的主要内容,如果未能解决你的问题,请参考以下文章

带有 JDBC 的 JSF 项目,我无法在 Servlet 上调用 DAO [重复]

带有 Servlet、JSP 和 MySQL 的 Java 中的 CRUD Web 应用程序,没有 DAO

无法使用 JSP/DAO/Servlet 更新表

DAO 和服务?

jsp-2 简单的servlet连接mysql数据库 增删改查

当 Servlet、JSP 和轻量级 DAO 层可以工作时,为啥要使用 MVC 框架?