Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Помогите со студенческой задачей JDBC + Postgre

455  
Guinevra гость31.01.21 16:12
Guinevra
31.01.21 16:12 

Нид хелп в программировании!

Одна студенческая задача, но срочно: JDBC + Postgres.
Может, найдётся добрый грамотный человек, небезвозмездно.
С SQL вроде, нет проблем.

Нужно “заполнить шаблон” — в.java файле написать функции получения соединения в БД, выборки данных из БД и положить эти данные в set.
Учебная БД в Postgre есть, работает, реагирует.

Соединение из .java файла с базой данных осилили. А права на выборку из таблиц жадный Postgre не даёт: то ли роль, то ли пользователь не имеет привилегий — хз.
Ну и в Java опыта считай что нет, только С++ немного.

Помогите кто может, пожалуйста!

(Медленно и старательно за пару дней я, наверное, справилась бы и сама. Но срок сдачи поджимает, а хочется успеть до конца локдауна)

Mindfulness as Game
#1 
koder патриот31.01.21 18:35
koder
NEW 31.01.21 18:35 
в ответ Guinevra 31.01.21 16:12, Последний раз изменено 31.01.21 18:38 (koder)

я никогда не работал с Postgres, но общий принцип должен быть один и тот же. Для начала вам нужен любая прога, что бы без Явы подсоединиться к базе данных и сделать выборку из нужной таблицы. Если вы увидите результаты выборки, то у вас есть правильная база данных, к ней есть доступ, в базе есть таблица и в таблице есть данные. Потом можно будет переходить к Яве. Напишите код, который у вас есть.

#2 
AlexNek патриот31.01.21 19:09
AlexNek
NEW 31.01.21 19:09 
в ответ Guinevra 31.01.21 16:12

Как уже сказали, попробуйте вначале прочитать вашу базу одним из этих редакторов

https://dbeaver.io/

https://www.pgadmin.org/

#3 
Murr патриот31.01.21 20:18
Murr
NEW 31.01.21 20:18 
в ответ Guinevra 31.01.21 16:12

то ли роль, то ли пользователь не имеет привилегий — хз

-----

Это либо в задании, либо у преподавателя - тут у всех хрустальные шары сданы в ломбард, а без них - никак...

#4 
Guinevra гость31.01.21 20:48
Guinevra
NEW 31.01.21 20:48 
в ответ koder 31.01.21 18:35

Законнектилась!))
В расширении к DB_URL добавила именную схему и попадаю теперь в "свою" базу с 7 таблицами. До этого Connection выводил в public-схему с одноименными таблицами, 😅.
Теперь с привилегиями всё в порядке, кажется.

База данных работает. Создана в psql-Shell: таблицы, ключи, пара процедур и пара триггеров. Через psql-Shell выборка и запись данных идёт как задано, включая автоматический пересчёт бонусных миль на счету пассажира после покупки очередного билета.

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

//STEP 1. Import required packages

import java.sql.*;

public class JDBCExample {

// JDBC driver name and database URL

static final String JDBC_DRIVER = "org.postgresql.Driver";

static final String DB_URL = "jdbc:postgresql://100.100.00.00:0000/stnxxxxx";

// Database credentials

static final String USER = "hxxx";

static final String PASS = "yyy";

public static void main(String[] args) {

Connection conn = null;

Statement stmt = null;

try{

//STEP 2: Register JDBC driver

Class.forName("org.postgresql.Driver");

//STEP 3: Open a connection

System.out.println("Connecting to database...");

conn = DriverManager.getConnection(DB_URL, USER, PASS);

//STEP 4: Execute a query

System.out.println("Testing");

stmt = conn.createStatement();

String sql = "SELECT * FROM FLUG";

stmt.executeQuery(sql);

System.out.println("Tested");

}catch(SQLException se){

//Handle errors for JDBC

se.printStackTrace();

}catch(Exception e){

//Handle errors for Class.forName

e.printStackTrace();

}finally{

//finally block used to close resources

try{

if(stmt!=null)

stmt.close();

}catch(SQLException se2){

}// nothing we can do

try{

if(conn!=null)

conn.close();

}catch(SQLException se){

se.printStackTrace();

}//end finally try

}//end try

System.out.println("Goodbye!");

}//end main

}//end JDBCExample



Но для сдачи нужна функция getConnection() — и ещё пять других java-функицй в файле (который я сейчас попытаюсь подвесить)


Mindfulness as Game
#5 
Guinevra гость31.01.21 20:51
Guinevra
NEW 31.01.21 20:51 
в ответ Murr 31.01.21 20:18, Последний раз изменено 31.01.21 20:59 (Guinevra)

Вот и профессор то же самое написал. Вы, говорит, грантом его, грантом.

А оказался DB_URL

