From 90fe925bd601fa28db60ac2445453a4b616338cc Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Thu, 5 Sep 2024 15:58:08 +0300 Subject: [PATCH 01/11] added sql script --- src/main/resources/init_db.sql | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/init_db.sql diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql new file mode 100644 index 00000000..e69de29b From d0ce442c1a377ed41ce6c1df34eafc9d9a209da1 Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Thu, 5 Sep 2024 16:27:12 +0300 Subject: [PATCH 02/11] added Book.class --- src/main/java/mate/academy/model/Book.java | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/main/java/mate/academy/model/Book.java diff --git a/src/main/java/mate/academy/model/Book.java b/src/main/java/mate/academy/model/Book.java new file mode 100644 index 00000000..d24c27b2 --- /dev/null +++ b/src/main/java/mate/academy/model/Book.java @@ -0,0 +1,76 @@ +package mate.academy.model; + +import java.math.BigDecimal; +import java.util.Objects; + +public class Book { + private Long id; + private String title; + private BigDecimal price; + + public Book() { + } + + public Book(String title, BigDecimal price) { + this.title = title; + this.price = price; + } + + public Book(Long id, String title, BigDecimal price) { + this.id = id; + this.title = title; + this.price = price; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Book book = (Book) o; + return Objects.equals(id, book.id) + && Objects.equals(title, book.title) + && Objects.equals(price, book.price); + } + + @Override + public int hashCode() { + return Objects.hash(id, title, price); + } + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", price=" + price + + '}'; + } +} From 34cc07b6c7c7fbd3ed7b9f7b6fd7da487300ca0f Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Thu, 5 Sep 2024 16:33:40 +0300 Subject: [PATCH 03/11] added BookDao interface --- src/main/java/mate/academy/dao/BookDao.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/mate/academy/dao/BookDao.java diff --git a/src/main/java/mate/academy/dao/BookDao.java b/src/main/java/mate/academy/dao/BookDao.java new file mode 100644 index 00000000..7059a972 --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -0,0 +1,13 @@ +package mate.academy.dao; + +import java.util.List; +import java.util.Optional; +import mate.academy.model.Book; + +public interface BookDao { + Book create(Book book); + Optional findById(Long id); + List findAll(); + Book update(Book book); + boolean deleteById(Long id); +} From 01f7098f210dd4ecf71eb58ad4719701a5887518 Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Thu, 5 Sep 2024 16:37:10 +0300 Subject: [PATCH 04/11] added custom exception --- .../java/mate/academy/dao/BookDaoImpl.java | 33 +++++++++++++++++++ .../exception/DataProcessingException.java | 7 ++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/mate/academy/dao/BookDaoImpl.java create mode 100644 src/main/java/mate/academy/exception/DataProcessingException.java diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java new file mode 100644 index 00000000..b1d9d67a --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -0,0 +1,33 @@ +package mate.academy.dao; + +import mate.academy.model.Book; + +import java.util.List; +import java.util.Optional; + +public class BookDaoImpl implements BookDao{ + @Override + public Book create(Book book) { + return null; + } + + @Override + public Optional findById(Long id) { + return Optional.empty(); + } + + @Override + public List findAll() { + return null; + } + + @Override + public Book update(Book book) { + return null; + } + + @Override + public boolean deleteById(Long id) { + return false; + } +} diff --git a/src/main/java/mate/academy/exception/DataProcessingException.java b/src/main/java/mate/academy/exception/DataProcessingException.java new file mode 100644 index 00000000..63b937dc --- /dev/null +++ b/src/main/java/mate/academy/exception/DataProcessingException.java @@ -0,0 +1,7 @@ +package mate.academy.exception; + +public class DataProcessingException extends RuntimeException { + public DataProcessingException(String message, Throwable cause) { + super(message, cause); + } +} From 4d5d0d6e0acb9bf2b2f78c1d6f0cfcb17f56b314 Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Thu, 5 Sep 2024 17:08:17 +0300 Subject: [PATCH 05/11] added JDBC driver dependency and ConnectionUtil.class --- pom.xml | 7 +++++ src/main/java/mate/academy/Main.java | 7 ++++- .../mate/academy/util/ConnectionUtil.java | 28 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/main/java/mate/academy/util/ConnectionUtil.java diff --git a/pom.xml b/pom.xml index 8c843598..401b428d 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,13 @@ https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml + + + mysql + mysql-connector-java + 8.0.33 + + diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 0058fbf9..6d417c2f 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,7 +1,12 @@ package mate.academy; +import mate.academy.lib.Injector; +import mate.academy.util.ConnectionUtil; + +import java.sql.SQLException; + public class Main { + private static final Injector INJECTOR = Injector.getInstance("mate.jdbc"); public static void main(String[] args) { - } } diff --git a/src/main/java/mate/academy/util/ConnectionUtil.java b/src/main/java/mate/academy/util/ConnectionUtil.java new file mode 100644 index 00000000..2c523fef --- /dev/null +++ b/src/main/java/mate/academy/util/ConnectionUtil.java @@ -0,0 +1,28 @@ +package mate.academy.util; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +public class ConnectionUtil { + private static final String URL = "jdbc:mysql://localhost:3306/library_service"; + private static final String USERNAME = "root"; + private static final String PASSWORD = "root"; + private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; + + static { + try { + Class.forName(JDBC_DRIVER); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Can't find SQL Driver", e); + } + } + + public static Connection getConnection() throws SQLException { + Properties dbProperties = new Properties(); + dbProperties.setProperty("user", USERNAME); + dbProperties.setProperty("password", PASSWORD); + return DriverManager.getConnection(URL, dbProperties); + } +} From e35be3363cf27007288dc1007ff0e9bfcf6b4d9f Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Thu, 5 Sep 2024 18:43:16 +0300 Subject: [PATCH 06/11] implemented CRUD methods and tested in Main --- src/main/java/mate/academy/Main.java | 41 ++++++++- .../java/mate/academy/dao/BookDaoImpl.java | 89 +++++++++++++++++-- 2 files changed, 119 insertions(+), 11 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 6d417c2f..137d4f28 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,12 +1,47 @@ package mate.academy; +import mate.academy.dao.BookDao; import mate.academy.lib.Injector; -import mate.academy.util.ConnectionUtil; +import mate.academy.model.Book; -import java.sql.SQLException; +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; public class Main { - private static final Injector INJECTOR = Injector.getInstance("mate.jdbc"); + private static final Injector INJECTOR = Injector.getInstance("mate.academy"); + private static List books = List.of(new Book("Core Java Volume I – Fundamentals", BigDecimal.valueOf(29.99)), + new Book("Effective Java", BigDecimal.valueOf(19.99)), + new Book("Java - The Complete Reference", BigDecimal.valueOf(35.45))); + public static void main(String[] args) { + BookDao bookDao = (BookDao) INJECTOR.getInstance(BookDao.class); +//create + for (Book book : books) { + System.out.println("Created record in DB: " + + bookDao.create(book)); + } + +//read + books = bookDao.findAll(); + System.out.println(System.lineSeparator() + "Records in DB:"); + books.forEach(System.out::println); + +//update + Book updatedBook = bookDao.findAll().stream() + .filter(b -> Objects.equals(b.getTitle(), "Effective Java")) + .findFirst() + .get(); + updatedBook.setTitle("SQL in 10 Minutes"); + updatedBook.setPrice(BigDecimal.valueOf(24.99)); + + System.out.println(System.lineSeparator() + "Updated in db: " + + bookDao.update(updatedBook) + System.lineSeparator()); + +//delete + books = bookDao.findAll(); + for (Book book : books) { + System.out.println("Deleted record from DB: " + bookDao.deleteById(book.getId())); + } } } diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index b1d9d67a..5dfb47c6 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -1,33 +1,106 @@ package mate.academy.dao; -import mate.academy.model.Book; - +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; import java.util.List; import java.util.Optional; +import mate.academy.exception.DataProcessingException; +import mate.academy.lib.Dao; +import mate.academy.model.Book; +import mate.academy.util.ConnectionUtil; -public class BookDaoImpl implements BookDao{ +@Dao +public class BookDaoImpl implements BookDao { @Override public Book create(Book book) { - return null; + String query = "INSERT INTO books (title, price) " + + "VALUES (?, ?)"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement + = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { + statement.setString(1, book.getTitle()); + statement.setBigDecimal(2, book.getPrice()); + statement.executeUpdate(); + ResultSet resultSet = statement.getGeneratedKeys(); + if (resultSet.next()) { + book.setId(resultSet.getObject(1, Long.class)); + } + return book; + } catch (SQLException e) { + throw new DataProcessingException("Couldn't create book: " + book, e); + } } @Override public Optional findById(Long id) { - return Optional.empty(); + String query = "SELECT id, title, price FROM books WHERE id = ?;"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + statement.setLong(1, id); + ResultSet resultSet = statement.executeQuery(); + Book book = null; + if (resultSet.next()) { + book = getBook(resultSet); + } + return Optional.ofNullable(book); + } catch (SQLException e) { + throw new DataProcessingException("Couldn't get book by id: " + id, e); + } } @Override public List findAll() { - return null; + String query = "SELECT id, title, price FROM books;"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + List books = new ArrayList<>(); + ResultSet resultSet = statement.executeQuery(); + while (resultSet.next()) { + books.add(getBook(resultSet)); + } + return books; + } catch (SQLException e) { + throw new DataProcessingException("Couldn't get a list of books " + + "from books table.", e); + } } @Override public Book update(Book book) { - return null; + String query = "UPDATE books SET title = ?, price = ? WHERE id= ?;"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + statement.setString(1, book.getTitle()); + statement.setBigDecimal(2, book.getPrice()); + statement.setLong(3, book.getId()); + return book; + } catch (SQLException e) { + throw new DataProcessingException("Couldn't update a book: " + + book, e); + } } @Override public boolean deleteById(Long id) { - return false; + String query = "DELETE FROM books WHERE id = ?"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + statement.setLong(1, id); + return statement.executeUpdate() > 0; + } catch (SQLException e) { + throw new DataProcessingException("Couldn't delete a book by id " + id, e); + } + } + + private Book getBook(ResultSet resultSet) throws SQLException { + Long id = resultSet.getObject("id", Long.class); + String title = resultSet.getString("title"); + BigDecimal price = resultSet.getBigDecimal("price"); + return new Book(id, title, price); } } From fd004135651fcbb0fe5cbbd5e69ed51426d79804 Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Thu, 5 Sep 2024 18:49:41 +0300 Subject: [PATCH 07/11] refactored checkstyle --- src/main/java/mate/academy/Main.java | 18 +++++++++--------- src/main/java/mate/academy/dao/BookDao.java | 4 ++++ .../java/mate/academy/dao/BookDaoImpl.java | 12 ++++++------ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 137d4f28..37361884 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,33 +1,33 @@ package mate.academy; -import mate.academy.dao.BookDao; -import mate.academy.lib.Injector; -import mate.academy.model.Book; - import java.math.BigDecimal; import java.util.List; import java.util.Objects; +import mate.academy.dao.BookDao; +import mate.academy.lib.Injector; +import mate.academy.model.Book; public class Main { private static final Injector INJECTOR = Injector.getInstance("mate.academy"); - private static List books = List.of(new Book("Core Java Volume I – Fundamentals", BigDecimal.valueOf(29.99)), + private static List books = List.of( + new Book("Core Java Volume I – Fundamentals", BigDecimal.valueOf(29.99)), new Book("Effective Java", BigDecimal.valueOf(19.99)), new Book("Java - The Complete Reference", BigDecimal.valueOf(35.45))); public static void main(String[] args) { BookDao bookDao = (BookDao) INJECTOR.getInstance(BookDao.class); -//create + //create for (Book book : books) { System.out.println("Created record in DB: " + bookDao.create(book)); } -//read + //read books = bookDao.findAll(); System.out.println(System.lineSeparator() + "Records in DB:"); books.forEach(System.out::println); -//update + //update Book updatedBook = bookDao.findAll().stream() .filter(b -> Objects.equals(b.getTitle(), "Effective Java")) .findFirst() @@ -38,7 +38,7 @@ public static void main(String[] args) { System.out.println(System.lineSeparator() + "Updated in db: " + bookDao.update(updatedBook) + System.lineSeparator()); -//delete + //delete books = bookDao.findAll(); for (Book book : books) { System.out.println("Deleted record from DB: " + bookDao.deleteById(book.getId())); diff --git a/src/main/java/mate/academy/dao/BookDao.java b/src/main/java/mate/academy/dao/BookDao.java index 7059a972..d60c063d 100644 --- a/src/main/java/mate/academy/dao/BookDao.java +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -6,8 +6,12 @@ public interface BookDao { Book create(Book book); + Optional findById(Long id); + List findAll(); + Book update(Book book); + boolean deleteById(Long id); } diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index 5dfb47c6..7a76346f 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -21,8 +21,8 @@ public Book create(Book book) { String query = "INSERT INTO books (title, price) " + "VALUES (?, ?)"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement - = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { + PreparedStatement statement + = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { statement.setString(1, book.getTitle()); statement.setBigDecimal(2, book.getPrice()); statement.executeUpdate(); @@ -40,7 +40,7 @@ public Book create(Book book) { public Optional findById(Long id) { String query = "SELECT id, title, price FROM books WHERE id = ?;"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setLong(1, id); ResultSet resultSet = statement.executeQuery(); Book book = null; @@ -57,7 +57,7 @@ public Optional findById(Long id) { public List findAll() { String query = "SELECT id, title, price FROM books;"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { List books = new ArrayList<>(); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { @@ -74,7 +74,7 @@ public List findAll() { public Book update(Book book) { String query = "UPDATE books SET title = ?, price = ? WHERE id= ?;"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setString(1, book.getTitle()); statement.setBigDecimal(2, book.getPrice()); statement.setLong(3, book.getId()); @@ -89,7 +89,7 @@ public Book update(Book book) { public boolean deleteById(Long id) { String query = "DELETE FROM books WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setLong(1, id); return statement.executeUpdate() > 0; } catch (SQLException e) { From 8e1b5dd4e9611b79ad57cfd12e2d98aba1aa618e Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Thu, 5 Sep 2024 21:24:16 +0300 Subject: [PATCH 08/11] refactored according to coments --- src/main/java/mate/academy/Main.java | 54 +++++++++---------- .../java/mate/academy/dao/BookDaoImpl.java | 22 ++++---- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 37361884..39ff4092 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -3,45 +3,45 @@ import java.math.BigDecimal; import java.util.List; import java.util.Objects; + import mate.academy.dao.BookDao; import mate.academy.lib.Injector; import mate.academy.model.Book; public class Main { private static final Injector INJECTOR = Injector.getInstance("mate.academy"); - private static List books = List.of( - new Book("Core Java Volume I – Fundamentals", BigDecimal.valueOf(29.99)), - new Book("Effective Java", BigDecimal.valueOf(19.99)), - new Book("Java - The Complete Reference", BigDecimal.valueOf(35.45))); public static void main(String[] args) { BookDao bookDao = (BookDao) INJECTOR.getInstance(BookDao.class); - //create - for (Book book : books) { - System.out.println("Created record in DB: " - + bookDao.create(book)); - } - - //read - books = bookDao.findAll(); + + // Initialize data + List books = initializeBooks(); + books.forEach(book -> System.out.println("Created record in DB: " + bookDao.create(book))); + + // Fetch all books once and reuse the list + List allBooks = bookDao.findAll(); System.out.println(System.lineSeparator() + "Records in DB:"); - books.forEach(System.out::println); + allBooks.forEach(System.out::println); - //update - Book updatedBook = bookDao.findAll().stream() + // Update a specific book + allBooks.stream() .filter(b -> Objects.equals(b.getTitle(), "Effective Java")) .findFirst() - .get(); - updatedBook.setTitle("SQL in 10 Minutes"); - updatedBook.setPrice(BigDecimal.valueOf(24.99)); - - System.out.println(System.lineSeparator() + "Updated in db: " - + bookDao.update(updatedBook) + System.lineSeparator()); - - //delete - books = bookDao.findAll(); - for (Book book : books) { - System.out.println("Deleted record from DB: " + bookDao.deleteById(book.getId())); - } + .ifPresent(updatedBook -> { + updatedBook.setTitle("SQL in 10 Minutes"); + updatedBook.setPrice(BigDecimal.valueOf(24.99)); + System.out.println(System.lineSeparator() + "Updated in db: " + bookDao.update(updatedBook)); + }); + + // Delete all books + allBooks.forEach(book -> System.out.println("Deleted record from DB: " + bookDao.deleteById(book.getId()))); + } + + private static List initializeBooks() { + return List.of( + new Book("Core Java Volume I – Fundamentals", BigDecimal.valueOf(29.99)), + new Book("Effective Java", BigDecimal.valueOf(19.99)), + new Book("Java - The Complete Reference", BigDecimal.valueOf(35.45)) + ); } } diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index 7a76346f..04654392 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; + import mate.academy.exception.DataProcessingException; import mate.academy.lib.Dao; import mate.academy.model.Book; @@ -21,8 +22,8 @@ public Book create(Book book) { String query = "INSERT INTO books (title, price) " + "VALUES (?, ?)"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement - = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { + PreparedStatement statement + = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { statement.setString(1, book.getTitle()); statement.setBigDecimal(2, book.getPrice()); statement.executeUpdate(); @@ -40,24 +41,25 @@ public Book create(Book book) { public Optional findById(Long id) { String query = "SELECT id, title, price FROM books WHERE id = ?;"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setLong(1, id); ResultSet resultSet = statement.executeQuery(); Book book = null; if (resultSet.next()) { book = getBook(resultSet); + return Optional.of(book); } - return Optional.ofNullable(book); } catch (SQLException e) { throw new DataProcessingException("Couldn't get book by id: " + id, e); } + return Optional.empty(); } @Override public List findAll() { - String query = "SELECT id, title, price FROM books;"; + String query = "SELECT id, title, price FROM books"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { List books = new ArrayList<>(); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { @@ -65,8 +67,7 @@ public List findAll() { } return books; } catch (SQLException e) { - throw new DataProcessingException("Couldn't get a list of books " - + "from books table.", e); + throw new DataProcessingException("Couldn't get a list of books from books table.", e); } } @@ -74,10 +75,11 @@ public List findAll() { public Book update(Book book) { String query = "UPDATE books SET title = ?, price = ? WHERE id= ?;"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setString(1, book.getTitle()); statement.setBigDecimal(2, book.getPrice()); statement.setLong(3, book.getId()); + statement.executeUpdate(); return book; } catch (SQLException e) { throw new DataProcessingException("Couldn't update a book: " @@ -89,7 +91,7 @@ public Book update(Book book) { public boolean deleteById(Long id) { String query = "DELETE FROM books WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setLong(1, id); return statement.executeUpdate() > 0; } catch (SQLException e) { From b3962ce86ed9eb949919d7472dba04ba8e52462e Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Thu, 5 Sep 2024 21:44:36 +0300 Subject: [PATCH 09/11] refactored according to coments --- src/main/java/mate/academy/Main.java | 7 ++++--- src/main/java/mate/academy/dao/BookDaoImpl.java | 13 ++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 39ff4092..be65e6dd 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -3,7 +3,6 @@ import java.math.BigDecimal; import java.util.List; import java.util.Objects; - import mate.academy.dao.BookDao; import mate.academy.lib.Injector; import mate.academy.model.Book; @@ -30,11 +29,13 @@ public static void main(String[] args) { .ifPresent(updatedBook -> { updatedBook.setTitle("SQL in 10 Minutes"); updatedBook.setPrice(BigDecimal.valueOf(24.99)); - System.out.println(System.lineSeparator() + "Updated in db: " + bookDao.update(updatedBook)); + System.out.println(System.lineSeparator() + + "Updated in db: " + bookDao.update(updatedBook)); }); // Delete all books - allBooks.forEach(book -> System.out.println("Deleted record from DB: " + bookDao.deleteById(book.getId()))); + allBooks.forEach(book -> System.out.println("Deleted record from DB: " + + bookDao.deleteById(book.getId()))); } private static List initializeBooks() { diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index 04654392..235f9a2c 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -9,7 +9,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; - import mate.academy.exception.DataProcessingException; import mate.academy.lib.Dao; import mate.academy.model.Book; @@ -22,8 +21,8 @@ public Book create(Book book) { String query = "INSERT INTO books (title, price) " + "VALUES (?, ?)"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement - = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { + PreparedStatement statement = connection + .prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { statement.setString(1, book.getTitle()); statement.setBigDecimal(2, book.getPrice()); statement.executeUpdate(); @@ -41,7 +40,7 @@ public Book create(Book book) { public Optional findById(Long id) { String query = "SELECT id, title, price FROM books WHERE id = ?;"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setLong(1, id); ResultSet resultSet = statement.executeQuery(); Book book = null; @@ -59,7 +58,7 @@ public Optional findById(Long id) { public List findAll() { String query = "SELECT id, title, price FROM books"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { List books = new ArrayList<>(); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { @@ -75,7 +74,7 @@ public List findAll() { public Book update(Book book) { String query = "UPDATE books SET title = ?, price = ? WHERE id= ?;"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setString(1, book.getTitle()); statement.setBigDecimal(2, book.getPrice()); statement.setLong(3, book.getId()); @@ -91,7 +90,7 @@ public Book update(Book book) { public boolean deleteById(Long id) { String query = "DELETE FROM books WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setLong(1, id); return statement.executeUpdate() > 0; } catch (SQLException e) { From 11ef307309ef1601ae807e85690d9d79be468d22 Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Sat, 7 Sep 2024 16:20:53 +0300 Subject: [PATCH 10/11] -removed comments in main -added check if rows were updated --- src/main/java/mate/academy/Main.java | 4 ---- src/main/java/mate/academy/dao/BookDaoImpl.java | 10 ++++++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index be65e6dd..39b969dd 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -13,16 +13,13 @@ public class Main { public static void main(String[] args) { BookDao bookDao = (BookDao) INJECTOR.getInstance(BookDao.class); - // Initialize data List books = initializeBooks(); books.forEach(book -> System.out.println("Created record in DB: " + bookDao.create(book))); - // Fetch all books once and reuse the list List allBooks = bookDao.findAll(); System.out.println(System.lineSeparator() + "Records in DB:"); allBooks.forEach(System.out::println); - // Update a specific book allBooks.stream() .filter(b -> Objects.equals(b.getTitle(), "Effective Java")) .findFirst() @@ -33,7 +30,6 @@ public static void main(String[] args) { + "Updated in db: " + bookDao.update(updatedBook)); }); - // Delete all books allBooks.forEach(book -> System.out.println("Deleted record from DB: " + bookDao.deleteById(book.getId()))); } diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index 235f9a2c..ec545f5f 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -25,7 +25,10 @@ public Book create(Book book) { .prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { statement.setString(1, book.getTitle()); statement.setBigDecimal(2, book.getPrice()); - statement.executeUpdate(); + int rowsAffected = statement.executeUpdate(); + if (rowsAffected == 0) { + throw new SQLException("Inserting book failed, no rows affected."); + } ResultSet resultSet = statement.getGeneratedKeys(); if (resultSet.next()) { book.setId(resultSet.getObject(1, Long.class)); @@ -78,7 +81,10 @@ public Book update(Book book) { statement.setString(1, book.getTitle()); statement.setBigDecimal(2, book.getPrice()); statement.setLong(3, book.getId()); - statement.executeUpdate(); + int rowsAffected = statement.executeUpdate(); + if (rowsAffected == 0) { + throw new SQLException("Updating book failed, no rows affected."); + } return book; } catch (SQLException e) { throw new DataProcessingException("Couldn't update a book: " From c07dc82081051737f2d16976a11a33f44d77bdd9 Mon Sep 17 00:00:00 2001 From: Yaroslav Ometiukh <120783204+yaroslav-ometiukh@users.noreply.github.com> Date: Sat, 7 Sep 2024 16:40:58 +0300 Subject: [PATCH 11/11] -fixed sql script --- src/main/resources/init_db.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql index e69de29b..48c1e064 100644 --- a/src/main/resources/init_db.sql +++ b/src/main/resources/init_db.sql @@ -0,0 +1,10 @@ +CREATE SCHEMA IF NOT EXISTS `library_service` DEFAULT CHARACTER SET utf8; + +DROP TABLE IF EXISTS `books`; +CREATE TABLE `books` +( + `id` BIGINT(11) NOT NULL AUTO_INCREMENT, + `title` VARCHAR(225) NOT NULL, + `price` DECIMAL NULL, + PRIMARY KEY (`id`) +); \ No newline at end of file