Как получить записи из Oracle базы данных, используя Java - PullRequest
0 голосов
/ 23 февраля 2020

Я изучаю базу данных с Java, используя JDB C. Я создал программу svery basi c после прочтения некоторых статей на JDBC на inte rnet. Мой код не выдает никакой ошибки, но я также не получаю вывод. Вот мой код:

Это мой код подключения: DataService

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class DataService {
        static Connection con;
        public static void main(String args[]){
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                con=DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:xe","system","scott");
            }
            catch(Exception e){ 
                System.out.println(e);
            }
        }

        public ResultSet getRecords() {
            System.out.println("inside getRecords()");
            ResultSet rs=null;
            try {
                System.out.println("Inside Rs loop");
                Statement stmt=con.createStatement();
                rs=stmt.executeQuery("select * from emp");
                System.out.println("RS before entering while: "+rs);
                while(rs.next())
                    System.out.println("Inside while loop");
                    System.out.println("Data: " +rs.getInt(0)+"  "+rs.getString(1));
            } catch (SQLException ex) {
                Logger.getLogger(DataService.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("Before sending: "+rs);
            return rs;
        }
    }

А вот мое приложение MainFrame. java

public class MainFrame extends Application {

    ...

    @Override
    public void start(Stage primarystage) {        
        ...
        try {
            System.out.println("Inside try");
            DataService dataservice = new DataService();
            System.out.println("Result set: "+dataservice.getRecords());
        } catch (Exception e) {
            //TODO: handle exception
        }
    }
}

Я получаю этот вывод:

Внутри try

внутри getRecords ()

Внутри RS 1 oop

Я не вижу никакой информации, связанной с записями. Также я проверил select * from emp. В этой таблице уже есть строки. Я упускаю что-то очень важное здесь. Пожалуйста, поправьте меня.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

При создании экземпляра DataService DataService dataservice = new DataService(); метод main () не вызывается, поэтому переменная conn не инициализируется и остается нулевой. После этого при вызове Statement stmt=con.createStatement(); выдается исключение NullPointerException (NPE). Этот NPE не перехватывается ни в этом блоке перехвата catch (SQLException ex), потому что он перехватывает только SQLExceptions, ни в этом catch (Exception e), потому что не предусмотрена логика обработки c.

Первый шаг в создании кода - добавление некоторой логики обработки исключений c в метод start () класса MainFrame (никогда не оставляйте пустые блоки catch, это считается антипаттерном).

Затем переместите logi c для инициализации соединения либо в метод getRecords (), сделав его локальной переменной, либо в конструктор DataService, чтобы при обращении к нему была инициализирована переменная conn.

Следующая большая проблема закрывает переменные Connection, Statement и ResultSet после окончания работы с ними. Начиная с java 7, вы можете использовать синтаксис try-with-resources для обработки таких ресурсов.

Также я бы рекомендовал обрабатывать ResultSet внутри метода getRecords (), не раскрывая его вне класса DataService .Этот класс действует как Объект доступа к данным (DAO), и было бы лучше хранить детали реализации внутри. Вместо этого вы можете создать простой класс Employee, экземпляры которого можно инициализировать внутри while(rs.next()) l oop, заполнить значениями из набора результатов и добавить в некоторую коллекцию. Эта коллекция может быть возвращена из метода getRecords ().

0 голосов
/ 23 февраля 2020

вы должны получить экземпляр соединения в том же потоке, в котором используете его, переместить создание соединения в метод getRecords

...