使用 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;
}
}
我所有的单功能 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;
}
}