java - 无法连接 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 我有点卡在这个问题上。有人可以帮我处理我的代码吗?
解决方案
人们似乎忽略了代码中更广泛的问题。有一些标准可以遵循,比如大小写等,但总的来说你有一些更大的问题。
你不应该做出错误的实例,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 对此有很好的指南)。
推荐阅读
- angular - 使用 datagrip 并与 VScode 连接
- swift - 在 SwiftUI 中单击列表项时如何隐藏底部标签栏?
- c++ - 在 Windows 上测量 c++ 程序的执行时间
- metaprogramming - TextGen 从一个概念生成不同的编程语言代码
- asp.net - 是否可以使用 dotNet 使用 Hangfire 每 20 秒运行一次作业?
- javascript - 如何在 FullCalendar 的每一行之前添加自定义 HTML?
- php - PhpUnit 无权访问公共目录
- html - 隐藏网格列,其余列重新分配
- angular - 是否可以根据条件从抽象模型中忽略/替换验证器?
- c++ - 通过基类指针进行奇怪的模板类转换