From 69e8344537ea30c5346739dfaae56b379602a8a8 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Thu, 19 Sep 2024 00:24:21 +0300 Subject: [PATCH 01/23] created a init_db.sql and put a script for creating table --- src/main/resources/init_db.sql | 6 ++++++ 1 file changed, 6 insertions(+) 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..c977091f --- /dev/null +++ b/src/main/resources/init_db.sql @@ -0,0 +1,6 @@ +CREATE TABLE book +( + id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, + tittle VARCHAR(100), + price INT, +); \ No newline at end of file From c097cefe32ad8cbfbe1762a6b00f684cf8f4cb45 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Thu, 19 Sep 2024 00:26:04 +0300 Subject: [PATCH 02/23] Implemented class Book --- src/main/java/mate/academy/model/Book.java | 46 ++++++++++++++++++++++ 1 file changed, 46 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..01f25044 --- /dev/null +++ b/src/main/java/mate/academy/model/Book.java @@ -0,0 +1,46 @@ +package mate.academy.model; + +public class Book { + private long id; + private String title; + private int price; + + public Book(long id, String title, int price) { + this.id = id; + this.title = title; + this.price = price; + } + + public void setId(long id) { + this.id = id; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setPrice(int price) { + this.price = price; + } + + public long getId() { + return id; + } + + public String getTitle() { + return title; + } + + public int getPrice() { + return price; + } + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", price=" + price + + '}'; + } +} From 4c687e8d7cac6e1a9fcbb0afe9a79acd1ddd4e08 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Thu, 19 Sep 2024 00:33:43 +0300 Subject: [PATCH 03/23] added NOT NULL to tittle and price in initDb.sql --- src/main/resources/init_db.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql index c977091f..5c08b32b 100644 --- a/src/main/resources/init_db.sql +++ b/src/main/resources/init_db.sql @@ -1,6 +1,6 @@ CREATE TABLE book ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, - tittle VARCHAR(100), - price INT, + tittle VARCHAR(100) NOT NULL, + price INT NOT NULL , ); \ No newline at end of file From b87ce47b5c021b7f3569af62dff83508d2738436 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Thu, 19 Sep 2024 00:40:43 +0300 Subject: [PATCH 04/23] Implemented ConnectionUtil --- .../academy/dbconnection/ConnectionUtil.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/mate/academy/dbconnection/ConnectionUtil.java diff --git a/src/main/java/mate/academy/dbconnection/ConnectionUtil.java b/src/main/java/mate/academy/dbconnection/ConnectionUtil.java new file mode 100644 index 00000000..985c95fe --- /dev/null +++ b/src/main/java/mate/academy/dbconnection/ConnectionUtil.java @@ -0,0 +1,27 @@ +package mate.academy.dbconnection; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +public class ConnectionUtil { + private static final String DB_URL = "jdbc:mysql://localhost:3306/test"; + private static final Properties DB_PROPERTIES; + + static { + DB_PROPERTIES = new Properties(); + DB_PROPERTIES.put("user", "root"); + DB_PROPERTIES.put("password", "databasepractice1!"); + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Can't load a JDBC driver!", e); + } + } + + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(DB_URL, DB_PROPERTIES); + } +} \ No newline at end of file From f18845a5595bc53f0260e4010c742f3349c082df Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Thu, 19 Sep 2024 00:44:04 +0300 Subject: [PATCH 05/23] Created bookDao interface and added CRUD methods --- .../java/mate/academy/bookDao/bookDao.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/mate/academy/bookDao/bookDao.java diff --git a/src/main/java/mate/academy/bookDao/bookDao.java b/src/main/java/mate/academy/bookDao/bookDao.java new file mode 100644 index 00000000..90f412a7 --- /dev/null +++ b/src/main/java/mate/academy/bookDao/bookDao.java @@ -0,0 +1,18 @@ +package mate.academy.bookDao; + +import mate.academy.model.Book; + +import java.util.List; +import java.util.Optional; + +public interface bookDao { + Book create(Book book); + + Optional findById(Long id); + + List findAll(); + + Book update(Book book); + + boolean deleteById(Long id); +} From f61b102a4375376938beea25d697db2dd2f27efb Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sat, 21 Sep 2024 00:29:29 +0300 Subject: [PATCH 06/23] added mySql connector at pom.xml --- pom.xml | 7 +++++++ .../mate/academy/bookDao/{bookDao.java => BookDao.java} | 0 src/main/java/mate/academy/bookDao/BookDaoImpl.java | 4 ++++ 3 files changed, 11 insertions(+) rename src/main/java/mate/academy/bookDao/{bookDao.java => BookDao.java} (100%) create mode 100644 src/main/java/mate/academy/bookDao/BookDaoImpl.java diff --git a/pom.xml b/pom.xml index 683e84ec..2af7ddfd 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,13 @@ https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml + + + com.mysql + mysql-connector-j + 8.3.0 + + diff --git a/src/main/java/mate/academy/bookDao/bookDao.java b/src/main/java/mate/academy/bookDao/BookDao.java similarity index 100% rename from src/main/java/mate/academy/bookDao/bookDao.java rename to src/main/java/mate/academy/bookDao/BookDao.java diff --git a/src/main/java/mate/academy/bookDao/BookDaoImpl.java b/src/main/java/mate/academy/bookDao/BookDaoImpl.java new file mode 100644 index 00000000..9b9022f4 --- /dev/null +++ b/src/main/java/mate/academy/bookDao/BookDaoImpl.java @@ -0,0 +1,4 @@ +package mate.academy.bookDao; + +public class BookDaoImpl { +} From e0c219d2f0038d4f093b83a681050c779ff5ab3f Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sat, 21 Sep 2024 00:38:28 +0300 Subject: [PATCH 07/23] Implemented findAll --- .../mate/academy/bookDao/BookDaoImpl.java | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/main/java/mate/academy/bookDao/BookDaoImpl.java b/src/main/java/mate/academy/bookDao/BookDaoImpl.java index 9b9022f4..e68be4a3 100644 --- a/src/main/java/mate/academy/bookDao/BookDaoImpl.java +++ b/src/main/java/mate/academy/bookDao/BookDaoImpl.java @@ -1,4 +1,54 @@ package mate.academy.bookDao; -public class BookDaoImpl { +import mate.academy.dbconnection.ConnectionUtil; +import mate.academy.model.Book; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +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() { + List books = new ArrayList<>(); + try (Connection connection = ConnectionUtil.getConnection(); + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT * FROM book")) { + while (resultSet.next()) { + long id = resultSet.getLong("id"); + String title = resultSet.getString("tittle"); + int price = resultSet.getInt("price"); + Book book = new Book(id, title, price); + books.add(book); + } + } catch (SQLException e) { + throw new RuntimeException("Can't get all books from database", e); + } + return books; + } + + @Override + public Book update(Book book) { + return null; + } + + @Override + public boolean deleteById(Long id) { + return false; + } } From c05cc8a9afab1a8e9d1b28efde2d14f7452a1dd6 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sat, 21 Sep 2024 23:31:32 +0300 Subject: [PATCH 08/23] Changed initDb.sql --- src/main/resources/init_db.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql index 5c08b32b..70246f6e 100644 --- a/src/main/resources/init_db.sql +++ b/src/main/resources/init_db.sql @@ -1,6 +1,6 @@ CREATE TABLE book ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, - tittle VARCHAR(100) NOT NULL, - price INT NOT NULL , + title VARCHAR(100) NOT NULL, + price INT NOT NULL ); \ No newline at end of file From 346f873116471c2fde31a44971280629d6985aaa Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sat, 21 Sep 2024 23:33:04 +0300 Subject: [PATCH 09/23] fix mistake with BookDao class name --- src/main/java/mate/academy/bookDao/BookDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/mate/academy/bookDao/BookDao.java b/src/main/java/mate/academy/bookDao/BookDao.java index 90f412a7..abdf0a33 100644 --- a/src/main/java/mate/academy/bookDao/BookDao.java +++ b/src/main/java/mate/academy/bookDao/BookDao.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Optional; -public interface bookDao { +public interface BookDao { Book create(Book book); Optional findById(Long id); From 260cd90237c56c146689b840e228bb50e98a761d Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sat, 21 Sep 2024 23:34:42 +0300 Subject: [PATCH 10/23] Init DataProcessingException --- .../mate/academy/exception/DataProcessingException.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/mate/academy/exception/DataProcessingException.java 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 58e06a9b194324c0a0ab930c7f30e953042d4eea Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sat, 21 Sep 2024 23:37:50 +0300 Subject: [PATCH 11/23] Changed throwable type exception from RunTime to DataProccException --- src/main/java/mate/academy/bookDao/BookDaoImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/mate/academy/bookDao/BookDaoImpl.java b/src/main/java/mate/academy/bookDao/BookDaoImpl.java index e68be4a3..f42820e7 100644 --- a/src/main/java/mate/academy/bookDao/BookDaoImpl.java +++ b/src/main/java/mate/academy/bookDao/BookDaoImpl.java @@ -1,6 +1,7 @@ package mate.academy.bookDao; import mate.academy.dbconnection.ConnectionUtil; +import mate.academy.exception.DataProcessingException; import mate.academy.model.Book; import java.sql.Connection; @@ -37,7 +38,7 @@ public List findAll() { books.add(book); } } catch (SQLException e) { - throw new RuntimeException("Can't get all books from database", e); + throw new DataProcessingException("Can't get all books", e); } return books; } From 39510da13fa6439d9068332ccb0ceec57c0614dd Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sun, 22 Sep 2024 00:27:20 +0300 Subject: [PATCH 12/23] Removed id field from constructor --- src/main/java/mate/academy/model/Book.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/mate/academy/model/Book.java b/src/main/java/mate/academy/model/Book.java index 01f25044..1f45a5e5 100644 --- a/src/main/java/mate/academy/model/Book.java +++ b/src/main/java/mate/academy/model/Book.java @@ -5,8 +5,7 @@ public class Book { private String title; private int price; - public Book(long id, String title, int price) { - this.id = id; + public Book(String title, int price) { this.title = title; this.price = price; } From 801737f2d02babab47be4d41045d6b75b40f88fa Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sun, 22 Sep 2024 00:35:13 +0300 Subject: [PATCH 13/23] Add static fabric method --- src/main/java/mate/academy/model/Book.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/mate/academy/model/Book.java b/src/main/java/mate/academy/model/Book.java index 1f45a5e5..07d5fcc8 100644 --- a/src/main/java/mate/academy/model/Book.java +++ b/src/main/java/mate/academy/model/Book.java @@ -5,11 +5,25 @@ public class Book { private String title; private int price; - public Book(String title, int price) { + private Book(long id, String title, int price) { + this.id = id; + this.title = title; + this.price = price; + } + + private Book(String title, int price) { this.title = title; this.price = price; } + public static Book of(long id, String title, int price) { + return new Book(id, title, price); + } + + public static Book of(String title, int price) { + return new Book(title, price); + } + public void setId(long id) { this.id = id; } From 39326caaa5f88847aec51ad3786dbb11c7ad7d3c Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sun, 22 Sep 2024 00:37:32 +0300 Subject: [PATCH 14/23] used a static fabric method instead of a setter + constructor --- .../mate/academy/bookDao/BookDaoImpl.java | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/main/java/mate/academy/bookDao/BookDaoImpl.java b/src/main/java/mate/academy/bookDao/BookDaoImpl.java index f42820e7..2cddb89e 100644 --- a/src/main/java/mate/academy/bookDao/BookDaoImpl.java +++ b/src/main/java/mate/academy/bookDao/BookDaoImpl.java @@ -2,9 +2,11 @@ import mate.academy.dbconnection.ConnectionUtil; import mate.academy.exception.DataProcessingException; +import mate.academy.lib.Dao; import mate.academy.model.Book; import java.sql.Connection; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -12,29 +14,62 @@ import java.util.List; import java.util.Optional; +@Dao public class BookDaoImpl implements BookDao { @Override public Book create(Book book) { - return null; + String sql = "INSERT INTO book(title, price) VALUES(?, ?)"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + statement.setObject(1, book.getTitle()); + statement.setInt(2, book.getPrice()); + int affectedRows = statement.executeUpdate(); + if (affectedRows < 1) { + throw new RuntimeException("Book could not be created"); + } + ResultSet generatedKeys = statement.getGeneratedKeys(); + if (generatedKeys.next()) { + long id = generatedKeys.getLong(1); + book.setId(id); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't add a new book " + book.getTitle(), e); + } + return book; } @Override public Optional findById(Long id) { + String sql = "SELECT * FROM book WHERE id = ?"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + preparedStatement.setLong(1, id); + ResultSet resultSet = preparedStatement.executeQuery(); + if (resultSet.next()) { + String title = resultSet.getString("title"); + int price = resultSet.getInt("price"); + Book book = Book.of(id, title, price); + return Optional.of(book); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't find book by id " + id + " ", e); + } return Optional.empty(); } @Override public List findAll() { + String sql = "SELECT * FROM book"; List books = new ArrayList<>(); try (Connection connection = ConnectionUtil.getConnection(); Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery("SELECT * FROM book")) { + ResultSet resultSet = statement.executeQuery(sql)) { while (resultSet.next()) { long id = resultSet.getLong("id"); - String title = resultSet.getString("tittle"); + String title = resultSet.getString("title"); int price = resultSet.getInt("price"); - Book book = new Book(id, title, price); + Book book = Book.of(id, title, price); books.add(book); } } catch (SQLException e) { @@ -45,6 +80,7 @@ public List findAll() { @Override public Book update(Book book) { + String sql = "UPDATE book SET title = ?, price = ? WHERE id = ?"; return null; } From 70ae9ad11da7d32e9309a2a8c4836a6c9189440a Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sun, 22 Sep 2024 01:33:35 +0300 Subject: [PATCH 15/23] Implemented getRowsCount/clear/create/findById/findAll/update/deleteById --- src/main/java/mate/academy/Main.java | 36 +++++++++ .../academy/{bookDao => bookdao}/BookDao.java | 10 ++- .../{bookDao => bookdao}/BookDaoImpl.java | 76 +++++++++++++++---- .../academy/dbconnection/ConnectionUtil.java | 2 +- src/main/java/mate/academy/model/Book.java | 14 ++-- 5 files changed, 116 insertions(+), 22 deletions(-) rename src/main/java/mate/academy/{bookDao => bookdao}/BookDao.java (77%) rename src/main/java/mate/academy/{bookDao => bookdao}/BookDaoImpl.java (51%) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 0058fbf9..126f6c81 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,7 +1,43 @@ package mate.academy; +import java.util.List; +import java.util.Optional; +import mate.academy.bookdao.BookDao; +import mate.academy.lib.Injector; +import mate.academy.model.Book; + public class Main { + private static final Injector injector = Injector.getInstance("mate.academy"); + public static void main(String[] args) { + BookDao bookDao = (BookDao) injector.getInstance(BookDao.class); + Book firstBook = Book.of("Effective Java", 700); + Book secondBook = Book.of("Clean Code", 900); + Book thirdBook = Book.of("Head of Java", 600); + + bookDao.create(firstBook); + bookDao.create(secondBook); + bookDao.create(thirdBook); + + List booksFromDb = bookDao.findAll(); + System.out.println(booksFromDb); + + int rowsCount = bookDao.getRowsCount(); + System.out.println(rowsCount); + + Optional bookById = bookDao.findById(3L); + bookById.ifPresent(System.out::println); + + Book book = Book.of(3L, "Harry Potter", 1000); + Book updated = bookDao.update(book); + System.out.println(updated); + + bookDao.findById(3L).ifPresent(System.out::println); + + boolean b = bookDao.deleteById(3L); + System.out.println(b); + + bookDao.clear(); } } diff --git a/src/main/java/mate/academy/bookDao/BookDao.java b/src/main/java/mate/academy/bookdao/BookDao.java similarity index 77% rename from src/main/java/mate/academy/bookDao/BookDao.java rename to src/main/java/mate/academy/bookdao/BookDao.java index abdf0a33..7b34d4e7 100644 --- a/src/main/java/mate/academy/bookDao/BookDao.java +++ b/src/main/java/mate/academy/bookdao/BookDao.java @@ -1,11 +1,15 @@ -package mate.academy.bookDao; - -import mate.academy.model.Book; +package mate.academy.bookdao; import java.util.List; import java.util.Optional; +import mate.academy.model.Book; public interface BookDao { + + int getRowsCount(); + + boolean clear(); + Book create(Book book); Optional findById(Long id); diff --git a/src/main/java/mate/academy/bookDao/BookDaoImpl.java b/src/main/java/mate/academy/bookdao/BookDaoImpl.java similarity index 51% rename from src/main/java/mate/academy/bookDao/BookDaoImpl.java rename to src/main/java/mate/academy/bookdao/BookDaoImpl.java index 2cddb89e..9aea3f0a 100644 --- a/src/main/java/mate/academy/bookDao/BookDaoImpl.java +++ b/src/main/java/mate/academy/bookdao/BookDaoImpl.java @@ -1,9 +1,4 @@ -package mate.academy.bookDao; - -import mate.academy.dbconnection.ConnectionUtil; -import mate.academy.exception.DataProcessingException; -import mate.academy.lib.Dao; -import mate.academy.model.Book; +package mate.academy.bookdao; import java.sql.Connection; import java.sql.PreparedStatement; @@ -13,15 +8,47 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import mate.academy.dbconnection.ConnectionUtil; +import mate.academy.exception.DataProcessingException; +import mate.academy.lib.Dao; +import mate.academy.model.Book; @Dao public class BookDaoImpl implements BookDao { + @Override + public int getRowsCount() { + String sql = "SELECT COUNT(*) AS total_rows FROM book"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql); + ResultSet resultSet = statement.executeQuery()) { + if (resultSet.next()) { + return resultSet.getInt("total_rows"); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't get row count", e); + } + return 0; + } + + @Override + public boolean clear() { + String sql = "TRUNCATE TABLE book"; + try (Connection connection = ConnectionUtil.getConnection(); + Statement statement = connection.createStatement()) { + int affectedRows = statement.executeUpdate(sql); + return affectedRows >= getRowsCount(); + } catch (SQLException e) { + throw new DataProcessingException("Can't clear table", e); + } + } + @Override public Book create(Book book) { String sql = "INSERT INTO book(title, price) VALUES(?, ?)"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + PreparedStatement statement = connection + .prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { statement.setObject(1, book.getTitle()); statement.setInt(2, book.getPrice()); int affectedRows = statement.executeUpdate(); @@ -43,7 +70,7 @@ public Book create(Book book) { public Optional findById(Long id) { String sql = "SELECT * FROM book WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + PreparedStatement preparedStatement = connection.prepareStatement(sql)) { preparedStatement.setLong(1, id); ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { @@ -53,7 +80,7 @@ public Optional findById(Long id) { return Optional.of(book); } } catch (SQLException e) { - throw new DataProcessingException("Can't find book by id " + id + " ", e); + throw new DataProcessingException("Can't find book by id " + id, e); } return Optional.empty(); } @@ -63,8 +90,8 @@ public List findAll() { String sql = "SELECT * FROM book"; List books = new ArrayList<>(); try (Connection connection = ConnectionUtil.getConnection(); - Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery(sql)) { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(sql)) { while (resultSet.next()) { long id = resultSet.getLong("id"); String title = resultSet.getString("title"); @@ -81,11 +108,34 @@ public List findAll() { @Override public Book update(Book book) { String sql = "UPDATE book SET title = ?, price = ? WHERE id = ?"; - return null; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, book.getTitle()); + statement.setInt(2, book.getPrice()); + statement.setLong(3, book.getId()); + int affectedRows = statement.executeUpdate(); + if (affectedRows < 1) { + throw new RuntimeException("Book not found"); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't update book " + book.getTitle(), e); + } + return book; } @Override public boolean deleteById(Long id) { - return false; + String sql = "DELETE FROM book WHERE id = ?"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setLong(1, id); + int affectedRow = statement.executeUpdate(); + if (affectedRow < 1) { + throw new RuntimeException("Book not found by id " + id); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't delete book by " + id, e); + } + return true; } } diff --git a/src/main/java/mate/academy/dbconnection/ConnectionUtil.java b/src/main/java/mate/academy/dbconnection/ConnectionUtil.java index 985c95fe..ebea8c28 100644 --- a/src/main/java/mate/academy/dbconnection/ConnectionUtil.java +++ b/src/main/java/mate/academy/dbconnection/ConnectionUtil.java @@ -24,4 +24,4 @@ public class ConnectionUtil { public static Connection getConnection() throws SQLException { return DriverManager.getConnection(DB_URL, DB_PROPERTIES); } -} \ No newline at end of file +} diff --git a/src/main/java/mate/academy/model/Book.java b/src/main/java/mate/academy/model/Book.java index 07d5fcc8..ef574522 100644 --- a/src/main/java/mate/academy/model/Book.java +++ b/src/main/java/mate/academy/model/Book.java @@ -50,10 +50,14 @@ public int getPrice() { @Override public String toString() { - return "Book{" + - "id=" + id + - ", title='" + title + '\'' + - ", price=" + price + - '}'; + return "Book{" + + "id=" + + id + + ", title='" + + title + + '\'' + + ", price=" + + price + + '}'; } } From 2016722e8e1a651caaad00d65475a36a3ff17004 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Sun, 22 Sep 2024 08:08:58 +0300 Subject: [PATCH 16/23] fix some mistakes --- .../mate/academy/bookdao/BookDaoImpl.java | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/main/java/mate/academy/bookdao/BookDaoImpl.java b/src/main/java/mate/academy/bookdao/BookDaoImpl.java index 9aea3f0a..2f6f15f6 100644 --- a/src/main/java/mate/academy/bookdao/BookDaoImpl.java +++ b/src/main/java/mate/academy/bookdao/BookDaoImpl.java @@ -18,10 +18,11 @@ public class BookDaoImpl implements BookDao { @Override public int getRowsCount() { - String sql = "SELECT COUNT(*) AS total_rows FROM book"; + String sql = "SELECT COUNT(*) AS total_rows FROM books"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(sql); - ResultSet resultSet = statement.executeQuery()) { + PreparedStatement preparedStatement = connection + .prepareStatement(sql); + ResultSet resultSet = preparedStatement.executeQuery()) { if (resultSet.next()) { return resultSet.getInt("total_rows"); } @@ -33,44 +34,46 @@ public int getRowsCount() { @Override public boolean clear() { - String sql = "TRUNCATE TABLE book"; + String sql = "TRUNCATE TABLE books"; try (Connection connection = ConnectionUtil.getConnection(); Statement statement = connection.createStatement()) { - int affectedRows = statement.executeUpdate(sql); - return affectedRows >= getRowsCount(); + statement.executeUpdate(sql); + return true; } catch (SQLException e) { throw new DataProcessingException("Can't clear table", e); } + } @Override public Book create(Book book) { - String sql = "INSERT INTO book(title, price) VALUES(?, ?)"; + String sql = "INSERT INTO books(title, price) VALUES(?, ?)"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection + PreparedStatement preparedStatement = connection .prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { - statement.setObject(1, book.getTitle()); - statement.setInt(2, book.getPrice()); - int affectedRows = statement.executeUpdate(); + preparedStatement.setObject(1, book.getTitle()); + preparedStatement.setInt(2, book.getPrice()); + int affectedRows = preparedStatement.executeUpdate(); if (affectedRows < 1) { throw new RuntimeException("Book could not be created"); } - ResultSet generatedKeys = statement.getGeneratedKeys(); + ResultSet generatedKeys = preparedStatement.getGeneratedKeys(); if (generatedKeys.next()) { long id = generatedKeys.getLong(1); book.setId(id); } } catch (SQLException e) { - throw new DataProcessingException("Can't add a new book " + book.getTitle(), e); + throw new DataProcessingException("Can't add a book " + book, e); } return book; } @Override public Optional findById(Long id) { - String sql = "SELECT * FROM book WHERE id = ?"; + String sql = "SELECT * FROM books WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + PreparedStatement preparedStatement = connection + .prepareStatement(sql)) { preparedStatement.setLong(1, id); ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { @@ -80,14 +83,14 @@ public Optional findById(Long id) { return Optional.of(book); } } catch (SQLException e) { - throw new DataProcessingException("Can't find book by id " + id, e); + throw new DataProcessingException("Can't get book by id " + id, e); } return Optional.empty(); } @Override public List findAll() { - String sql = "SELECT * FROM book"; + String sql = "SELECT * FROM books"; List books = new ArrayList<>(); try (Connection connection = ConnectionUtil.getConnection(); Statement statement = connection.createStatement(); @@ -107,13 +110,14 @@ public List findAll() { @Override public Book update(Book book) { - String sql = "UPDATE book SET title = ?, price = ? WHERE id = ?"; + String sql = "UPDATE books SET title = ?, price = ? WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(sql)) { - statement.setString(1, book.getTitle()); - statement.setInt(2, book.getPrice()); - statement.setLong(3, book.getId()); - int affectedRows = statement.executeUpdate(); + PreparedStatement preparedStatement = connection + .prepareStatement(sql)) { + preparedStatement.setString(1, book.getTitle()); + preparedStatement.setInt(2, book.getPrice()); + preparedStatement.setLong(3, book.getId()); + int affectedRows = preparedStatement.executeUpdate(); if (affectedRows < 1) { throw new RuntimeException("Book not found"); } @@ -125,7 +129,7 @@ public Book update(Book book) { @Override public boolean deleteById(Long id) { - String sql = "DELETE FROM book WHERE id = ?"; + String sql = "DELETE FROM books WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement statement = connection.prepareStatement(sql)) { statement.setLong(1, id); From d0e6c99c9c2a7e53ba8684beee9128cbe81eefe5 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Mon, 23 Sep 2024 10:31:19 +0300 Subject: [PATCH 17/23] Deleted methods clear and getRowCount --- .../java/mate/academy/bookdao/BookDao.java | 4 --- .../mate/academy/bookdao/BookDaoImpl.java | 30 ------------------- 2 files changed, 34 deletions(-) diff --git a/src/main/java/mate/academy/bookdao/BookDao.java b/src/main/java/mate/academy/bookdao/BookDao.java index 7b34d4e7..158e2c0d 100644 --- a/src/main/java/mate/academy/bookdao/BookDao.java +++ b/src/main/java/mate/academy/bookdao/BookDao.java @@ -6,10 +6,6 @@ public interface BookDao { - int getRowsCount(); - - boolean clear(); - Book create(Book book); Optional findById(Long id); diff --git a/src/main/java/mate/academy/bookdao/BookDaoImpl.java b/src/main/java/mate/academy/bookdao/BookDaoImpl.java index 2f6f15f6..1817d554 100644 --- a/src/main/java/mate/academy/bookdao/BookDaoImpl.java +++ b/src/main/java/mate/academy/bookdao/BookDaoImpl.java @@ -15,36 +15,6 @@ @Dao public class BookDaoImpl implements BookDao { - - @Override - public int getRowsCount() { - String sql = "SELECT COUNT(*) AS total_rows FROM books"; - try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement preparedStatement = connection - .prepareStatement(sql); - ResultSet resultSet = preparedStatement.executeQuery()) { - if (resultSet.next()) { - return resultSet.getInt("total_rows"); - } - } catch (SQLException e) { - throw new DataProcessingException("Can't get row count", e); - } - return 0; - } - - @Override - public boolean clear() { - String sql = "TRUNCATE TABLE books"; - try (Connection connection = ConnectionUtil.getConnection(); - Statement statement = connection.createStatement()) { - statement.executeUpdate(sql); - return true; - } catch (SQLException e) { - throw new DataProcessingException("Can't clear table", e); - } - - } - @Override public Book create(Book book) { String sql = "INSERT INTO books(title, price) VALUES(?, ?)"; From 950d728327b999b6ebd9ef5bfff15661d73e0e3e Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Mon, 23 Sep 2024 10:51:09 +0300 Subject: [PATCH 18/23] Changed field type of id/price from long to Long Wrapper. from int to BigDecimal --- src/main/java/mate/academy/model/Book.java | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/mate/academy/model/Book.java b/src/main/java/mate/academy/model/Book.java index ef574522..f3380f0f 100644 --- a/src/main/java/mate/academy/model/Book.java +++ b/src/main/java/mate/academy/model/Book.java @@ -1,30 +1,32 @@ package mate.academy.model; +import java.math.BigDecimal; + public class Book { - private long id; + private Long id; private String title; - private int price; + private BigDecimal price; - private Book(long id, String title, int price) { + private Book(Long id, String title, BigDecimal price) { this.id = id; this.title = title; this.price = price; } - private Book(String title, int price) { + private Book(String title, BigDecimal price) { this.title = title; this.price = price; } - public static Book of(long id, String title, int price) { + public static Book of(Long id, String title, BigDecimal price) { return new Book(id, title, price); } - public static Book of(String title, int price) { + public static Book of(String title, BigDecimal price) { return new Book(title, price); } - public void setId(long id) { + public void setId(Long id) { this.id = id; } @@ -32,11 +34,11 @@ public void setTitle(String title) { this.title = title; } - public void setPrice(int price) { + public void setPrice(BigDecimal price) { this.price = price; } - public long getId() { + public Long getId() { return id; } @@ -44,7 +46,7 @@ public String getTitle() { return title; } - public int getPrice() { + public BigDecimal getPrice() { return price; } From 2016a25ba5c0fb5a06e483ccbeb1914cd755a50e Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Mon, 23 Sep 2024 10:56:07 +0300 Subject: [PATCH 19/23] Changed field type in book table --- src/main/resources/init_db.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql index 70246f6e..5964975f 100644 --- a/src/main/resources/init_db.sql +++ b/src/main/resources/init_db.sql @@ -1,6 +1,6 @@ CREATE TABLE book ( - id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, + id BIGINT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, - price INT NOT NULL + price DECIMAL NOT NULL ); \ No newline at end of file From e8924fc02259631575642746b518fbda8e117467 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Mon, 23 Sep 2024 11:36:16 +0300 Subject: [PATCH 20/23] added separated methods. Refactored code --- .../mate/academy/bookdao/BookDaoImpl.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/java/mate/academy/bookdao/BookDaoImpl.java b/src/main/java/mate/academy/bookdao/BookDaoImpl.java index 1817d554..cff2abde 100644 --- a/src/main/java/mate/academy/bookdao/BookDaoImpl.java +++ b/src/main/java/mate/academy/bookdao/BookDaoImpl.java @@ -1,5 +1,6 @@ package mate.academy.bookdao; +import java.math.BigDecimal; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -21,15 +22,12 @@ public Book create(Book book) { try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement preparedStatement = connection .prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { - preparedStatement.setObject(1, book.getTitle()); - preparedStatement.setInt(2, book.getPrice()); - int affectedRows = preparedStatement.executeUpdate(); - if (affectedRows < 1) { + if (storeBook(preparedStatement, book, false)) { throw new RuntimeException("Book could not be created"); } ResultSet generatedKeys = preparedStatement.getGeneratedKeys(); if (generatedKeys.next()) { - long id = generatedKeys.getLong(1); + Long id = generatedKeys.getObject(1, Long.class); book.setId(id); } } catch (SQLException e) { @@ -47,10 +45,7 @@ public Optional findById(Long id) { preparedStatement.setLong(1, id); ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { - String title = resultSet.getString("title"); - int price = resultSet.getInt("price"); - Book book = Book.of(id, title, price); - return Optional.of(book); + return Optional.of(mapToBook(resultSet)); } } catch (SQLException e) { throw new DataProcessingException("Can't get book by id " + id, e); @@ -66,11 +61,7 @@ public List findAll() { Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql)) { while (resultSet.next()) { - long id = resultSet.getLong("id"); - String title = resultSet.getString("title"); - int price = resultSet.getInt("price"); - Book book = Book.of(id, title, price); - books.add(book); + books.add(mapToBook(resultSet)); } } catch (SQLException e) { throw new DataProcessingException("Can't get all books", e); @@ -84,11 +75,7 @@ public Book update(Book book) { try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement preparedStatement = connection .prepareStatement(sql)) { - preparedStatement.setString(1, book.getTitle()); - preparedStatement.setInt(2, book.getPrice()); - preparedStatement.setLong(3, book.getId()); - int affectedRows = preparedStatement.executeUpdate(); - if (affectedRows < 1) { + if (storeBook(preparedStatement, book, true)) { throw new RuntimeException("Book not found"); } } catch (SQLException e) { @@ -112,4 +99,23 @@ public boolean deleteById(Long id) { } return true; } + + private Book mapToBook(ResultSet resultSet) throws SQLException { + Long id = resultSet.getLong("id"); + String title = resultSet.getString("title"); + BigDecimal price = resultSet.getBigDecimal("price"); + return Book.of(id, title, price); + } + + private boolean storeBook(PreparedStatement preparedStatement, Book book, boolean idPresent) throws SQLException { + if (idPresent) { + preparedStatement.setString(1, book.getTitle()); + preparedStatement.setBigDecimal(2, book.getPrice()); + preparedStatement.setLong(3, book.getId()); + return preparedStatement.executeUpdate() < 1; + } + preparedStatement.setString(1, book.getTitle()); + preparedStatement.setBigDecimal(2, book.getPrice()); + return preparedStatement.executeUpdate() < 1; + } } From 426dd56d955a56646831cef78ef913e273d3daee Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Mon, 23 Sep 2024 11:46:44 +0300 Subject: [PATCH 21/23] Fix some mistakes in initDbSql --- src/main/resources/init_db.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql index 5964975f..adf7fe11 100644 --- a/src/main/resources/init_db.sql +++ b/src/main/resources/init_db.sql @@ -1,4 +1,4 @@ -CREATE TABLE book +CREATE TABLE books ( id BIGINT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, From 878c6f97c21324ab616b07f753a884372157e1d7 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Mon, 23 Sep 2024 11:48:03 +0300 Subject: [PATCH 22/23] Task redo --- src/main/java/mate/academy/Main.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 126f6c81..44b6697a 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,5 +1,6 @@ package mate.academy; +import java.math.BigDecimal; import java.util.List; import java.util.Optional; import mate.academy.bookdao.BookDao; @@ -11,9 +12,9 @@ public class Main { public static void main(String[] args) { BookDao bookDao = (BookDao) injector.getInstance(BookDao.class); - Book firstBook = Book.of("Effective Java", 700); - Book secondBook = Book.of("Clean Code", 900); - Book thirdBook = Book.of("Head of Java", 600); + Book firstBook = Book.of("Effective Java", new BigDecimal(700)); + Book secondBook = Book.of("Clean Code", new BigDecimal(900)); + Book thirdBook = Book.of("Head of Java", new BigDecimal(600)); bookDao.create(firstBook); bookDao.create(secondBook); @@ -22,22 +23,16 @@ public static void main(String[] args) { List booksFromDb = bookDao.findAll(); System.out.println(booksFromDb); - int rowsCount = bookDao.getRowsCount(); - System.out.println(rowsCount); - Optional bookById = bookDao.findById(3L); bookById.ifPresent(System.out::println); - Book book = Book.of(3L, "Harry Potter", 1000); + Book book = Book.of(3L, "Harry Potter", new BigDecimal(1000)); Book updated = bookDao.update(book); System.out.println(updated); bookDao.findById(3L).ifPresent(System.out::println); - boolean b = bookDao.deleteById(3L); - System.out.println(b); - - bookDao.clear(); - + boolean isBookDeleted = bookDao.deleteById(3L); + System.out.println(isBookDeleted); } } From 7e7dec352973b4e082c0f25ea6802bdfee293f92 Mon Sep 17 00:00:00 2001 From: Denys Mazurenko <0gur4ik3992@gmail.com> Date: Mon, 23 Sep 2024 11:50:50 +0300 Subject: [PATCH 23/23] fix mistakes accodring checkstyle --- src/main/java/mate/academy/bookdao/BookDaoImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/mate/academy/bookdao/BookDaoImpl.java b/src/main/java/mate/academy/bookdao/BookDaoImpl.java index cff2abde..ca24eda2 100644 --- a/src/main/java/mate/academy/bookdao/BookDaoImpl.java +++ b/src/main/java/mate/academy/bookdao/BookDaoImpl.java @@ -107,7 +107,8 @@ private Book mapToBook(ResultSet resultSet) throws SQLException { return Book.of(id, title, price); } - private boolean storeBook(PreparedStatement preparedStatement, Book book, boolean idPresent) throws SQLException { + private boolean storeBook(PreparedStatement preparedStatement, + Book book, boolean idPresent) throws SQLException { if (idPresent) { preparedStatement.setString(1, book.getTitle()); preparedStatement.setBigDecimal(2, book.getPrice());