【问题标题】:How to call method from a database connection class如何从数据库连接类调用方法
【发布时间】:2015-03-31 16:12:46
【问题描述】:

最近我正在制作一个小型系统,其中我有 3 个使用 Ms Access 作为数据库的包

1)类---->基于OOP概念

2)GUI-----> Jform + .java 文件

3)图片---->只是我制作的一些图标

我在 Classes 包中创建了一个 DBConnection 类(使用 UCanAccess)。

import java.sql.*;
public class DBConnection {
public DBConnection() {

    try {
        String driver = "net.ucanaccess.jdbc.UcanaccessDriver";
        Class.forName(driver);
        String dbPath = "jdbc:ucanaccess://E:\\University Docs\\BSCS 3A\\Object Oriented Programming\\LibraryManagementSystem\\LMSDatabase.accdb";
        Connection con = DriverManager.getConnection(dbPath);
        Statement st = con.createStatement();
        System.out.println("Connection Succesful");
        ResultSet rsObject = st.executeQuery(dbPath);
        con.close();
    } catch (Exception sqlEx) {
        System.out.println(sqlEx);
}
}                    }

接下来我创建了一个Loger 类,用于在同一个包中创建登录和注销方法。问题是如何使用DBConnection 类在这个类中执行我的查询?这是代码对于Loger

public class Loger { 

private String lname, lpassword;

public Loger(String lname, String lpassword) {
    this.lname = lname;
    this.lpassword = lpassword;
    //Login();
}


public String Login()throws ClassNotFoundException,SQLException
{
    DBConnection d1 = new DBConnection();
    String query1 = "SELECT * FROM Admintable WHERE Admin_ID = ' "+this.lname+" AND Admin_Password = '"+this.lpassword+"'" ;

    return "Success!";

}                   }

简而言之,我被困住了,请帮忙,因为我必须创建更多类(基于OOP)并且只在这些类中创建方法来执行不同的查询。

【问题讨论】:

  • 你面临 OOP 的问题。为什么要标记“netbeans”?

标签: java database oop ucanaccess


【解决方案1】:

您需要 mysql-connector-java API,该 API 将通过项目属性 -> 库 -> 添加 jar 导入到您的项目中。

按照示例代码:

public class Database {
    Connection conObj;
    Statement stObj;

    public Database() throws SQLException , ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver"); /*Loading Driver class for JDBC*/

 conObj = DriverManager.getConnection("jdbc:mysql://localhost:3306/mytestdb","root",""); /*Creating Connection class's Object which consist of database url , username and password*/

stObj = conObj.createStatement();/*Creating Statement Class's object which is responsible for performing all db tasks*/
    }

    public void fetchData() throws Exception
    {
        String query = "select * from user";
        ResultSet rs = stObj.executeQuery(query);

        while(rs.next())
        {
            System.out.println("Name : "+rs.getString("name"));
            System.out.println("age : "+rs.getInt("age"));
        }
    }

    public void insertData(String name, int age) throws SQLException 
    {
        if(name!=null && age!=0)
        {
            String query = "insert into user values(\""+name+"\","+age+")";
            int a = stObj.executeUpdate(query);

            if(a == 1)
            {
                System.out.println("Update Successful");
            }
            else
            {
                System.out.println("Update Failed");
            }
        }
    }

    void deleteData() {
    }

    void deleteData(String name) throws Exception 
    {
        String query = "delete from user where name = \""+name+"\"";
        int a = stObj.executeUpdate(query);

        if(a == 1)
        {
                System.out.println("delete Successful");
        }
        else
        {
                System.out.println("deletion Failed");
        }
    }
}

public class main {

    public static Database d;
    public static Scanner sc;

    static 
    {
        try{
            sc = new Scanner(System.in); 
            d = new Database();
        }
        catch(Exception e)
        {
            throw new RuntimeException(e);
        }
    }

  public static void main(String... q)
  {
      main mn = new main();
      try{
          System.out.println("Enter your option");
          System.out.println("1) fetch data");
          System.out.println("2) insert data");
          System.out.println("3) delete data");
          System.out.println("\n /////////////////////////// \n");
          int a = sc.nextInt();
          switch(a)
          {
              case 1 :
                  mn.fetchData();
                  break;
              case 2 :
                  mn.takeDetails();
                  break;
              case 3 :
                  mn.deleteData();
                  break;
              default:
                  System.out.println("Try Again");
                  break;
          }
      }
      catch(Exception e)
      {
          e.printStackTrace();
      }
  }

  public void takeDetails() throws Exception
  {
     System.out.println("Enter name");
     String name = sc.next();
     System.out.println("Enter age");
     int age = sc.nextInt();
     d.insertData(name, age);
  }

  public void fetchData() throws Exception
  {
      d.fetchData();
  }

  private void deleteData() throws Exception {
        System.out.println("Enter name of the user whose record is to be deleted");
        String name = sc.next();
        d.deleteData(name);
    }
}

阅读中间写的 cmets 以获得解释。完整教程请按照link 希望这会有所帮助。

【讨论】:

  • 非常感谢先生,但我对API术语不熟悉,还有一点是Netbeans 8.0不再支持JDBC了
  • API 是 jar 文件,即您需要的其他类。在您的情况下,它是 mysql 驱动程序。其次,以上代码仅在 netbeans 8 上开发,JDBC 是一个概念,因此它的支持没有问题,或者我无法理解您的问题。
  • @ZMKhan 你大错特错了。 NetBeans 没有任何选择,只能支持 JDBC。它是 Java 语言的一部分。
  • @EJP 你也许是对的,但我使用 UcanAccessDriver 因为我只知道 Oracle 已经删除了 ODBC 桥连接。
【解决方案2】:

你设计课程的方式,你可以这样做:

DBconnection() 中省略这两行以使用连接:

ResultSet rsObject = st.executeQuery(dbPath);
con.close();

并创建stconn 等 DBConnection 成员变量,以便您可以在课堂外使用它们。

Logger 类中做:

public String Login()throws ClassNotFoundException,SQLException
{
    try {
        DBConnection d1 = new DBConnection();
        String query1 = "SELECT * FROM Admintable WHERE Admin_ID = ' "+this.lname+" AND Admin_Password = '"+this.lpassword+"'" ;
        Resultset rs = d1.st.executeQuery(query1);  // assuming st is "default". 
                                                    // or u can make st private and use a get method (better) 
        // Check login, set to a "stringObject" //declare outside the scope of try-catch        
    } catch(Exception ex) {
        //
    }
    return stringObject; 
}   

但我会以不同的方式设计课程。

我会在DBConnection 中创建一个登录方法。喜欢

public boolean login(String id, String pass) {
    boolean loggedin = false;
    try {
        // Connect to db
        // execute SQL
        // modify loggedin if necessary
    } catch (...) {
    } finally {
        try {
            // close connections
        } catch(...) {
        }
    }
    return loggedin;
}

然后在login() 中的Logger

DBConnection d1 = new DBConnection(); // no connections in constructor
boolean logged = d1.login(this.lname, this.lpassword);

【讨论】:

  • 因为你的拼写和你的建议,声明应该是类的成员。两者都不合适。
  • 不知道这里不能使用短格式。我的回答第一部分的建议是根据他的设计方式。但是,我认为第二部分没有任何问题。而且我想我把这两个部分用标题清楚地分开了。
猜你喜欢
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
相关资源
最近更新 更多