2013-08-08 5 views
0

Заранее благодарим за любую помощь. Я создаю приложение Database - Client, используя java в Eclipse. Я использую MySQL 5.6 для моей базы данных. У меня есть метод создания и возврата объекта подключения, который я буду использовать для запроса базы данных, и метода для возврата всех строк в таблице в виде массива JSON. Проблема возникает в методе запроса при попытке вызвать метод подключения.База данных запросов Java Mysql с подключением

at: try { 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; 
    } 
} 

дао код пакета ниже:

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()); делает работу

ответ

3

В вашем методе returnAllParts#queryReturnAllParts измените

con.getDBConnection(); 

По

con = getDBConnection(); 

Проблема заключается в том, что con является переменной от java.sql.Connection и не имеет getDBConnection способ. Так как ваш текущий класс returnAllParts расширяет класс DBConnect, он может без проблем получить доступ к методу public Connection getDBConnection.

System.out.println (con.getUser()); делает работу

Это потому, что в вашем классе Main#main вы указали DBConnect con. Не путайте эту переменную с переменной con, объявленной другими способами.


Не напрямую связанно с проблемой, но я предлагаю вам некоторые улучшения текущего кода/дизайн:

  • Изменить название вашего returnAllParts класса для чего-то более значимого для будущих читателей (даже вас через несколько дней или недель станет в будущем читателем вашего кода). От чтения вашего кода, похоже, этот класс должен быть переименован в PartList.
  • Используйте пул соединений с базой данных, а не вручную получайте свои соединения. Есть библиотеки, которые обрабатывают это для вашего любимого BoneCP
  • Возможно, вы новичок в программировании, так что было бы лучше, если вы начнете правильно и разработаете свое приложение в слоях (дальше читайте: Multitier architecture). С этой базой мы можем сказать, что DAO (или служба данных, зависит от того, как вы это называете) должны содержать только методы доступа и получения данных таким образом, чтобы другие клиенты могли потреблять их по своему усмотрению, так как это было бы лучше вернуть объект List<PartList>, а другой слой в вашем приложении (вероятно, самый близкий к презентации) применит преобразование из ваших объектов в строку JSON.
  • Для проектной точки зрения это будет способом лучше, если ваши объекты доступа к базе данных используют объект DBConnect вместо того, чтобы расширяться от него. Таким образом, у вас может быть один объект DBConnect для каждой конфигурации подключения к базе данных, связанный со всеми соответствующими DAO.
+0

+1 хороший улов на продолжениях. –

+0

переход от con. to con = исправлена ​​проблема внутри метода returnAllParts - спасибо. Я планировал использовать класс returnAllParts для хранения методов запроса к базе данных, я просто тестировал исходный метод. Будет ли что-то в соответствии с требованиями DatabaseQuery более уместным? – Danny

+0

@ Danny, это действительно зависит от того, что класс будет делать. Если 'returnAllParts' связан с любым типом запроса, то' DatabaseQuery' будет правильным именем, если оно просто связано с таблицей 'part list', тогда' PartListDAO' будет лучшим именем. –

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 именования.)

+1

+1 и OP также должны рассмотреть возможность использования источника данных. Я имею в виду, что если кто-то уже прилагает усилия для создания классов вспомогательных БД, почему бы не реализовать пул соединений? –

+0

@Ravi В его коде есть несколько избыточных вещей. OP должен начинаться с настройки и использования DataSource, как вы предлагаете. –

+0

Я пытался найти, как реализовать класс DataSource, но я не мог понять это, так как я не использую уровень webservice для прохождения. Я планирую создать файл свойств, который в конечном итоге может быть установлен из приложения gui. – Danny

0

В вашем методе «returnAllParts» вы определяете Connection con ;.

Это Connection - объект java.sql.Connection, и у него нет способа, который вы ищете. Убери это.

+0

Должно быть, я испортил это при форматировании сообщения. Это должно быть Connection con = null; Я обновил исходный код – Danny

Смежные вопросы