From 1815684265a3c5c9f0d3c883fea7214b7257517e Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Mon, 8 Jul 2024 18:26:08 +0200 Subject: [PATCH 1/9] Created `init_db.sql`, Classes: `BookDaoImpl`, `ConnectionUtilImpl`, `DataProcessingException`, `Book`, `BookServiceImpl`. Created Interfaces: `BookDao`, `ConnectionUtil`, `Entity`, `id`, `Table` and `BookService`. Edit Class `Main`. --- src/main/java/mate/academy/Main.java | 39 ++++++ src/main/java/mate/academy/dao/BookDao.java | 20 +++ .../java/mate/academy/dao/BookDaoImpl.java | 129 ++++++++++++++++++ .../java/mate/academy/dao/ConnectionUtil.java | 4 + .../mate/academy/dao/ConnectionUtilImpl.java | 45 ++++++ .../exceptions/DataProcessingException.java | 12 ++ src/main/java/mate/academy/lib/Entity.java | 8 ++ src/main/java/mate/academy/lib/Table.java | 11 ++ src/main/java/mate/academy/lib/id.java | 11 ++ src/main/java/mate/academy/models/Book.java | 48 +++++++ .../mate/academy/service/BookService.java | 16 +++ .../mate/academy/service/BookServiceImpl.java | 61 +++++++++ src/main/resources/init_db.sql | 7 + 13 files changed, 411 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/dao/ConnectionUtil.java create mode 100644 src/main/java/mate/academy/dao/ConnectionUtilImpl.java create mode 100644 src/main/java/mate/academy/exceptions/DataProcessingException.java create mode 100644 src/main/java/mate/academy/lib/Entity.java create mode 100644 src/main/java/mate/academy/lib/Table.java create mode 100644 src/main/java/mate/academy/lib/id.java create mode 100644 src/main/java/mate/academy/models/Book.java create mode 100644 src/main/java/mate/academy/service/BookService.java create mode 100644 src/main/java/mate/academy/service/BookServiceImpl.java create mode 100644 src/main/resources/init_db.sql diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 0058fbf9..3313ab00 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,7 +1,46 @@ package mate.academy; +import mate.academy.dao.BookDao; +import mate.academy.dao.ConnectionUtilImpl; +import mate.academy.lib.Injector; +import mate.academy.models.Book; +import mate.academy.service.BookService; +import mate.academy.service.BookServiceImpl; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + public class Main { + private static final Injector injector = Injector + .getInstance("C:\\Users\\illio\\IdeaProjects\\jv-jdbc-intro"); + private static final String PASSWORD = "illya"; + private static final String DB_URL = "jdbs.mysql://localhost:3306/my_db"; + private static final BigDecimal NEW_PRICE = new BigDecimal("120.50"); + public static void main(String[] args) { +// ConnectionUtilImpl.setPassword(PASSWORD); +// ConnectionUtilImpl.setDbUrl(DB_URL); + BookDao bookDao = (BookDao) injector.getInstance(BookDao.class); + BookService bookService = new BookServiceImpl(bookDao); + + Map dataForBooks = Map.of("Java", new BigDecimal(300), + "Python", new BigDecimal(200), "C++", new BigDecimal(100)); + dataForBooks.forEach((key, value) -> { + Book currentBook = new Book(); + currentBook.setTitle(key); + currentBook.setPrice(value); + bookService.save(currentBook); + }); + Book book = bookService.get(2L); + System.out.printf("Method get return: " + book); + book.setPrice(book.getPrice().multiply(NEW_PRICE)); + book = bookService.update(book); + System.out.printf("Method update return: " + book); + boolean isDeleteBook = bookService.delete(book); + System.out.printf("Method delete return: " + isDeleteBook); + List bookList2 = bookService.getAll(); + System.out.printf("Method getAll return: " + bookList2.toString()); } } 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..033b9e59 --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -0,0 +1,20 @@ +package mate.academy.dao; + +import mate.academy.lib.Dao; +import mate.academy.models.Book; +import java.util.List; +import java.util.Optional; + +@Dao +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..d2626df6 --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -0,0 +1,129 @@ +package mate.academy.dao; + +import mate.academy.exceptions.DataProcessingException; +import mate.academy.lib.Dao; +import mate.academy.models.Book; + +import java.math.BigDecimal; +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; + +@Dao +public class BookDaoImpl implements BookDao { + @Override + public Book create(Book book) { + String sql = "INSERT INTO books (title, price) VALUE (?, ?)"; + try (PreparedStatement prepareStatement = ConnectionUtilImpl.getConnection() + .prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + + prepareStatement.setString(1, book.getTitle()); + prepareStatement.setBigDecimal(2, book.getPrice()); + + int affectedRows = prepareStatement.executeUpdate(); + if (affectedRows > 1) { + book.setId(getIdFromResultSet(prepareStatement.getGeneratedKeys())); + return book; + } + throw new DataProcessingException("Can't save the new book: " + book); + } catch (SQLException e) { + throw new DataProcessingException("Can't save a book: " + book, e); + } + } + + @Override + public Optional findById(Long id) { + String sql = "SELECT * FROM books WHERE id = ?"; + try (PreparedStatement prepareStatement = ConnectionUtilImpl.getConnection() + .prepareStatement(sql)) { + + prepareStatement.setLong(1, id); + + return getBookFromResultSet(prepareStatement.executeQuery()); + } catch (SQLException e) { + throw new DataProcessingException("Can't get a book by id: " + id, e); + } + } + + @Override + public List findAll() { + String sql = "SELECT * FROM books"; + try (PreparedStatement prepareStatement = ConnectionUtilImpl.getConnection() + .prepareStatement(sql)) { + + return getAllFromResultSet(prepareStatement.executeQuery()); + } catch (SQLException e) { + throw new DataProcessingException("Can't get any books from the database", e); + } + } + + @Override + public Book update(Book book) { + String sql = "UPDATE books SET title = ?, price = ?) WHERE id = ?"; + try (PreparedStatement prepareStatement = ConnectionUtilImpl.getConnection() + .prepareStatement(sql)) { + + prepareStatement.setString(1, book.getTitle()); + prepareStatement.setBigDecimal(2, book.getPrice()); + prepareStatement.setLong(3, book.getId()); + + int updatedRows = prepareStatement.executeUpdate(); + if (updatedRows > 1) { + return book; + } + throw new DataProcessingException("Can't update the book: " + book); + } catch (SQLException e) { + throw new DataProcessingException("Can't update the book: " + book, e); + } + } + + @Override + public boolean deleteById(Long id) { + String sql = "DELETE FROM books WHERE id = ?"; + try (PreparedStatement prepareStatement = ConnectionUtilImpl.getConnection() + .prepareStatement(sql)) { + + prepareStatement.setLong(1, id); + + int updatedRows = prepareStatement.executeUpdate(); + return updatedRows > 1; + + } catch (SQLException e) { + throw new DataProcessingException("Can't delete the book by id: " + id, e); + } + } + + private Long getIdFromResultSet(ResultSet generatedKeys) throws SQLException { + if (generatedKeys.next()) { + return generatedKeys.getObject(1, Long.class); + } + throw new DataProcessingException("Can't writing the book to the database, missing ID"); + } + + private Optional getBookFromResultSet(ResultSet resultSet) throws SQLException { + if (resultSet.next()) { + Long id = resultSet.getObject("id", Long.class); + String title = resultSet.getString("title"); + BigDecimal price = resultSet.getObject("price", BigDecimal.class); + + Book book = new Book(); + book.setId(id); + book.setTitle(title); + book.setPrice(price); + return Optional.of(book); + } + return Optional.empty(); + } + + private List getAllFromResultSet(ResultSet resultSet) throws SQLException { + List bookList = new ArrayList<>(); + do { + getBookFromResultSet(resultSet).ifPresent(bookList::add); + } while (resultSet.next()); + return bookList; + } +} diff --git a/src/main/java/mate/academy/dao/ConnectionUtil.java b/src/main/java/mate/academy/dao/ConnectionUtil.java new file mode 100644 index 00000000..70ecc1b5 --- /dev/null +++ b/src/main/java/mate/academy/dao/ConnectionUtil.java @@ -0,0 +1,4 @@ +package mate.academy.dao; + +public interface ConnectionUtil { +} diff --git a/src/main/java/mate/academy/dao/ConnectionUtilImpl.java b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java new file mode 100644 index 00000000..15d97a74 --- /dev/null +++ b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java @@ -0,0 +1,45 @@ +package mate.academy.dao; + +import mate.academy.exceptions.DataProcessingException; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +public class ConnectionUtilImpl implements ConnectionUtil { + private static String db_url; + private static final Properties DB_PROPERTIES; + private static String password; + + static { + DB_PROPERTIES = new Properties(); + DB_PROPERTIES.put("user", "root"); + DB_PROPERTIES.put("password", "illya"); + + try { + Class.forName("com.mysql.cj.jdbs.Driver"); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Can not load JDBS driver", e); + } + } + + public static void setDbUrl(String db_url) { + if (db_url == null) { + throw new DataProcessingException("URL for database SQL is empty"); + } + ConnectionUtilImpl.db_url = db_url; + } + + public static void setPassword(String password) { + if (password == null) { + throw new DataProcessingException("Password for database SQL is empty"); + } + ConnectionUtilImpl.password = password; + } + + static Connection getConnection() throws SQLException { + return DriverManager.getConnection("jdbs.mysql://localhost:3306/my_db", DB_PROPERTIES); + } + +} diff --git a/src/main/java/mate/academy/exceptions/DataProcessingException.java b/src/main/java/mate/academy/exceptions/DataProcessingException.java new file mode 100644 index 00000000..e5a244c1 --- /dev/null +++ b/src/main/java/mate/academy/exceptions/DataProcessingException.java @@ -0,0 +1,12 @@ +package mate.academy.exceptions; + +public class DataProcessingException extends RuntimeException { + public DataProcessingException(String message) { + super(message); + } + + public DataProcessingException(String message, Throwable cause) { + super(message, cause); + + } +} diff --git a/src/main/java/mate/academy/lib/Entity.java b/src/main/java/mate/academy/lib/Entity.java new file mode 100644 index 00000000..f5f33b77 --- /dev/null +++ b/src/main/java/mate/academy/lib/Entity.java @@ -0,0 +1,8 @@ +package mate.academy.lib; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Entity { +} diff --git a/src/main/java/mate/academy/lib/Table.java b/src/main/java/mate/academy/lib/Table.java new file mode 100644 index 00000000..4deb052e --- /dev/null +++ b/src/main/java/mate/academy/lib/Table.java @@ -0,0 +1,11 @@ +package mate.academy.lib; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Table { + String name(); + + String schema(); +} diff --git a/src/main/java/mate/academy/lib/id.java b/src/main/java/mate/academy/lib/id.java new file mode 100644 index 00000000..e6e2b085 --- /dev/null +++ b/src/main/java/mate/academy/lib/id.java @@ -0,0 +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.FIELD) +public @interface id { +} diff --git a/src/main/java/mate/academy/models/Book.java b/src/main/java/mate/academy/models/Book.java new file mode 100644 index 00000000..8749d4db --- /dev/null +++ b/src/main/java/mate/academy/models/Book.java @@ -0,0 +1,48 @@ +package mate.academy.models; + +import mate.academy.lib.Entity; +import mate.academy.lib.Table; +import java.math.BigDecimal; + +@Entity +@Table(name = "books", schema = "test") +public class Book { + private Long id; + private String title; + private BigDecimal price; + + public Book() { + } + 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/service/BookService.java b/src/main/java/mate/academy/service/BookService.java new file mode 100644 index 00000000..0fd3b968 --- /dev/null +++ b/src/main/java/mate/academy/service/BookService.java @@ -0,0 +1,16 @@ +package mate.academy.service; + +import mate.academy.models.Book; +import java.util.List; + +public interface BookService { + Book save(Book book); + + Book get(Long id); + + List getAll(); + + Book update(Book book); + + boolean delete(Book book); +} diff --git a/src/main/java/mate/academy/service/BookServiceImpl.java b/src/main/java/mate/academy/service/BookServiceImpl.java new file mode 100644 index 00000000..4b28a887 --- /dev/null +++ b/src/main/java/mate/academy/service/BookServiceImpl.java @@ -0,0 +1,61 @@ +package mate.academy.service; + +import mate.academy.dao.BookDao; +import mate.academy.exceptions.DataProcessingException; +import mate.academy.models.Book; + +import java.util.List; + +public class BookServiceImpl implements BookService{ + private final BookDao bookDao; + + public BookServiceImpl(BookDao bookDao) { + if (bookDao == null) { + throw new DataProcessingException("The argument (bookDao) is null"); + } + this.bookDao = bookDao; + } + + @Override + public Book save(Book book) { + if (book == null) { + throw new DataProcessingException("The argument (book) is null"); + } + return bookDao.create(book); + } + + @Override + public Book get(Long id) { + if (id == null) { + throw new DataProcessingException("The argument (id) is null"); + } + return bookDao.findById(id) + .orElseThrow(() -> new DataProcessingException("Can't find a book with id: " + + id)); + } + + @Override + public List getAll() { + List bookList = bookDao.findAll(); + if (bookList.isEmpty()) { + throw new DataProcessingException("Can't get any books from the database"); + } + return bookList; + } + + @Override + public Book update(Book book) { + if (book == null) { + throw new DataProcessingException("The argument (book) is null"); + } + return bookDao.update(book); + } + + @Override + public boolean delete(Book book) { + if (book == null || book.getId() == null) { + throw new DataProcessingException("The argument (book) or id is null"); + } + return bookDao.deleteById(book.getId()); + } +} diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql new file mode 100644 index 00000000..b4dfc36e --- /dev/null +++ b/src/main/resources/init_db.sql @@ -0,0 +1,7 @@ +CREATE DATABASE `my_db`; +USE my_db; +CREATE TABLE books ( + id BIGINT PRIMARY KEY, + title VARCHAR(50), + price DECIMAL(10,2) + ); \ No newline at end of file From 2f9705e7cb022d791db680b94395805b67827f78 Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Mon, 8 Jul 2024 21:48:58 +0200 Subject: [PATCH 2/9] Created `init_db.sql`, Classes: `BookDaoImpl`, `ConnectionUtilImpl`, `DataProcessingException`, `Book`, `BookServiceImpl`. Created Interfaces: `BookDao`, `ConnectionUtil`, `Entity`, `Table` and `BookService`. Edit Class `Main`. --- src/main/java/mate/academy/Main.java | 13 ++++++------- .../mate/academy/dao/ConnectionUtilImpl.java | 16 ---------------- src/main/java/mate/academy/lib/id.java | 11 ----------- 3 files changed, 6 insertions(+), 34 deletions(-) delete mode 100644 src/main/java/mate/academy/lib/id.java diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 3313ab00..b3fb7a80 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,6 +1,7 @@ package mate.academy; import mate.academy.dao.BookDao; +import mate.academy.dao.BookDaoImpl; import mate.academy.dao.ConnectionUtilImpl; import mate.academy.lib.Injector; import mate.academy.models.Book; @@ -8,29 +9,27 @@ import mate.academy.service.BookServiceImpl; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; import java.util.Map; public class Main { private static final Injector injector = Injector .getInstance("C:\\Users\\illio\\IdeaProjects\\jv-jdbc-intro"); - private static final String PASSWORD = "illya"; - private static final String DB_URL = "jdbs.mysql://localhost:3306/my_db"; private static final BigDecimal NEW_PRICE = new BigDecimal("120.50"); public static void main(String[] args) { -// ConnectionUtilImpl.setPassword(PASSWORD); -// ConnectionUtilImpl.setDbUrl(DB_URL); - BookDao bookDao = (BookDao) injector.getInstance(BookDao.class); + BookDao bookDao = (BookDao) injector.getInstance(BookDaoImpl.class); BookService bookService = new BookServiceImpl(bookDao); + List savedBooks = new ArrayList<>(); Map dataForBooks = Map.of("Java", new BigDecimal(300), "Python", new BigDecimal(200), "C++", new BigDecimal(100)); dataForBooks.forEach((key, value) -> { Book currentBook = new Book(); currentBook.setTitle(key); currentBook.setPrice(value); - bookService.save(currentBook); + savedBooks.add(bookService.save(currentBook)); }); Book book = bookService.get(2L); @@ -38,7 +37,7 @@ public static void main(String[] args) { book.setPrice(book.getPrice().multiply(NEW_PRICE)); book = bookService.update(book); System.out.printf("Method update return: " + book); - boolean isDeleteBook = bookService.delete(book); + boolean isDeleteBook = bookService.delete(savedBooks.get(0)); System.out.printf("Method delete return: " + isDeleteBook); List bookList2 = bookService.getAll(); System.out.printf("Method getAll return: " + bookList2.toString()); diff --git a/src/main/java/mate/academy/dao/ConnectionUtilImpl.java b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java index 15d97a74..5b0b61ec 100644 --- a/src/main/java/mate/academy/dao/ConnectionUtilImpl.java +++ b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java @@ -8,9 +8,7 @@ import java.util.Properties; public class ConnectionUtilImpl implements ConnectionUtil { - private static String db_url; private static final Properties DB_PROPERTIES; - private static String password; static { DB_PROPERTIES = new Properties(); @@ -24,20 +22,6 @@ public class ConnectionUtilImpl implements ConnectionUtil { } } - public static void setDbUrl(String db_url) { - if (db_url == null) { - throw new DataProcessingException("URL for database SQL is empty"); - } - ConnectionUtilImpl.db_url = db_url; - } - - public static void setPassword(String password) { - if (password == null) { - throw new DataProcessingException("Password for database SQL is empty"); - } - ConnectionUtilImpl.password = password; - } - static Connection getConnection() throws SQLException { return DriverManager.getConnection("jdbs.mysql://localhost:3306/my_db", DB_PROPERTIES); } diff --git a/src/main/java/mate/academy/lib/id.java b/src/main/java/mate/academy/lib/id.java deleted file mode 100644 index e6e2b085..00000000 --- a/src/main/java/mate/academy/lib/id.java +++ /dev/null @@ -1,11 +0,0 @@ -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.FIELD) -public @interface id { -} From 21c5b9a26c1129b4debaed5827668ce5f329155e Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Mon, 8 Jul 2024 21:49:29 +0200 Subject: [PATCH 3/9] Created `init_db.sql`, Classes: `BookDaoImpl`, `ConnectionUtilImpl`, `DataProcessingException`, `Book`, `BookServiceImpl`. Created Interfaces: `BookDao`, `ConnectionUtil`, `Entity`, `Table` and `BookService`. Edit Class `Main`. --- src/main/java/mate/academy/Main.java | 1 - src/main/java/mate/academy/dao/ConnectionUtilImpl.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index b3fb7a80..8216bf46 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -2,7 +2,6 @@ import mate.academy.dao.BookDao; import mate.academy.dao.BookDaoImpl; -import mate.academy.dao.ConnectionUtilImpl; import mate.academy.lib.Injector; import mate.academy.models.Book; import mate.academy.service.BookService; diff --git a/src/main/java/mate/academy/dao/ConnectionUtilImpl.java b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java index 5b0b61ec..3f353183 100644 --- a/src/main/java/mate/academy/dao/ConnectionUtilImpl.java +++ b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java @@ -1,7 +1,5 @@ package mate.academy.dao; -import mate.academy.exceptions.DataProcessingException; - import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; From fa9ae0bde42fcc5e26f51ccb6d7cdd7a07ceea64 Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Mon, 8 Jul 2024 22:18:26 +0200 Subject: [PATCH 4/9] Edit Classes `Main`, `ConnectionUtilImpl`, `Book`, `BookDaoImpl`. --- src/main/java/mate/academy/Main.java | 10 ++++++---- src/main/java/mate/academy/dao/BookDao.java | 2 -- src/main/java/mate/academy/dao/BookDaoImpl.java | 1 - src/main/java/mate/academy/dao/ConnectionUtilImpl.java | 3 ++- src/main/java/mate/academy/models/Book.java | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 8216bf46..c1f5b6c1 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,12 +1,10 @@ package mate.academy; import mate.academy.dao.BookDao; -import mate.academy.dao.BookDaoImpl; import mate.academy.lib.Injector; import mate.academy.models.Book; import mate.academy.service.BookService; import mate.academy.service.BookServiceImpl; - import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -14,11 +12,11 @@ public class Main { private static final Injector injector = Injector - .getInstance("C:\\Users\\illio\\IdeaProjects\\jv-jdbc-intro"); + .getInstance("mate.academy"); private static final BigDecimal NEW_PRICE = new BigDecimal("120.50"); public static void main(String[] args) { - BookDao bookDao = (BookDao) injector.getInstance(BookDaoImpl.class); + BookDao bookDao = (BookDao) injector.getInstance(BookDao.class); BookService bookService = new BookServiceImpl(bookDao); List savedBooks = new ArrayList<>(); @@ -30,14 +28,18 @@ public static void main(String[] args) { currentBook.setPrice(value); savedBooks.add(bookService.save(currentBook)); }); + System.out.println("savedBooks = " + savedBooks); Book book = bookService.get(2L); System.out.printf("Method get return: " + book); + book.setPrice(book.getPrice().multiply(NEW_PRICE)); book = bookService.update(book); System.out.printf("Method update return: " + book); + boolean isDeleteBook = bookService.delete(savedBooks.get(0)); System.out.printf("Method delete return: " + isDeleteBook); + List bookList2 = bookService.getAll(); System.out.printf("Method getAll return: " + bookList2.toString()); } diff --git a/src/main/java/mate/academy/dao/BookDao.java b/src/main/java/mate/academy/dao/BookDao.java index 033b9e59..83f2cd67 100644 --- a/src/main/java/mate/academy/dao/BookDao.java +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -1,11 +1,9 @@ package mate.academy.dao; -import mate.academy.lib.Dao; import mate.academy.models.Book; import java.util.List; import java.util.Optional; -@Dao 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 d2626df6..43720458 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -3,7 +3,6 @@ import mate.academy.exceptions.DataProcessingException; import mate.academy.lib.Dao; import mate.academy.models.Book; - import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.ResultSet; diff --git a/src/main/java/mate/academy/dao/ConnectionUtilImpl.java b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java index 3f353183..1ab96e79 100644 --- a/src/main/java/mate/academy/dao/ConnectionUtilImpl.java +++ b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java @@ -6,6 +6,7 @@ import java.util.Properties; public class ConnectionUtilImpl implements ConnectionUtil { + private static final String DB_URL = "jdbs.mysql://localhost:3306/my_db"; private static final Properties DB_PROPERTIES; static { @@ -21,7 +22,7 @@ public class ConnectionUtilImpl implements ConnectionUtil { } static Connection getConnection() throws SQLException { - return DriverManager.getConnection("jdbs.mysql://localhost:3306/my_db", DB_PROPERTIES); + return DriverManager.getConnection(DB_URL, DB_PROPERTIES); } } diff --git a/src/main/java/mate/academy/models/Book.java b/src/main/java/mate/academy/models/Book.java index 8749d4db..29b050f3 100644 --- a/src/main/java/mate/academy/models/Book.java +++ b/src/main/java/mate/academy/models/Book.java @@ -5,7 +5,7 @@ import java.math.BigDecimal; @Entity -@Table(name = "books", schema = "test") +@Table(name = "books", schema = "my_db") public class Book { private Long id; private String title; From 6a36b98953c6a5a20d993955556d445fc476a204 Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Mon, 8 Jul 2024 22:34:16 +0200 Subject: [PATCH 5/9] Corrected style. --- src/main/java/mate/academy/Main.java | 8 ++++---- src/main/java/mate/academy/dao/BookDao.java | 2 +- src/main/java/mate/academy/dao/BookDaoImpl.java | 8 ++++---- src/main/java/mate/academy/models/Book.java | 13 +++++++------ src/main/java/mate/academy/service/BookService.java | 2 +- .../java/mate/academy/service/BookServiceImpl.java | 5 ++--- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index c1f5b6c1..eecfa0e1 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,14 +1,14 @@ package mate.academy; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import mate.academy.dao.BookDao; import mate.academy.lib.Injector; import mate.academy.models.Book; import mate.academy.service.BookService; import mate.academy.service.BookServiceImpl; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; public class Main { private static final Injector injector = Injector diff --git a/src/main/java/mate/academy/dao/BookDao.java b/src/main/java/mate/academy/dao/BookDao.java index 83f2cd67..2b9c3353 100644 --- a/src/main/java/mate/academy/dao/BookDao.java +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -1,8 +1,8 @@ package mate.academy.dao; -import mate.academy.models.Book; import java.util.List; import java.util.Optional; +import mate.academy.models.Book; public interface BookDao { diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index 43720458..fc61b842 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -1,8 +1,5 @@ package mate.academy.dao; -import mate.academy.exceptions.DataProcessingException; -import mate.academy.lib.Dao; -import mate.academy.models.Book; import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -11,6 +8,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import mate.academy.exceptions.DataProcessingException; +import mate.academy.lib.Dao; +import mate.academy.models.Book; @Dao public class BookDaoImpl implements BookDao { @@ -88,7 +88,7 @@ public boolean deleteById(Long id) { prepareStatement.setLong(1, id); - int updatedRows = prepareStatement.executeUpdate(); + int updatedRows = prepareStatement.executeUpdate(); return updatedRows > 1; } catch (SQLException e) { diff --git a/src/main/java/mate/academy/models/Book.java b/src/main/java/mate/academy/models/Book.java index 29b050f3..5d661b0a 100644 --- a/src/main/java/mate/academy/models/Book.java +++ b/src/main/java/mate/academy/models/Book.java @@ -1,8 +1,8 @@ package mate.academy.models; +import java.math.BigDecimal; import mate.academy.lib.Entity; import mate.academy.lib.Table; -import java.math.BigDecimal; @Entity @Table(name = "books", schema = "my_db") @@ -13,6 +13,7 @@ public class Book { public Book() { } + public Long getId() { return id; } @@ -39,10 +40,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/service/BookService.java b/src/main/java/mate/academy/service/BookService.java index 0fd3b968..c25e2937 100644 --- a/src/main/java/mate/academy/service/BookService.java +++ b/src/main/java/mate/academy/service/BookService.java @@ -1,7 +1,7 @@ package mate.academy.service; -import mate.academy.models.Book; import java.util.List; +import mate.academy.models.Book; public interface BookService { Book save(Book book); diff --git a/src/main/java/mate/academy/service/BookServiceImpl.java b/src/main/java/mate/academy/service/BookServiceImpl.java index 4b28a887..3a4717d8 100644 --- a/src/main/java/mate/academy/service/BookServiceImpl.java +++ b/src/main/java/mate/academy/service/BookServiceImpl.java @@ -1,12 +1,11 @@ package mate.academy.service; +import java.util.List; import mate.academy.dao.BookDao; import mate.academy.exceptions.DataProcessingException; import mate.academy.models.Book; -import java.util.List; - -public class BookServiceImpl implements BookService{ +public class BookServiceImpl implements BookService { private final BookDao bookDao; public BookServiceImpl(BookDao bookDao) { From 43c2fd5de817e7594bf5fbff151f6853c7ada4d3 Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Mon, 8 Jul 2024 23:18:08 +0200 Subject: [PATCH 6/9] Corrected code in Classes `BookDaoImpl` and `ConnectionUtilImpl`. --- .../java/mate/academy/dao/BookDaoImpl.java | 22 +++++++------------ .../mate/academy/dao/ConnectionUtilImpl.java | 6 +++-- src/main/java/mate/academy/lib/Dao.java | 4 ---- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index fc61b842..847ab64f 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -23,8 +23,7 @@ public Book create(Book book) { prepareStatement.setString(1, book.getTitle()); prepareStatement.setBigDecimal(2, book.getPrice()); - int affectedRows = prepareStatement.executeUpdate(); - if (affectedRows > 1) { + if (prepareStatement.executeUpdate() > 1) { book.setId(getIdFromResultSet(prepareStatement.getGeneratedKeys())); return book; } @@ -70,8 +69,7 @@ public Book update(Book book) { prepareStatement.setBigDecimal(2, book.getPrice()); prepareStatement.setLong(3, book.getId()); - int updatedRows = prepareStatement.executeUpdate(); - if (updatedRows > 1) { + if (prepareStatement.executeUpdate() > 1) { return book; } throw new DataProcessingException("Can't update the book: " + book); @@ -88,9 +86,7 @@ public boolean deleteById(Long id) { prepareStatement.setLong(1, id); - int updatedRows = prepareStatement.executeUpdate(); - return updatedRows > 1; - + return prepareStatement.executeUpdate() > 1; } catch (SQLException e) { throw new DataProcessingException("Can't delete the book by id: " + id, e); } @@ -105,14 +101,12 @@ private Long getIdFromResultSet(ResultSet generatedKeys) throws SQLException { private Optional getBookFromResultSet(ResultSet resultSet) throws SQLException { if (resultSet.next()) { - Long id = resultSet.getObject("id", Long.class); - String title = resultSet.getString("title"); - BigDecimal price = resultSet.getObject("price", BigDecimal.class); - Book book = new Book(); - book.setId(id); - book.setTitle(title); - book.setPrice(price); + + book.setId(resultSet.getObject("id", Long.class)); + book.setTitle(resultSet.getString("title")); + book.setPrice(resultSet.getObject("price", BigDecimal.class)); + return Optional.of(book); } return Optional.empty(); diff --git a/src/main/java/mate/academy/dao/ConnectionUtilImpl.java b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java index 1ab96e79..69e31ba5 100644 --- a/src/main/java/mate/academy/dao/ConnectionUtilImpl.java +++ b/src/main/java/mate/academy/dao/ConnectionUtilImpl.java @@ -6,13 +6,15 @@ import java.util.Properties; public class ConnectionUtilImpl implements ConnectionUtil { + private static final String USER = "root"; + private static final String PASSWORD = "illya"; private static final String DB_URL = "jdbs.mysql://localhost:3306/my_db"; private static final Properties DB_PROPERTIES; static { DB_PROPERTIES = new Properties(); - DB_PROPERTIES.put("user", "root"); - DB_PROPERTIES.put("password", "illya"); + DB_PROPERTIES.put("user", USER); + DB_PROPERTIES.put("password", PASSWORD); try { Class.forName("com.mysql.cj.jdbs.Driver"); diff --git a/src/main/java/mate/academy/lib/Dao.java b/src/main/java/mate/academy/lib/Dao.java index f558d09a..22f45911 100644 --- a/src/main/java/mate/academy/lib/Dao.java +++ b/src/main/java/mate/academy/lib/Dao.java @@ -1,8 +1,4 @@ package mate.academy.lib; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) public @interface Dao { } From f8f6563cc366ee444af9248c5190e19a8d51b5b0 Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Tue, 9 Jul 2024 14:23:52 +0200 Subject: [PATCH 7/9] Delete Classes `Entity` and `Table`. --- pom.xml | 8 ++++++++ src/main/java/mate/academy/Main.java | 7 ++++--- src/main/java/mate/academy/lib/Entity.java | 8 -------- src/main/java/mate/academy/lib/Table.java | 11 ----------- src/main/java/mate/academy/models/Book.java | 4 ---- 5 files changed, 12 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/mate/academy/lib/Entity.java delete mode 100644 src/main/java/mate/academy/lib/Table.java diff --git a/pom.xml b/pom.xml index 683e84ec..9e45dc54 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,14 @@ + + + com.mysql + mysql-connector-j + 8.4.0 + + + diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index eecfa0e1..e2c4627f 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -20,9 +20,10 @@ public static void main(String[] args) { BookService bookService = new BookServiceImpl(bookDao); List savedBooks = new ArrayList<>(); - Map dataForBooks = Map.of("Java", new BigDecimal(300), - "Python", new BigDecimal(200), "C++", new BigDecimal(100)); - dataForBooks.forEach((key, value) -> { + Map.of("Java", new BigDecimal(300), + "Python", new BigDecimal(200), + "C++", new BigDecimal(100)) + .forEach((key, value) -> { Book currentBook = new Book(); currentBook.setTitle(key); currentBook.setPrice(value); diff --git a/src/main/java/mate/academy/lib/Entity.java b/src/main/java/mate/academy/lib/Entity.java deleted file mode 100644 index f5f33b77..00000000 --- a/src/main/java/mate/academy/lib/Entity.java +++ /dev/null @@ -1,8 +0,0 @@ -package mate.academy.lib; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface Entity { -} diff --git a/src/main/java/mate/academy/lib/Table.java b/src/main/java/mate/academy/lib/Table.java deleted file mode 100644 index 4deb052e..00000000 --- a/src/main/java/mate/academy/lib/Table.java +++ /dev/null @@ -1,11 +0,0 @@ -package mate.academy.lib; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface Table { - String name(); - - String schema(); -} diff --git a/src/main/java/mate/academy/models/Book.java b/src/main/java/mate/academy/models/Book.java index 5d661b0a..de901713 100644 --- a/src/main/java/mate/academy/models/Book.java +++ b/src/main/java/mate/academy/models/Book.java @@ -1,11 +1,7 @@ package mate.academy.models; import java.math.BigDecimal; -import mate.academy.lib.Entity; -import mate.academy.lib.Table; -@Entity -@Table(name = "books", schema = "my_db") public class Book { private Long id; private String title; From 8c06edba1e6142d951023f47aa782847f6f0b089 Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Tue, 9 Jul 2024 17:51:50 +0200 Subject: [PATCH 8/9] Correct style. --- src/main/java/mate/academy/Main.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index e2c4627f..91788ca2 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -24,11 +24,11 @@ public static void main(String[] args) { "Python", new BigDecimal(200), "C++", new BigDecimal(100)) .forEach((key, value) -> { - Book currentBook = new Book(); - currentBook.setTitle(key); - currentBook.setPrice(value); - savedBooks.add(bookService.save(currentBook)); - }); + Book currentBook = new Book(); + currentBook.setTitle(key); + currentBook.setPrice(value); + savedBooks.add(bookService.save(currentBook)); + }); System.out.println("savedBooks = " + savedBooks); Book book = bookService.get(2L); From 340d32092fe40d8fb65f711afe8e8c1de5424e82 Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Thu, 11 Jul 2024 09:14:27 +0200 Subject: [PATCH 9/9] Corrected mistakes. --- src/main/java/mate/academy/Main.java | 6 +++--- src/main/java/mate/academy/dao/BookDaoImpl.java | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 91788ca2..88f3de9a 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -23,10 +23,10 @@ public static void main(String[] args) { Map.of("Java", new BigDecimal(300), "Python", new BigDecimal(200), "C++", new BigDecimal(100)) - .forEach((key, value) -> { + .forEach((title, price) -> { Book currentBook = new Book(); - currentBook.setTitle(key); - currentBook.setPrice(value); + currentBook.setTitle(title); + currentBook.setPrice(price); savedBooks.add(bookService.save(currentBook)); }); System.out.println("savedBooks = " + savedBooks); diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index 847ab64f..d4c04093 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -50,10 +50,9 @@ public Optional findById(Long id) { @Override public List findAll() { String sql = "SELECT * FROM books"; - try (PreparedStatement prepareStatement = ConnectionUtilImpl.getConnection() - .prepareStatement(sql)) { + try (Statement statement = ConnectionUtilImpl.getConnection().createStatement()) { - return getAllFromResultSet(prepareStatement.executeQuery()); + return getAllFromResultSet(statement.executeQuery(sql)); } catch (SQLException e) { throw new DataProcessingException("Can't get any books from the database", e); } @@ -61,7 +60,7 @@ public List findAll() { @Override public Book update(Book book) { - String sql = "UPDATE books SET title = ?, price = ?) WHERE id = ?"; + String sql = "UPDATE books SET title = ?, price = ? WHERE id = ?"; try (PreparedStatement prepareStatement = ConnectionUtilImpl.getConnection() .prepareStatement(sql)) {