Mindfulness as Game
#6 
koder патриот31.01.21 21:12
koder
NEW 31.01.21 21:12 
в ответ Guinevra 31.01.21 20:48

1. Если я правильно понял, то у вас все работает

2. Подключать драйвер нужно один раз

3 . А вот создавать Connection нужно каждый раз, когда вы лезете в базу. У вас написано правильно, с обязательным закрытием соединения в любом случае. Создание соединения можно вынести в отдельный метод и возвращать, но это неправильно. Потому что это всего одна строчка кода, а вот принцип "прибить соединение там, где создавали" нарушится. Ну аспект можно создать, Но это уже не учебный код.

4. Я не понял, какие проблемы у вас остались и нужна ли вам ещё помощь

#7 
koder патриот31.01.21 21:14
koder
NEW 31.01.21 21:14 
в ответ koder 31.01.21 21:12, Последний раз изменено 31.01.21 21:16 (koder)
stmt.executeQuery(sql);


Не знаю, важно ли, но вы просто выполняете команду. Без использования результатов выборки.


ResultSet rs = stmt.executeQuery(query);
#8 
Guinevra гость31.01.21 22:03
Guinevra
NEW 31.01.21 22:03 
в ответ koder 31.01.21 21:14

Спасибо!
Да, я в курсе. Я пока только соединение вычистила, чтобы стектрейс не плевался.
Так-то до executeQuery всё выглядело как бы нормально. А обращение к конкретной таблице выдавало ошибку.



Mindfulness as Game
#9 
Guinevra гость31.01.21 22:16
Guinevra
NEW 31.01.21 22:16 
в ответ koder 31.01.21 21:12

Спасибо, да!

Всё работает
4. Собственное java-функции не выполнены.
Я и java живём в разных географиях. И поэтому я не знаю, насколько большой проблемой для меня будет написать 6 работающих функций, к которым мне ещё нужно гуглить шаблоны и примеры, завтра до трёх часов дня.

С ODBC я уже работала, логику выборки данных как таковую вроде понимаю. А JDBC....
То есть вот это для меня немного по-китайски:

/**

* returns all takeoffs of the given destination airport.

*

* @param iata the airport to list the takeoffs from

* @param dbConnection the database Connection to execute the statement on

* @return returns a Set of takeoffs. Returns an empty Set if there are no.

* @throws SQLException

*/

Set<Object> getTakeoffs(String iata, Connection dbConnection) throws SQLException;


Но возьмусь я за это завтра))




Mindfulness as Game
#10 
koder патриот01.02.21 07:18
koder
NEW 01.02.21 07:18 
в ответ Guinevra 31.01.21 22:16, Последний раз изменено 01.02.21 13:46 (koder)
То есть вот это для меня немного по-китайски:

Абстрагируйтесь. Без разницы, как вы создали соединение, без разницы, какое оно, просто используйте его.

1. набишите функцию initDb. в нее поместите код

Class.forName("org.postgresql.Driver");

Этот код будете вызывать только один раз, при старте проги.


2 . Напишите функцию

Set getTakeoffs(String iata) throws SQLException

Обратите вниманиe, что у нее нет параметра "Connection"


Задача у этой функции открыть соединение, вызвать другую функцию, которая собственно и получит данные из Базы данных и закрыть соединение.Я уберу обработку исключений для простоты


Set<Object> getTakeoffs(String iata) throws SQLException{

    conn = DriverManager.getConnection(DB_URL, USER, PASS);

    return getTakeoffs(iata, conn );

    // !!!! finally block used to close resources
    conn.close();
}


3. Напишите функцию

Set getTakeoffs(String iata, Connection dbConnection) throws SQLException

Обратите вниманиe, что у нее есть параметр "Connection".

И что именно ее мы вызвали, когда писали getTakeoffs(iata, conn );


Set<Object> getTakeoffs(String iata, Connection dbConnection) throws SQLException{

      Set<Object> result = new HashSet<>();            

      stmt = conn.createStatement();
      String sql = "SELECT * FROM FLUG";
      stmt.executeQuery(sql);
      ResultSet rs = stmt.executeQuery(query);
      Здесь заполнение списка "result" из ResultSet
      // !!!! finally block used to close resources 
      stmt.close();
      return result;    
}


#11 
koder патриот01.02.21 07:25
koder
NEW 01.02.21 07:25 
в ответ koder 01.02.21 07:18

Если вам придется изменить доступ к базе данных, применить другой тип соединения или вообще базу данных, то нужно будет измениить только getTakeoffs(String iata). Та, другая getTakeoffs(String iata, Connection dbConnection ) остается неизменной, ей наплевать, как вы получили Connection и куда он ведет.

#12 
Guinevra гость01.02.21 11:48
Guinevra
NEW 01.02.21 11:48 
в ответ koder 01.02.21 07:18

Cпасибище!

Mindfulness as Game
#13