0

助けてくれてありがとう。Eclipse で Java を使用してデータベース - クライアント アプリケーションを作成しています。データベースに MySQL 5.6 を使用しています。データベースのクエリに使用する接続オブジェクトを作成して返すメソッドと、テーブル内のすべての行を JSON 配列として返すメソッドがあります。接続メソッドを呼び出そうとすると、クエリ メソッドで問題が発生します。

at: { con.getDBConnection(); を試してください。getDBConnection(); にエラーがあることを教えてくれます。それが与える提案は、キャストを「con」に追加することです。

メインメソッドからコンパイルするクエリメソッドを取得できません。

package binaparts.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.*;
import org.json.JSONArray;

import binaparts.util.ToJSON;

public class returnAllParts extends DBConnect{

    public JSONArray queryReturnAllParts() throws Exception{

        PreparedStatement query = null;
        Connection con = null;

        ToJSON converter = new ToJSON();
        JSONArray json = new JSONArray();

        try{
            con.getDBConnection();
            query = con.prepareStatement("SELECT * " + "from `parts list`" );

            ResultSet rs = query.executeQuery();

            json = converter.toJSONArray(rs);
            query.close();
        }catch(SQLException SQLex){
                SQLex.printStackTrace();
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            if(con != null){
                con.close();
            }
        }
        return json;
    }
}

以下のdaoパッケージコード:

package binaparts.dao;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import com.mysql.jdbc.PreparedStatement;

public class DBConnect {

    private Statement st = null;
    private ResultSet rs = null;
    private Connection con = null;  
    private PreparedStatement pst = null;

    private String serverName = "localhost";
    private String portNumber = "3306";
    private String dbms = "mysql";
    private Object userName = "dwilson";
    private Object password = "abc";

    public Connection getDBConnection() throws SQLException {

        Properties connectionProps = new Properties();
        connectionProps.put("user", this.userName);
        connectionProps.put("password", this.password);

            try{
                con = DriverManager.getConnection("jdbc:" + this.dbms + "://" + this.serverName + ":" + this.portNumber + "/", connectionProps);
            }catch(Exception ex){
                ex.printStackTrace();
                con = null;
            }finally{
                if(con != null){
                     System.out.println("Connected to database");
                }
            }
        return con;
    }
    public String getUser(){
        try{
            DatabaseMetaData dmd = con.getMetaData();
            String username = dmd.getUserName();
            //System.out.println("Current User: "+username);
            return username;
        }catch(Exception ex){
            System.out.println(ex);
            ex.printStackTrace();
            return null;
        }
    }
}

以下の主な方法:

public class Main{

    public static void main(String[] args){

        DBConnect con = new DBConnect();
        try {
            con.getDBConnection();
            System.out.println(con.getUser());
            System.out.println(con.queryReturnAllParts());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //Login loginGUI = new Login();
        //MainFrames m = new MainFrames();
        //m.displayGUI();
    }
}

System.out.println(con.getUser());機能します

4

3 に答える 3

3

あなたのreturnAllParts#queryReturnAllParts方法では、変更

con.getDBConnection();

con = getDBConnection();

問題は、それconが変数 fromであり、メソッドjava.sql.Connectionがないことです。getDBConnection現在のreturnAllPartsクラスはクラスを拡張しているため、問題なくメソッドにDBConnectアクセスできます。public Connection getDBConnection

System.out.println(con.getUser()); 動作します

これは、Main#mainクラスで を宣言したためDBConnect conです。conこの変数を他のメソッドで宣言された変数と混同しないでください。


問題とは直接関係ありませんが、現在のコード/設計を改善することをお勧めします。

  • クラスの名前を、returnAllParts将来の読者にとってより意味のあるものに変更します (数日または数週間で、あなたもコードの将来の読者になります)。コードを読むと、このクラスの名前を に変更する必要があるようPartListです。
  • 接続を手動で取得する代わりに、データベース接続プールを使用します。あなたのようなBoneCPのためにこれを処理するライブラリがあります
  • おそらくあなたはプログラミングに慣れていないので、正しい方法で開始し、アプリケーションをレイヤーで開発することをお勧めします (さらに読む:多層アーキテクチャ)。これに基づいて、DAO(またはデータサービス、名前の付け方によって異なります)には、他のクライアントが必要に応じてデータを消費できる方法でデータにアクセスして取得するメソッドのみを含める必要があると言えます。オブジェクトをより適切に返し、List<PartList>アプリケーション内の別のレイヤー (おそらくプレゼンテーションに最も近いレイヤー) がオブジェクトから JSON 文字列への変換を適用します。
  • 設計の観点からは、データベース アクセス オブジェクトがオブジェクトから拡張するのではなく、オブジェクトを使用する方がはるかに優れています。DBConnectこのようにDBConnectして、関連するすべての DAO に関連付けられたデータベース接続構成ごとに 1 つのオブジェクトを持つことができます。
于 2013-08-08T14:13:43.673 に答える
1

このコードでは

    PreparedStatement query = null;
    Connection con ;

    ToJSON converter = new ToJSON();
    JSONArray json = new JSONArray();

    try{
        con.getDBConnection();

変数conの型java.sql.Connectionは ではなくDBConnectです。その型にはメソッドがありませんgetDBConnection()。私はあなたが使用するつもりだったと信じています

 con = this.getDBConnection(); 

あなたの最初のreturnAllPartsクラスで(これは拡張しますDBConnect)。(Java 命名規則を使用してください。)

于 2013-08-08T14:12:57.943 に答える
0

「returnAllParts」メソッドで を定義しますConnection con ;

これConnectionは java.sql.Connection オブジェクトであり、求めるメソッドがありません。それを除く。

于 2013-08-08T14:16:06.597 に答える