From d84252e38aa33cdf2aea628456b954395aa9703f Mon Sep 17 00:00:00 2001 From: Vitalii Date: Fri, 11 Aug 2023 18:08:53 +0300 Subject: [PATCH 01/11] implemented CRUD operations --- pom.xml | 7 ++ src/main/java/mate/academy/Main.java | 36 ++++++ src/main/java/mate/academy/dao/BookDao.java | 13 ++ .../java/mate/academy/dao/BookDaoImpl.java | 117 ++++++++++++++++++ .../exception/DataProcessingException.java | 7 ++ src/main/java/mate/academy/lib/Dao.java | 3 + src/main/java/mate/academy/model/Book.java | 42 +++++++ .../mate/academy/util/ConnectionUtil.java | 26 ++++ src/main/resources/init_db.sql | 14 +++ 9 files changed, 265 insertions(+) create mode 100644 src/main/java/mate/academy/dao/BookDao.java create mode 100644 src/main/java/mate/academy/dao/BookDaoImpl.java create mode 100644 src/main/java/mate/academy/exception/DataProcessingException.java create mode 100644 src/main/java/mate/academy/model/Book.java create mode 100644 src/main/java/mate/academy/util/ConnectionUtil.java create mode 100644 src/main/resources/init_db.sql diff --git a/pom.xml b/pom.xml index 526fbcf3..5203cef3 100644 --- a/pom.xml +++ b/pom.xml @@ -8,6 +8,13 @@ jv-jdbc-intro 1.0-SNAPSHOT + + + com.mysql + mysql-connector-j + 8.1.0 + + 17 17 diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 0058fbf9..655ab28e 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 mate.academy.dao.BookDao; +import mate.academy.dao.BookDaoImpl; +import mate.academy.lib.Injector; +import mate.academy.model.Book; + +import java.math.BigDecimal; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.List; +import java.util.Optional; +import java.util.Properties; + 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 book = new Book(); + book.setTitle("Java to Wood People"); + book.setPrice(BigDecimal.valueOf(350)); + + //Create + Book createdBook = bookDao.create(book); + + //findById + Optional bookById = bookDao.findById(3l); + System.out.println(bookById); + + //findAll + List allBooksFromDb = bookDao.findAll(); + + //update + book.setTitle("JDBC for wood people, Part2"); + book.setPrice(BigDecimal.valueOf(500)); + book.setId(3L); + Book updatedBook = bookDao.update(book); + //delete + bookDao.deleteById(4L); } } 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..9ce14471 --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -0,0 +1,13 @@ +package mate.academy.dao; + +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); +} 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..ddc29aeb --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -0,0 +1,117 @@ +package mate.academy.dao; + +import mate.academy.lib.Dao; +import mate.academy.model.Book; +import mate.academy.util.ConnectionUtil; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Dao +public class BookDaoImpl implements BookDao { + @Override + 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)) { + statement.setString(1, book.getTitle()); + statement.setBigDecimal(2, book.getPrice()); + + int affectedRows = statement.executeUpdate(); + if (affectedRows < 1) { + throw new RuntimeException("Expected to insert at least 1 row, but inserted 0 rows."); + } + + ResultSet generatedKeys = statement.getGeneratedKeys(); + if (generatedKeys.next()) { + Long id = generatedKeys.getObject(1, Long.class); + book.setId(id); + } + } catch (SQLException e) { + throw new RuntimeException("Can`t get a new Book: " + book, e); + } + return book; + } + + @Override + public Optional findById(Long id) { + String query = "SELECT * FROM books WHERE id = ?"; + Book bookFromDb = null; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + statement.setLong(1, 3L); + + ResultSet resultSet = statement.executeQuery(); + if (resultSet.next()) { + bookFromDb = parseResultSetInBook(resultSet); + } + } catch (SQLException e) { + throw new RuntimeException("Can not find Book with id: " + id, e); + } + return Optional.ofNullable(bookFromDb); + } + + @Override + public List findAll() { + String query = "SELECT * FROM books"; + List allBooksFromDb = new ArrayList<>(); + try (Connection connection = ConnectionUtil.getConnection(); + Statement statement = connection.createStatement()) { + ResultSet resultSet = statement.executeQuery(query); + while (resultSet.next()) { + allBooksFromDb.add(parseResultSetInBook(resultSet)); + } + } catch (SQLException e) { + throw new RuntimeException("Can`t get all elements from DB.", e); + } + return allBooksFromDb; + } + + @Override + public Book update(Book book) { + 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()); + + int affectedRow = statement.executeUpdate(); + if (affectedRow < 1) { + throw new RuntimeException("Expected to update at least 1 row but was 0."); + } + + } catch (SQLException e) { + throw new RuntimeException("Can not update row by the book with id: " + book.getId(), e); + } + return book; + } + + @Override + public boolean deleteById(Long id) { + String query = "DELETE FROM books WHERE id = ?"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + statement.setLong(1, 4L); + + int affectedRow = statement.executeUpdate(); + if (affectedRow < 1) { + throw new RuntimeException("Expected to delete at least 1 row but was 0."); + } + return affectedRow == 1; + } catch (SQLException e) { + throw new RuntimeException("Can not delete row by the id: " + id, e); + } + } + + + private Book parseResultSetInBook(ResultSet resultSet) throws SQLException { + Book dbBook = new Book(); + dbBook.setId(resultSet.getLong("id")); + dbBook.setTitle(resultSet.getString("title")); + dbBook.setPrice(resultSet.getBigDecimal("price")); + return dbBook; + } +} 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..60b4f6a4 --- /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 ex) { + super(); + } +} diff --git a/src/main/java/mate/academy/lib/Dao.java b/src/main/java/mate/academy/lib/Dao.java index f558d09a..8d0b19fc 100644 --- a/src/main/java/mate/academy/lib/Dao.java +++ b/src/main/java/mate/academy/lib/Dao.java @@ -1,8 +1,11 @@ package mate.academy.lib; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) public @interface Dao { } 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..f4eb65cb --- /dev/null +++ b/src/main/java/mate/academy/model/Book.java @@ -0,0 +1,42 @@ +package mate.academy.model; + +import java.math.BigDecimal; + +public class Book { + private Long id; + private String title; + private BigDecimal 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 String toString() { + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", price=" + price + + '}'; + } +} 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..8716a1e5 --- /dev/null +++ b/src/main/java/mate/academy/util/ConnectionUtil.java @@ -0,0 +1,26 @@ +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 DB_URL = "jdbc:mysql://localhost:3306/books_db"; + private static final Properties DB_PRORETIES; + + static { + DB_PRORETIES = new Properties(); + DB_PRORETIES.put("user", "root"); + DB_PRORETIES.put("password", "V11M07k2001mm"); + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(DB_URL, DB_PRORETIES); + } +} diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql new file mode 100644 index 00000000..12a000d4 --- /dev/null +++ b/src/main/resources/init_db.sql @@ -0,0 +1,14 @@ +SHOW DATABASES; + +CREATE database books_db; + +USE books_db; + +CREATE TABLE books ( + id INT NOT NULL AUTO_INCREMENT, + title VARCHAR(255), + price INT, + PRIMARY KEY (id) +); + +SHOW TABLES; From cdc6a3947bec09a22c6ab214e0eae9417c10ce44 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Fri, 11 Aug 2023 18:12:31 +0300 Subject: [PATCH 02/11] removed redudant imports --- src/main/java/mate/academy/Main.java | 4 ---- src/main/java/mate/academy/dao/BookDao.java | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 655ab28e..3e30bf0a 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,16 +1,12 @@ package mate.academy; import mate.academy.dao.BookDao; -import mate.academy.dao.BookDaoImpl; import mate.academy.lib.Injector; import mate.academy.model.Book; import java.math.BigDecimal; -import java.sql.DriverManager; -import java.sql.SQLException; import java.util.List; import java.util.Optional; -import java.util.Properties; public class Main { private static final Injector injector = Injector.getInstance("mate.academy"); diff --git a/src/main/java/mate/academy/dao/BookDao.java b/src/main/java/mate/academy/dao/BookDao.java index 9ce14471..70f5463c 100644 --- a/src/main/java/mate/academy/dao/BookDao.java +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -1,6 +1,7 @@ package mate.academy.dao; import mate.academy.model.Book; + import java.util.List; import java.util.Optional; From 7a62efffb4025afcb5d45aede807d0959b4a22d9 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Fri, 11 Aug 2023 18:24:00 +0300 Subject: [PATCH 03/11] fixed commmon mistakes --- src/main/java/mate/academy/dao/BookDaoImpl.java | 2 +- src/main/resources/init_db.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index ddc29aeb..23400aaf 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -100,7 +100,7 @@ public boolean deleteById(Long id) { if (affectedRow < 1) { throw new RuntimeException("Expected to delete at least 1 row but was 0."); } - return affectedRow == 1; + return affectedRow > 0; } catch (SQLException e) { throw new RuntimeException("Can not delete row by the id: " + id, e); } diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql index 12a000d4..b323fcf0 100644 --- a/src/main/resources/init_db.sql +++ b/src/main/resources/init_db.sql @@ -5,7 +5,7 @@ CREATE database books_db; USE books_db; CREATE TABLE books ( - id INT NOT NULL AUTO_INCREMENT, + id BIGINT NOT NULL AUTO_INCREMENT, title VARCHAR(255), price INT, PRIMARY KEY (id) From 29f212cdbe22f51afdecfababb54b7e840356381 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Fri, 11 Aug 2023 18:31:27 +0300 Subject: [PATCH 04/11] changed Exceptions to custom exception --- src/main/java/mate/academy/dao/BookDaoImpl.java | 13 +++++++------ .../academy/exception/DataProcessingException.java | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index 23400aaf..90599a48 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -1,5 +1,6 @@ package mate.academy.dao; +import mate.academy.exception.DataProcessingException; import mate.academy.lib.Dao; import mate.academy.model.Book; import mate.academy.util.ConnectionUtil; @@ -30,7 +31,7 @@ public Book create(Book book) { book.setId(id); } } catch (SQLException e) { - throw new RuntimeException("Can`t get a new Book: " + book, e); + throw new DataProcessingException("Can`t get a new Book: " + book, e); } return book; } @@ -48,7 +49,7 @@ public Optional findById(Long id) { bookFromDb = parseResultSetInBook(resultSet); } } catch (SQLException e) { - throw new RuntimeException("Can not find Book with id: " + id, e); + throw new DataProcessingException("Can not find Book with id: " + id, e); } return Optional.ofNullable(bookFromDb); } @@ -64,7 +65,7 @@ public List findAll() { allBooksFromDb.add(parseResultSetInBook(resultSet)); } } catch (SQLException e) { - throw new RuntimeException("Can`t get all elements from DB.", e); + throw new DataProcessingException("Can`t get all elements from DB.", e); } return allBooksFromDb; } @@ -84,7 +85,7 @@ public Book update(Book book) { } } catch (SQLException e) { - throw new RuntimeException("Can not update row by the book with id: " + book.getId(), e); + throw new DataProcessingException("Can not update row by the book with id: " + book.getId(), e); } return book; } @@ -94,7 +95,7 @@ public boolean deleteById(Long id) { String query = "DELETE FROM books WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement statement = connection.prepareStatement(query)) { - statement.setLong(1, 4L); + statement.setLong(1, 6L); int affectedRow = statement.executeUpdate(); if (affectedRow < 1) { @@ -102,7 +103,7 @@ public boolean deleteById(Long id) { } return affectedRow > 0; } catch (SQLException e) { - throw new RuntimeException("Can not delete row by the id: " + id, e); + throw new DataProcessingException("Can not delete row by the id: " + id, e); } } diff --git a/src/main/java/mate/academy/exception/DataProcessingException.java b/src/main/java/mate/academy/exception/DataProcessingException.java index 60b4f6a4..de9b45dc 100644 --- a/src/main/java/mate/academy/exception/DataProcessingException.java +++ b/src/main/java/mate/academy/exception/DataProcessingException.java @@ -2,6 +2,6 @@ public class DataProcessingException extends RuntimeException { public DataProcessingException(String message, Throwable ex) { - super(); + super(message, ex); } } From c5a1f65749d7605f41cb6961e68fc389641233a3 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Mon, 14 Aug 2023 16:48:23 +0300 Subject: [PATCH 05/11] removed magic numbers, redudant conditions and fixed common mistakes --- src/main/java/mate/academy/Main.java | 1 - src/main/java/mate/academy/dao/BookDao.java | 4 +++ .../java/mate/academy/dao/BookDaoImpl.java | 36 ++++++++----------- src/main/resources/init_db.sql | 3 -- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 3e30bf0a..ffae4585 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -30,7 +30,6 @@ public static void main(String[] args) { //update book.setTitle("JDBC for wood people, Part2"); book.setPrice(BigDecimal.valueOf(500)); - book.setId(3L); Book updatedBook = bookDao.update(book); //delete diff --git a/src/main/java/mate/academy/dao/BookDao.java b/src/main/java/mate/academy/dao/BookDao.java index 70f5463c..f6babee6 100644 --- a/src/main/java/mate/academy/dao/BookDao.java +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -7,8 +7,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 90599a48..c32d54d6 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -12,19 +12,18 @@ @Dao public class BookDaoImpl implements BookDao { + private static final int FIRST_PARAM = 1; + private static final int SECOND_PARAM = 2; + private static final int THIRD_PARAM = 3; + private static final long THIRD_ID = 3L; + @Override 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)) { - statement.setString(1, book.getTitle()); - statement.setBigDecimal(2, book.getPrice()); - - int affectedRows = statement.executeUpdate(); - if (affectedRows < 1) { - throw new RuntimeException("Expected to insert at least 1 row, but inserted 0 rows."); - } - + statement.setString(FIRST_PARAM, book.getTitle()); + statement.setBigDecimal(SECOND_PARAM, book.getPrice()); ResultSet generatedKeys = statement.getGeneratedKeys(); if (generatedKeys.next()) { Long id = generatedKeys.getObject(1, Long.class); @@ -42,7 +41,7 @@ public Optional findById(Long id) { Book bookFromDb = null; try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement statement = connection.prepareStatement(query)) { - statement.setLong(1, 3L); + statement.setLong(FIRST_PARAM, id); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { @@ -75,9 +74,9 @@ public Book update(Book book) { 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()); + statement.setString(FIRST_PARAM, book.getTitle()); + statement.setBigDecimal(SECOND_PARAM, book.getPrice()); + statement.setLong(THIRD_PARAM, THIRD_ID); int affectedRow = statement.executeUpdate(); if (affectedRow < 1) { @@ -85,7 +84,7 @@ public Book update(Book book) { } } catch (SQLException e) { - throw new DataProcessingException("Can not update row by the book with id: " + book.getId(), e); + throw new DataProcessingException("Can not update book with id: " + book.getId(), e); } return book; } @@ -95,15 +94,10 @@ public boolean deleteById(Long id) { String query = "DELETE FROM books WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement statement = connection.prepareStatement(query)) { - statement.setLong(1, 6L); - - int affectedRow = statement.executeUpdate(); - if (affectedRow < 1) { - throw new RuntimeException("Expected to delete at least 1 row but was 0."); - } - return affectedRow > 0; + statement.setLong(FIRST_PARAM, id); + return statement.executeUpdate() > 0; } catch (SQLException e) { - throw new DataProcessingException("Can not delete row by the id: " + id, e); + throw new DataProcessingException("Can not delete book by the id: " + id, e); } } diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql index b323fcf0..1c54b007 100644 --- a/src/main/resources/init_db.sql +++ b/src/main/resources/init_db.sql @@ -1,5 +1,3 @@ -SHOW DATABASES; - CREATE database books_db; USE books_db; @@ -11,4 +9,3 @@ CREATE TABLE books ( PRIMARY KEY (id) ); -SHOW TABLES; From c40bec7c8d5de38fc2ae8d52d402dde499051eef Mon Sep 17 00:00:00 2001 From: Vitalii Date: Mon, 14 Aug 2023 17:21:09 +0300 Subject: [PATCH 06/11] fixed checkstyle mistakes --- pom.xml | 55 +++++++++++++++++-- src/main/java/mate/academy/Main.java | 9 ++- src/main/java/mate/academy/dao/BookDao.java | 3 +- .../java/mate/academy/dao/BookDaoImpl.java | 25 +++++---- src/main/java/mate/academy/model/Book.java | 10 ++-- .../mate/academy/util/ConnectionUtil.java | 11 ++-- 6 files changed, 79 insertions(+), 34 deletions(-) diff --git a/pom.xml b/pom.xml index 5203cef3..973658f9 100644 --- a/pom.xml +++ b/pom.xml @@ -8,6 +8,16 @@ jv-jdbc-intro 1.0-SNAPSHOT + + 17 + 17 + 17 + UTF-8 + + https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml + + + com.mysql @@ -15,10 +25,43 @@ 8.1.0 - - 17 - 17 - UTF-8 - - + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.1.1 + + + compile + + check + + + + + ${maven.checkstyle.plugin.configLocation} + UTF-8 + true + true + false + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${jdk.version} + ${jdk.version} + ${project.build.sourceEncoding} + + + + + + \ No newline at end of file diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index ffae4585..e3b8c6c9 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,12 +1,11 @@ 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.Optional; +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"); @@ -21,7 +20,7 @@ public static void main(String[] args) { Book createdBook = bookDao.create(book); //findById - Optional bookById = bookDao.findById(3l); + Optional bookById = bookDao.findById(3L); System.out.println(bookById); //findAll diff --git a/src/main/java/mate/academy/dao/BookDao.java b/src/main/java/mate/academy/dao/BookDao.java index f6babee6..d60c063d 100644 --- a/src/main/java/mate/academy/dao/BookDao.java +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -1,9 +1,8 @@ package mate.academy.dao; -import mate.academy.model.Book; - import java.util.List; import java.util.Optional; +import mate.academy.model.Book; public interface BookDao { Book create(Book book); diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index c32d54d6..9d318291 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -1,15 +1,18 @@ package mate.academy.dao; +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; -import java.sql.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - @Dao public class BookDaoImpl implements BookDao { private static final int FIRST_PARAM = 1; @@ -21,7 +24,8 @@ public class BookDaoImpl implements BookDao { 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(FIRST_PARAM, book.getTitle()); statement.setBigDecimal(SECOND_PARAM, book.getPrice()); ResultSet generatedKeys = statement.getGeneratedKeys(); @@ -40,7 +44,7 @@ public Optional findById(Long id) { String query = "SELECT * FROM books WHERE id = ?"; Book bookFromDb = null; try (Connection connection = ConnectionUtil.getConnection(); - PreparedStatement statement = connection.prepareStatement(query)) { + PreparedStatement statement = connection.prepareStatement(query)) { statement.setLong(FIRST_PARAM, id); ResultSet resultSet = statement.executeQuery(); @@ -58,7 +62,7 @@ public List findAll() { String query = "SELECT * FROM books"; List allBooksFromDb = new ArrayList<>(); try (Connection connection = ConnectionUtil.getConnection(); - Statement statement = connection.createStatement()) { + Statement statement = connection.createStatement()) { ResultSet resultSet = statement.executeQuery(query); while (resultSet.next()) { allBooksFromDb.add(parseResultSetInBook(resultSet)); @@ -73,7 +77,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(FIRST_PARAM, book.getTitle()); statement.setBigDecimal(SECOND_PARAM, book.getPrice()); statement.setLong(THIRD_PARAM, THIRD_ID); @@ -93,7 +97,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(FIRST_PARAM, id); return statement.executeUpdate() > 0; } catch (SQLException e) { @@ -101,7 +105,6 @@ public boolean deleteById(Long id) { } } - private Book parseResultSetInBook(ResultSet resultSet) throws SQLException { Book dbBook = new Book(); dbBook.setId(resultSet.getLong("id")); diff --git a/src/main/java/mate/academy/model/Book.java b/src/main/java/mate/academy/model/Book.java index f4eb65cb..e2cb4289 100644 --- a/src/main/java/mate/academy/model/Book.java +++ b/src/main/java/mate/academy/model/Book.java @@ -33,10 +33,10 @@ public void setPrice(BigDecimal price) { @Override public String toString() { - return "Book{" + - "id=" + id + - ", title='" + title + '\'' + - ", price=" + price + - '}'; + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", price=" + price + + '}'; } } diff --git a/src/main/java/mate/academy/util/ConnectionUtil.java b/src/main/java/mate/academy/util/ConnectionUtil.java index 8716a1e5..8154c1d2 100644 --- a/src/main/java/mate/academy/util/ConnectionUtil.java +++ b/src/main/java/mate/academy/util/ConnectionUtil.java @@ -7,12 +7,12 @@ public class ConnectionUtil { private static final String DB_URL = "jdbc:mysql://localhost:3306/books_db"; - private static final Properties DB_PRORETIES; + private static final Properties DB_PROPERTIES; static { - DB_PRORETIES = new Properties(); - DB_PRORETIES.put("user", "root"); - DB_PRORETIES.put("password", "V11M07k2001mm"); + DB_PROPERTIES = new Properties(); + DB_PROPERTIES.put("user", "root"); + DB_PROPERTIES.put("password", "V11M07k2001mm"); try { Class.forName("com.mysql.cj.jdbc.Driver"); @@ -20,7 +20,8 @@ public class ConnectionUtil { throw new RuntimeException(e); } } + public static Connection getConnection() throws SQLException { - return DriverManager.getConnection(DB_URL, DB_PRORETIES); + return DriverManager.getConnection(DB_URL, DB_PROPERTIES); } } From 490c67e3bf936e03ae87ff9c456cd39d508f8161 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Mon, 14 Aug 2023 17:30:18 +0300 Subject: [PATCH 07/11] returned prev pom.xml --- pom.xml | 55 ++++++------------------------------------------------- 1 file changed, 6 insertions(+), 49 deletions(-) diff --git a/pom.xml b/pom.xml index 973658f9..5203cef3 100644 --- a/pom.xml +++ b/pom.xml @@ -8,16 +8,6 @@ jv-jdbc-intro 1.0-SNAPSHOT - - 17 - 17 - 17 - UTF-8 - - https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml - - - com.mysql @@ -25,43 +15,10 @@ 8.1.0 + + 17 + 17 + UTF-8 + - - - - org.apache.maven.plugins - maven-checkstyle-plugin - 3.1.1 - - - compile - - check - - - - - ${maven.checkstyle.plugin.configLocation} - UTF-8 - true - true - false - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.0 - - ${jdk.version} - ${jdk.version} - ${project.build.sourceEncoding} - - - - - - \ No newline at end of file + From e649c81d2b807ecca5588c3d453eed17306de729 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Mon, 14 Aug 2023 17:34:27 +0300 Subject: [PATCH 08/11] saves pom.xml --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5203cef3..966af155 100644 --- a/pom.xml +++ b/pom.xml @@ -20,5 +20,4 @@ 17 UTF-8 - From 864a19621e6564d6f97b1c6717206b54dc4db8bc Mon Sep 17 00:00:00 2001 From: Vitalii Date: Mon, 14 Aug 2023 17:49:13 +0300 Subject: [PATCH 09/11] switched to original pom.xml --- pom.xml | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 966af155..d8533ac2 100644 --- a/pom.xml +++ b/pom.xml @@ -7,17 +7,59 @@ org.example jv-jdbc-intro 1.0-SNAPSHOT - com.mysql mysql-connector-j - 8.1.0 + 8.0.33 + 17 17 17 UTF-8 + + https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml + - + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.1.1 + + + compile + + check + + + + + ${maven.checkstyle.plugin.configLocation} + UTF-8 + true + true + false + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${jdk.version} + ${jdk.version} + ${project.build.sourceEncoding} + + + + + + \ No newline at end of file From 59060477fb022157cc0536cffa9aeca17b97c849 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Mon, 14 Aug 2023 20:23:48 +0300 Subject: [PATCH 10/11] fixed mistakes with pom.xml file --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 942a48be..91586692 100644 --- a/pom.xml +++ b/pom.xml @@ -62,3 +62,4 @@ + \ No newline at end of file From 7afa37d348abe17db8b183e6fa7bb493d462e153 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Tue, 15 Aug 2023 16:10:55 +0300 Subject: [PATCH 11/11] fixed mistakes with msgs --- pom.xml | 2 +- src/main/java/mate/academy/dao/BookDaoImpl.java | 12 +++--------- src/main/java/mate/academy/util/ConnectionUtil.java | 2 +- src/main/resources/init_db.sql | 2 +- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 91586692..7f371a9e 100644 --- a/pom.xml +++ b/pom.xml @@ -62,4 +62,4 @@ - \ No newline at end of file + diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index 9d318291..57e159f3 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -34,7 +34,7 @@ public Book create(Book book) { book.setId(id); } } catch (SQLException e) { - throw new DataProcessingException("Can`t get a new Book: " + book, e); + throw new DataProcessingException("Can`t create a new book: " + book, e); } return book; } @@ -46,7 +46,6 @@ public Optional findById(Long id) { try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement statement = connection.prepareStatement(query)) { statement.setLong(FIRST_PARAM, id); - ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { bookFromDb = parseResultSetInBook(resultSet); @@ -81,12 +80,7 @@ public Book update(Book book) { statement.setString(FIRST_PARAM, book.getTitle()); statement.setBigDecimal(SECOND_PARAM, book.getPrice()); statement.setLong(THIRD_PARAM, THIRD_ID); - - int affectedRow = statement.executeUpdate(); - if (affectedRow < 1) { - throw new RuntimeException("Expected to update at least 1 row but was 0."); - } - + statement.executeUpdate(); } catch (SQLException e) { throw new DataProcessingException("Can not update book with id: " + book.getId(), e); } @@ -107,7 +101,7 @@ public boolean deleteById(Long id) { private Book parseResultSetInBook(ResultSet resultSet) throws SQLException { Book dbBook = new Book(); - dbBook.setId(resultSet.getLong("id")); + dbBook.setId(resultSet.getObject("id", Long.class)); dbBook.setTitle(resultSet.getString("title")); dbBook.setPrice(resultSet.getBigDecimal("price")); return dbBook; diff --git a/src/main/java/mate/academy/util/ConnectionUtil.java b/src/main/java/mate/academy/util/ConnectionUtil.java index 8154c1d2..58b241af 100644 --- a/src/main/java/mate/academy/util/ConnectionUtil.java +++ b/src/main/java/mate/academy/util/ConnectionUtil.java @@ -17,7 +17,7 @@ public class ConnectionUtil { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + throw new RuntimeException("Can not load the JDBC DRIVER", e); } } diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql index 1c54b007..e7fb4074 100644 --- a/src/main/resources/init_db.sql +++ b/src/main/resources/init_db.sql @@ -5,7 +5,7 @@ USE books_db; CREATE TABLE books ( id BIGINT NOT NULL AUTO_INCREMENT, title VARCHAR(255), - price INT, + price DECIMAL, PRIMARY KEY (id) );