检查MySQL Java中是否存在用户名
我有一个寄存器对话框,它实现了一个动作侦听器。如果用户输入的名称已经存在,我想在控制台上打印一条消息。如果用户名不存在,MySQL应该将其添加到数据库中。不幸的是,此代码无法工作:检查MySQL Java中是否存在用户名,java,mysql,database,Java,Mysql,Database,我有一个寄存器对话框,它实现了一个动作侦听器。如果用户输入的名称已经存在,我想在控制台上打印一条消息。如果用户名不存在,MySQL应该将其添加到数据库中。不幸的是,此代码无法工作: private void regButtonActionPerformed(java.awt.event.ActionEvent evt) { if(!userBox.getText().equals("")) {
private void regButtonActionPerformed(java.awt.event.ActionEvent evt) {
if(!userBox.getText().equals(""))
{
try
{
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/genx", "root", "Warlock1989");
Statement stmt = con.createStatement();
String query = "SELECT name FROM accounts";
ResultSet rs = stmt.executeQuery(query);
while(rs.next())
{
String uname = rs.getString("name");
if(!uname.equals(userBox.getText()))
{
PreparedStatement pstmt = con.prepareStatement("INSERT INTO accounts(name) VALUES(?)");
pstmt.setString(1, userBox.getText());
pstmt.executeUpdate();
System.out.println("Username " + userBox.getText() + " has been registered.");
}
else
{
System.out.println("Username " + userBox.getText() + " already exists.");
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
您当前的方法从数据库加载所有记录,并尝试查找用户,如果数据库包含大量记录,则会导致内存异常。所以 不要从数据库中获取所有记录,只需使用
where name=?
运行查询,以检查数据库中是否已存在用户,如下所示:
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
ResultSet rs = null;
try {
String userInput = userBox.getText();
String query = "SELECT name FROM accounts where name=?";
pstmt1 = con.preparedStatement(query);
pstmt1.setString(1, userInput);
rs = pstmt1.executeQuery();
if(rs.next()) {
pstmt2 = con.prepareStatement("INSERT INTO accounts(name) VALUES(?)");
pstmt2.setString(1, userInput);
pstmt2.executeUpdate();
System.out.println("Username " + userInput + " has been registered.");
} else {
System.out.println("Username " + userInput + " already exists.");
}
} catch(SQLException sqlexe) {
//add logging
} finally {
if(pstmt1 != null)
pstmt1.close();
if(pstmt2 != null)
pstmt2.close();
if(rs != null)
rs.close();
}
您当前的代码不会释放
resultset
&preparedstatement
对象,因此请确保您正在释放finally块中的资源 “不工作”是什么意思?打印堆栈跟踪没有堆栈跟踪。什么也没发生。它不叫if、else或catch。你的桌子空了吗?因为这样select将不返回任何行,rs.next()
将返回false
。。。