Помогите со студенческой задачей JDBC + Postgre
Нид хелп в программировании!
Одна студенческая задача, но срочно: JDBC + Postgres.
Может, найдётся добрый грамотный человек, небезвозмездно.
С SQL вроде, нет проблем.
Нужно “заполнить шаблон” — в.java файле написать функции получения соединения в БД, выборки данных из БД и положить эти данные в set.
Учебная БД в Postgre есть, работает, реагирует.
Соединение из .java файла с базой данных осилили. А права на выборку из таблиц жадный Postgre не даёт: то ли роль, то ли пользователь не имеет привилегий — хз.
Ну и в Java опыта считай что нет, только С++ немного.
Помогите кто может, пожалуйста!
(Медленно и старательно за пару дней я, наверное, справилась бы и сама. Но срок сдачи поджимает, а хочется успеть до конца
локдауна)
я никогда не работал с Postgres, но общий принцип должен быть один и тот же. Для начала вам нужен любая прога, что бы без Явы подсоединиться к базе данных и сделать выборку из нужной таблицы. Если вы увидите результаты выборки, то у вас есть правильная база данных, к ней есть доступ, в базе есть таблица и в таблице есть данные. Потом можно будет переходить к Яве. Напишите код, который у вас есть.
Как уже сказали, попробуйте вначале прочитать вашу базу одним из этих редакторов
Законнектилась!))
В расширении к 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-функицй в файле (который я
сейчас попытаюсь подвесить)
1. Если я правильно понял, то у вас все работает
2. Подключать драйвер нужно один раз
3 . А вот создавать Connection нужно каждый раз, когда вы лезете в базу. У вас написано правильно, с обязательным закрытием соединения в любом случае. Создание соединения можно вынести в отдельный метод и возвращать, но это неправильно. Потому что это всего одна строчка кода, а вот принцип "прибить соединение там, где создавали" нарушится. Ну аспект можно создать, Но это уже не учебный код.
4. Я не понял, какие проблемы у вас остались и нужна ли вам ещё помощь
Спасибо, да!
Всё работает
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;
Но возьмусь я за это завтра))
То есть вот это для меня немного по-китайски:
Абстрагируйтесь. Без разницы, как вы создали соединение, без разницы, какое оно, просто используйте его.
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; }
Если вам придется изменить доступ к базе данных, применить другой тип соединения или вообще базу данных, то нужно будет измениить только getTakeoffs(String iata). Та, другая getTakeoffs(String iata, Connection dbConnection ) остается неизменной, ей наплевать, как вы получили Connection и куда он ведет.