jdbc进行查询,使用ResultSet的gesturing()函数获取查询到的值易出错的问题

本文详细介绍了在Java中如何正确地从数据库中获取username属性的值,强调了在使用rs.next()和rs.getString()方法前进行适当判断的重要性,以避免程序因查询不到数据而出现错误。同时,文章提供了完整的Servlet代码示例,展示了如何在注册验证过程中实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库有一个username属性,我是想用rs.next();    name = rs.getString("username");来获取username的值,

要注意,当查询到了数据之后才能这样获取到值,如果没有查询到值的话,执行name = rs.getString("username");会出错。这个语句后面的语句就执行不了了,

调试的时候可以用System.out.printIn();语句来进行调试,根据这个语句在哪一行可以输出,在哪一行输出不了,这样就可以判断出错误的位置。它输出的位置是在Console。

所以要使用这个语句之前需要对rs.next()进行判断,用if(rs.next()),或者while(rs.next())等都行;

package com.servlets;

import java.io.Console;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javafx.scene.control.Alert;
/**
 * Servlet implementation class RegisterValidate
 */
@WebServlet("/RegisterValidate")
public class RegisterValidate extends HttpServlet {
	private static final long serialVersionUID = 1L;
	// JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf8";
    
    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "123456"; 
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RegisterValidate() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement stmt = null;
           //解决中文乱码
      		response.setContentType("text/html;charset=utf-8");
      		//请求解决乱码
      		request.setCharacterEncoding("utf-8");
      		//响应解决乱码
      		response.setCharacterEncoding("utf-8");
      		
      		String usname = request.getParameter("username");
    		String  pword = request.getParameter("password");
        PrintWriter out = response.getWriter();
        try{
            // 注册 JDBC 驱动器
            Class.forName("com.mysql.jdbc.Driver");
            // 打开一个连接
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
            String sql;
            sql = "SELECT username,password FROM user where username=?";
            // 执行 SQL 查询
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, usname);
            ResultSet rs = stmt.executeQuery();
            
            //原来我是这样做的,一直出错,找了半天才找出错误
            // 展开结果集数据库
//            while(rs.next()){
                // 通过字段检索
//              String  name = (String)rs.getString("username");
//              String  pwd = (String)rs.getString("password");
//            	if(usname.equals(name))
//            	{
//            		request.getRequestDispatcher("registerfail.jsp").forward(request,response);
//            	}
//            	else
//            	{
//            		//插入数据
//                	String sql1; 
//                    sql1 = "insert into user(username,password) values(?,?) ";
//                    PreparedStatement stmt1 = conn.prepareStatement(sql1);
////                    stmt1.setInt(1, 3);
//                	stmt1.setString(1, usname);
//                	stmt1.setString(, pword);
//                    int i = stmt1.executeUpdate();
//                	request.getRequestDispatcher("registerSuccess.jsp").forward(request,response);
//            	}
            
            
                if(rs.next())
                {
                	request.getRequestDispatcher("registerfail.jsp").forward(request,response);
                }
                else
                {
                	//插入数据
                	String sql1; 
                    sql1 = "insert into user(username,password) values(?,?) ";
                    stmt = conn.prepareStatement(sql1);
                	stmt.setString(1, usname);
                	stmt.setString(2, pword);
                    int i = stmt.executeUpdate();
                	request.getRequestDispatcher("registerSuccess.jsp").forward(request,response);
                }
//            }
            
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        } catch(SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch(Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        }finally{
            // 最后是用于关闭资源的块
            try{
                if(stmt!=null)
                stmt.close();
            }catch(SQLException se2){
            }
            try{
                if(conn!=null)
                conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值