我正在尝试使用java和mariadb创建Web应用程序,但是在尝试实现mariadb登录时遇到了问题。这是我的代码:
initSql: 包dao;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@WebServlet("/initSql")
public class initSql extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public initSql() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
Connection conn = null;
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
try {
Class.forName("org.mariadb.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/baza_new", "root","root");
System.out.println("db povezana");
}catch(Exception e){
//JOptionPane.showMessageDialog(null, e);
System.out.println("db NIiiJE povezana");
//return null;
}
}
}
LoginDAO:
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import dao.initSql;
public class LoginDAO {
static Connection con = null;
public static boolean validate(String username, String password, String type) {
boolean status = false;
try {
con = initSql.init();
System.out.println("1");
String query = "select * from users where username=? and password=?";
PreparedStatement pst = con.prepareStatement(query);
//pst.setString(1, type);
pst.setString(1, username);
pst.setString(2, password);
ResultSet rs = pst.executeQuery();
status= rs.next();
con.close();
}catch(Exception e) {System.out.print(e);}
return status;
}
}
,我得到标记: 无法从类型通用伺服器静态引用非静态方法 类型mistmatch无法从void连接到Connection 我对此问题有些犹豫。有人可以帮我解决我的代码吗?
答案 0 :(得分:2)
人们似乎忽略了代码中更广泛的问题。有一些标准可以遵循,例如大写等,但是总的来说,您还有一些更大的问题。
您不应该制作错误的initSql
实例,因为它是HttpServlet
,只是没有意义。当您不需要Connection
字段时,也可以使用静态/非静态引用。首先,将initSql#init
更改为返回Connection
,虽然我通常不建议以这种方式滥用static,但请将该方法本身设为static:
//returns a connection, requires no class instance
public static Connection init(ServletConfig config) { ... }
现在,我们可以通过调用以下方法来检索Connection实例:
Connection con = initSql.init();
总体上,您应该具有适当的类或设计来处理此问题,但对于简单的学习来说,这是“可以的”。
第二,您没有正确使用ResultSet
。 #next
将确定SQL结果中是否有可用的行指向,如果是,它将标记移动到下一行。您将使用它来检查是否可以检索结果:
ResultSet set = /* some sql query */;
String someField;
if (set.next()) {
//gets the value of the column "my_field"
someField = set.getString("my_field");
} else {
//no results!
someField = null;
}
或者,如果您要查找多个结果,则可以遍历#next
while (set.next()) {
//just one value out of many
String myField = set.getString("my_field");
}
在此用例中,可以检查该行是否存在,但是我个人会检查诸如用户权限之类的内容。如果您对敏感内容使用此类代码,则可能会暴露您不想要的内容。
总的来说,我将在代码的逻辑结构上做更多的工作,也许还会介绍Java的一些基础知识及其通用的编码标准(Google和Oracle为此提供了很好的指南)。
答案 1 :(得分:0)
initSql.init()
不是静态的,这不是MariaDB及其与Java的连接的问题:)要解决 this 错误,您可以在上述方法中添加static
。但是:由于您的代码中存在多个错误(例如,将void方法的结果分配给变量),因此也将不起作用。
答案 2 :(得分:0)
首先,您的类名称initSql应该具有大写的首字母以遵循约定。
第二,您应该创建InitSql的实例/对象,然后在该对象上调用方法init()或将init()方法设为静态。