{"id":24763404,"url":"https://github.com/souzafcharles/jdbc-connection-to-postgresql","last_synced_at":"2025-06-18T03:37:44.407Z","repository":{"id":272659942,"uuid":"917269374","full_name":"souzafcharles/JDBC-Connection-to-PostgreSQL","owner":"souzafcharles","description":"☕ Review content from DevSuperior on Object-Oriented Programming and SQL using Java, JDBC, and PostgreSQL","archived":false,"fork":false,"pushed_at":"2025-02-17T22:48:02.000Z","size":1360,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-23T14:35:38.634Z","etag":null,"topics":["java","jdbc","oriented-object-programming","postgresql","sql"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/souzafcharles.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-15T17:11:35.000Z","updated_at":"2025-02-17T22:48:05.000Z","dependencies_parsed_at":null,"dependency_job_id":"a45da7ea-7379-46a6-8091-8f4b1798b4b6","html_url":"https://github.com/souzafcharles/JDBC-Connection-to-PostgreSQL","commit_stats":null,"previous_names":["souzafcharles/jdbc-connection-to-postgresql"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/souzafcharles/JDBC-Connection-to-PostgreSQL","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/souzafcharles%2FJDBC-Connection-to-PostgreSQL","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/souzafcharles%2FJDBC-Connection-to-PostgreSQL/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/souzafcharles%2FJDBC-Connection-to-PostgreSQL/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/souzafcharles%2FJDBC-Connection-to-PostgreSQL/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/souzafcharles","download_url":"https://codeload.github.com/souzafcharles/JDBC-Connection-to-PostgreSQL/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/souzafcharles%2FJDBC-Connection-to-PostgreSQL/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260483659,"owners_count":23016088,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","jdbc","oriented-object-programming","postgresql","sql"],"created_at":"2025-01-28T20:27:24.926Z","updated_at":"2025-06-18T03:37:39.391Z","avatar_url":"https://github.com/souzafcharles.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![GitHub language count](https://img.shields.io/github/languages/count/souzafcharles/JDBC-Connection-to-PostgreSQL)\n![GitHub top language](https://img.shields.io/github/languages/top/souzafcharles/JDBC-Connection-to-PostgreSQL)\n![GitHub license](https://img.shields.io/github/license/souzafcharles/JDBC-Connection-to-PostgreSQL)\n![GitHub last commit](https://img.shields.io/github/last-commit/souzafcharles/JDBC-Connection-to-PostgreSQL)\n\n# :coffee: Object-oriented and SQL revision using Java and JDBC\n\n:triangular_flag_on_post: Prof. Dr. Nelio Alves - [DevSuperior](https://devsuperior.com.br/)\n\n:black_nib: IDE used: `IntelliJ IDEA`\n\n:coffee: Java | version: `21`\n\n:elephant: Database | `PostgresSQL`\n\n***\n## Instructions:\n\u003cp align=\"justify\"\u003e\nDevelop a Java application that connects to a database using \u003ccode\u003eJDBC\u003c/code\u003e and interfaces following the \u003ccode\u003eDAO pattern\u003c/code\u003e, featuring entity classes for \u003ccode\u003eOrder\u003c/code\u003e and \u003ccode\u003eProduct\u003c/code\u003e. The target \u003ccode\u003ePostgresSQL\u003c/code\u003e database is \u003ccode\u003echdeliver\u003c/code\u003e.\n\u003c/p\u003e\n## Steps to Follow:\n\n### 1. Database Configuration:\n- Add the lib `postgresql-42.2.18.jar` to the project;\n- Establish a database named `chdeliver` using `pgAdmin 4`;\n- In the project's root folder, create a file named `db.properties` containing the connection data:\n\n#### db.properties File:\n\n```SQL\nuser=postgres\npassword=******\ndburl=jdbc:postgresql://localhost:5432/chdeliver\nuseSSL=false\n```\n***\n### 2. Database Table Creation:\n- Create an SQL script to store data in the `chdeliver` database.\n#### database.sql Script:\n```SQL\n-- Drop table 'tb_order_product' if it exists\nDROP TABLE IF EXISTS tb_order_product;\n\n-- Drop table 'tb_order' if it exists\nDROP TABLE IF EXISTS tb_order;\n\n-- Drop table 'tb_product' if it exists\nDROP TABLE IF EXISTS tb_product;\n\n-- Create table 'tb_order' if it does not exist\nCREATE TABLE IF NOT EXISTS tb_order (\n    id int8 generated by default as identity, \n    latitude float8, \n    longitude float8, \n    moment TIMESTAMP WITHOUT TIME ZONE, \n    status int4, \n    primary key (id)\n);\n\n-- Create table 'tb_order_product' if it does not exist\nCREATE TABLE IF NOT EXISTS tb_order_product (\n    order_id int8 not null, \n    product_id int8 not null, \n    primary key (order_id, product_id)\n);\n\n-- Create table 'tb_product' if it does not exist\nCREATE TABLE IF NOT EXISTS tb_product (\n    id int8 generated by default as identity, \n    description TEXT, \n    image_uri varchar(255), \n    name varchar(255), \n    price float8, \n    primary key (id)\n);\n\n-- Add foreign key constraints to 'tb_order_product' only if they do not exist\nALTER TABLE tb_order_product \nADD CONSTRAINT fk_tb_order_product_tb_product \nFOREIGN KEY (product_id) REFERENCES tb_product;\n\nALTER TABLE tb_order_product \nADD CONSTRAINT fk_tb_order_product_tb_order \nFOREIGN KEY (order_id) REFERENCES tb_order;\n\n-- Insert data into 'tb_product'\nINSERT INTO tb_product (name, price, image_uri, description) VALUES \n('Pizza de Calabresa Grande', 50.0, 'https://github.com/souzafcharles/1.png', 'Deliciosa pizza de calabresa com queijo muçarela, molho de tomate especial e orégano. Disponível em tamanho grande.'),\n('Pizza Quatro Queijos Média', 40.0, 'https://github.com/souzafcharles/2.png', 'Uma explosão de sabores com queijo gorgonzola, queijo provolone, queijo parmesão e queijo muçarela. Ideal para compartilhar.'),\n('Pizza de Escarola com Bacon Grande', 60.0, 'https://github.com/souzafcharles/3.png', 'Combinação perfeita de escarola refogada com bacon crocante, coberta com queijo muçarela e molho branco. Uma delícia!');\n\n-- Insert data into 'tb_order'\nINSERT INTO tb_order (status, latitude, longitude, moment) VALUES \n(0, 213123, 12323, TIMESTAMP WITH TIME ZONE '2025-01-14T11:00:00Z'),\n(1, 3453453, 3534534, TIMESTAMP WITH TIME ZONE '2025-01-15T11:00:00Z');\n\n-- Insert data into 'tb_order_product'\nINSERT INTO tb_order_product (order_id, product_id) VALUES \n(1, 1),\n(1, 2),\n(2, 2),\n(2, 3);\n```\n#### Tables:\n![Tables](https://github.com/souzafcharles/JDBC-Connection-to-PostgreSQL/blob/main/img/tables.png)\n\n***\n### 3. Entities Classes:\n- Create the `Order` and `Product` classes;\n\n![Order and Product Entities](https://github.com/souzafcharles/JDBC-Connection-to-PostgreSQL/blob/main/img/order-product-entities.png)\n\n#### Entities classes checklist:\n- Attributes;\n- Constructors;\n- Getters/Setters;\n- hashCode and equals;\n- toString;\n- Implements Serializable.\n***\n### 4. Tutorial Video Tests Checklist:\n- Primary key and Foreign key;\n- DDL (create table, alter table);\n- SQL:\n  - INSERT;\n  - SELECT;\n  - INNER JOIN;\n- Classes and Objects;\n- Encapsulation, get/set;\n- Enumerated types;\n- Object Composition;\n- Collections (List and Map);\n- Accessing data in a Relational Database and instantiating corresponding objects;\n#### Query to retrieve Orders with their Products:\n```SQL\nSELECT * FROM tb_order\nINNER JOIN tb_order_product ON tb_order.id = tb_order_product.order_id\nINNER JOIN tb_product ON tb_product.id = tb_order_product.product_id\n```\n***\n▶️ [Tutorial Video DevSuperior](https://www.youtube.com/watch?v=xC_yKw3MYX4\u0026ab_channel=DevSuperior)\n***\n### 5. DAO Pattern (Data Access Object):\n- Create the `ProductDAO` and `OrderDAO` interfaces following the `DAO Pattern`.\n#### Generic DAO Class:\n```java\npublic interface DAO\u003cT\u003e {\n    void insert(T obj);\n    void update(T obj);\n    void deleteById(Integer id);\n    T findById(Integer id);\n    List\u003cT\u003e findAll();\n}\n```\n- Implement the classes `OrderDAOJDBC` and `OrderDAOJDBC`.\n- Create the `DAOFactory` to instantiate DAO objects.\n\n![DaoFactory](https://github.com/souzafcharles/JDBC-Connection-to-PostgreSQL/blob/main/img/daoFactory.png)\n***\n### 6. CRUD Operations Implementation:\n***\n### 6.1. `findById` - Implement the search by `ID`:\n#### App Class:\n```java\nSystem.out.println(\"\\n********** TEST 01: Order findById **********\");\nOrderDAO orderDAO = DAOFactory.createOrderDAO();\nOrder order = orderDAO.findById(1);\nSystem.out.println(order);\n\nSystem.out.println(\"\\n********** TEST 01: Product findById **********\");\nProductDAO productDAO = DAOFactory.createProductDAO();     \nProduct product = productDAO.findById(2);\nSystem.out.println(product);\n```\n#### Order SQL Query:\n```SQL\nSELECT tb_order.*, \n       tb_product.id AS ProductId, \n       tb_product.name AS ProductName, \n       tb_product.price AS ProductPrice, \n       tb_product.description AS ProductDescription, \n       tb_product.image_uri AS ProductImageUri \nFROM tb_order \nINNER JOIN tb_order_product ON tb_order.id = tb_order_product.order_id \nINNER JOIN tb_product ON tb_order_product.product_id = tb_product.id \nWHERE tb_order.id = 1;\n```\n#### Product SQL Query:\n```SQL\nSELECT * FROM tb_product \nWHERE id = 2;\n```\n***\n### 6.2. `findAll` - Implement the search for `all` records:\n#### App Class:\n```java\nSystem.out.println(\"\\n********** TEST 02: Order findAll **********\");\nList\u003cOrder\u003elistOrder = orderDAO.findAll();\nfor (Order o : listOrder) {\n    System.out.println(o);\n}\n\nSystem.out.println(\"\\n********** TEST 02: Product findAll **********\");\nList\u003cProduct\u003e listProduct = productDAO.findAll();\nfor (Product p : listProduct) {\n    System.out.println(p);\n}\n```\n#### Order SQL Query:\n```SQL\nSELECT * FROM tb_order \nORDER BY id;\n```\n#### Product SQL Query:\n```SQL\nSELECT * FROM tb_product \nORDER BY name;\n```\n***\n### 6.3. `insert` - Implement the `insertion` of new records:\n#### App Class:\n```java\nSystem.out.println(\"\\n********** TEST 03: Order insert **********\");\nOrder newOrder = new Order(null, -23.555555, -46.666666, Instant.now(), OrderStatus.PENDING);\norderDAO.insert(newOrder);\nSystem.out.println(\"Inserted! New Order id = \" + newOrder.getId());\n\nSystem.out.println(\"\\n********** TEST 03: Product insert **********\");\nProduct newProduct = new Product(null, \"Pizza Margherita Deluxe\", 35.0, \"Uma pizza clássica Margherita com tomates frescos, manjericão, muçarela de búfala e um toque de azeite extra virgem.\", \"https://github.com/souzafcharles/4.png\");\nproductDAO.insert(newProduct);\nSystem.out.println(\"Inserted! New Department Name = \" + newProduct.getName());\n```\n#### Order SQL Query:\n```SQL\nINSERT INTO tb_order (latitude, longitude, moment, status)\nVALUES (?, ?, ?, ?)\n```\n#### Product SQL Query:\n```SQL\nINSERT INTO tb_product (name, price, image_uri, description)\nVALUES (?,?,?,?)\n``` \n***\n### 6.4. `relation insert` - Implement the `Order-Product relation insert` of new records:\n\nAdd the method signature `insertOrderProductRelation` to the `OrderDAO` interface.\n\nOrderDAO Interface Class:\n```java\npublic interface OrderDAO extends DAO\u003cOrder\u003e {\n    void insertOrderProductRelation(Long orderId, Long productId);\n}\n```\n#### App Class:\n```java\nSystem.out.println(\"\\n********** TEST 04: Order-Product relation insert **********\");\norderDAO.insertOrderProductRelation(newOrder.getId(), newProduct.getId());\nSystem.out.println(\"Inserted! New relation between Order id = \" + newOrder.getId() + \" and Product id = \" + newProduct.getId());\n```\n#### Order SQL Query:\n```SQL\nINSERT INTO tb_order_product (order_id, product_id)\n VALUES (?, ?)\n***\n```\n***\n### 6.5. `update` - Implement the `update` of existing records:\n#### App Class:\n```java\nSystem.out.println(\"\\n********** TEST 05: Order update **********\");\norder = orderDAO.findById(5);\norder.setOrderStatus(OrderStatus.DELIVERED);\norderDAO.update(order);\nSystem.out.println(\"Update completed!\");\n\nSystem.out.println(\"\\n********** TEST 05: Product update **********\");\nproduct = productDAO.findById(4);\nproduct.setPrice(45.0);\nproductDAO.update(product);\nSystem.out.println(\"Update completed!\");\n```\n#### Order SQL Query:\n```SQL\nUPDATE tb_order \nSET latitude = ?, longitude = ?, moment = ?, status = ? \nWHERE id = ?\n```\n#### Product SQL Query:\n```SQL\nUPDATE tb_product \"\nSET name = ?, price = ?, image_uri = ?, description = ?\nWHERE id = ?\n``` \n***\n### 6.6. `delete` - Implement the `deletion` of records:\n#### App Class:\n```java\nSystem.out.println(\"\\n********** TEST 06: Order delete **********\");\nSystem.out.print(\"Enter the Order Id for deleteById test: \");\nint id = scanner.nextInt();\norderDAO.deleteById(id);\nSystem.out.println(\"Delete completed!\");\n\nSystem.out.println(\"\\n********** TEST 06: Product delete **********\");\nSystem.out.print(\"Enter the Product Id for deleteById test: \");\nid = scanner.nextInt();\nproductDAO.deleteById(id);\nSystem.out.println(\"Delete completed!\");\n``` \n#### Order SQL Query (`tb_order_product`):\nDelete references in the relationship table.\n```SQL\nDELETE FROM tb_order_product \nWHERE id = ?;\n```\n#### Product SQL Query (`tb_order_product`)::\nDelete references in the relationship table.\n```SQL\nDELETE FROM tb_order_product\nWHERE id = ?;\n```\n#### Order SQL Query:\nDelete the Order.\n```SQL\nDELETE FROM tb_order \nWHERE id = ?;\n```\n#### Product SQL Query:\nDelete the Product.\n```SQL\nDELETE FROM tb_product \nWHERE id = ?;\n```\n\n***\n### 6.7. `find Orders Associated Products` - Implement the find `Orders` and their associated `Products`:\n\nAdd the method signature `findOrdersAssociatedProducts` to the `OrderDAO` interface.\n\nOrderDAO Interface Class:\n```java\npublic interface OrderDAO extends DAO\u003cOrder\u003e {\n  List\u003cOrder\u003e findOrdersAssociatedProducts();\n}\n```\n#### Associated Objects:\n![Associated Objects](https://github.com/souzafcharles/JDBC-Connection-to-PostgreSQL/blob/main/img/associated-objects.png)\n\n#### App Class:\n```java\n\nSystem.out.println(\"\\n********** TEST 07: find Orders and their Associated Products**********\");\nList\u003cOrder\u003e ordersWithProducts = orderDAO.findOrdersAssociatedProducts();\nfor (Order ord : ordersWithProducts) {\n    System.out.println(ord);\n    for (Product prod : ord.getProducts()) {\n        System.out.println(prod);\n    }\n    System.out.println(\"******\");\n}\n```\n#### Order SQL Query:\n```SQL\nSELECT * FROM tb_order \nINNER JOIN tb_order_product ON tb_order.id = tb_order_product.order_id\nINNER JOIN tb_product ON tb_product.id = tb_order_product.product_id\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsouzafcharles%2Fjdbc-connection-to-postgresql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsouzafcharles%2Fjdbc-connection-to-postgresql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsouzafcharles%2Fjdbc-connection-to-postgresql/lists"}