使用 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