首页 > 解决方案 > 无法连接 MariaDB 和 Java

问题描述

我尝试使用 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;
}

}
}   

登录道:

    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;      
    }   
}

我得到了标记:无法从类型通用 servler 对非静态方法进行静态引用 类型不匹配无法从 void 连接到 Connection 我有点卡在这个问题上。有人可以帮我处理我的代码吗?

标签: javamariadb

解决方案


人们似乎忽略了代码中更广泛的问题。有一些标准可以遵循,比如大小写等,但总的来说你有一些更大的问题。

你不应该做出错误的实例,initSql因为它是一个HttpServlet,它只是没有意义。Connection当您不需要时,您还可以对字段进行静态/非静态引用。首先,更改initSql#init为 return a Connection,虽然我通常不建议以这种方式滥用 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 对此有很好的指南)。


推荐阅读