From 276e5db9ee90ef40349c775e0243d43e293f6299 Mon Sep 17 00:00:00 2001 From: Bohdan Stratiychuk Date: Tue, 22 Oct 2024 20:46:49 +0300 Subject: [PATCH 1/2] developed dao logic --- pom.xml | 7 + src/main/java/mate/academy/Main.java | 18 ++- src/main/java/mate/academy/book/BookDao.java | 17 +++ .../java/mate/academy/book/BookDaoImpl.java | 121 ++++++++++++++++++ .../academy/connection/ConnectionUtils.java | 28 ++++ .../exception/DataProcessingException.java | 7 + src/main/java/mate/academy/model/Book.java | 72 +++++++++++ src/main/resources/init_db.sql | 2 + 8 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 src/main/java/mate/academy/book/BookDao.java create mode 100644 src/main/java/mate/academy/book/BookDaoImpl.java create mode 100644 src/main/java/mate/academy/connection/ConnectionUtils.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/resources/init_db.sql diff --git a/pom.xml b/pom.xml index 683e84ec..a683c740 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 + 9.1.0 + + diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 0058fbf9..93da811c 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,7 +1,23 @@ package mate.academy; +import java.math.BigDecimal; +import mate.academy.book.BookDao; +import mate.academy.lib.Injector; +import mate.academy.model.Book; + public class Main { - public static void main(String[] args) { + private static final Injector injector = Injector + .getInstance("mate.academy.lib"); + private static final BookDao dao = (BookDao) injector.getInstance(BookDao.class); + private static final BigDecimal BIG_DECIMAL = new BigDecimal(8855); + private static final Book BOOK_TO_CREATE = new Book("title", BIG_DECIMAL); + private static final Book BOOK_TO_UPDATE = new Book(2L,"name", BIG_DECIMAL); + public static void main(String[] args) { + dao.create(BOOK_TO_CREATE); + dao.deleteById(3L); + dao.update(BOOK_TO_UPDATE); + dao.findById(1L); + dao.findAll(); } } diff --git a/src/main/java/mate/academy/book/BookDao.java b/src/main/java/mate/academy/book/BookDao.java new file mode 100644 index 00000000..5732e156 --- /dev/null +++ b/src/main/java/mate/academy/book/BookDao.java @@ -0,0 +1,17 @@ +package mate.academy.book; + +import java.util.List; +import java.util.Optional; +import mate.academy.model.Book; + +public interface BookDao { + Book create(Book book); + + Optional findById(Long id); + + List findAll(); + + Book update(Book book); + + boolean deleteById(Long id); +} diff --git a/src/main/java/mate/academy/book/BookDaoImpl.java b/src/main/java/mate/academy/book/BookDaoImpl.java new file mode 100644 index 00000000..b6d18d25 --- /dev/null +++ b/src/main/java/mate/academy/book/BookDaoImpl.java @@ -0,0 +1,121 @@ +package mate.academy.book; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import mate.academy.connection.ConnectionUtils; +import mate.academy.exception.DataProcessingException; +import mate.academy.lib.Dao; +import mate.academy.model.Book; + +@Dao +public class BookDaoImpl implements BookDao { + + @Override + public Book create(Book book) { + int titlePlace = 1; + int pricePlace = 2; + String sqlInsertionStatement = "INSERT INTO book (title, price) VALUES (?, ?)"; + try (Connection connection = ConnectionUtils.getConnection(); + PreparedStatement statement = connection.prepareStatement(sqlInsertionStatement, + PreparedStatement.RETURN_GENERATED_KEYS)) { + statement.setString(titlePlace, book.getTitle()); + statement.setBigDecimal(pricePlace, book.getPrice()); + int affectedRows = statement.executeUpdate(); + if (affectedRows > 0) { + try (ResultSet generatedKeys = statement.getGeneratedKeys()) { + if (generatedKeys.next()) { + book.setId(generatedKeys.getLong(1)); + } + } + } + } catch (SQLException e) { + throw new DataProcessingException("Unable to insert book: " + book.toString(), e); + } + return book; + } + + @Override + public Optional findById(Long id) { + int variablePlace = 1; + String sqlGetStatement = "SELECT * FROM book WHERE id = ?"; + try (Connection connection = ConnectionUtils.getConnection(); + PreparedStatement statement = connection.prepareStatement(sqlGetStatement)) { + statement.setLong(variablePlace,id); + ResultSet resultSet = statement.executeQuery(); + if (resultSet.next()) { + Long idFromDB = resultSet.getObject("id", Long.class); + String title = resultSet.getString("title"); + BigDecimal price = resultSet.getObject("price", BigDecimal.class); + Book book = new Book(idFromDB,title,price); + return Optional.of(book); + } + return Optional.empty(); + } catch (SQLException e) { + throw new DataProcessingException("Cant get book with id:" + id, e); + } + } + + @Override + public List findAll() { + String sqlFindAllStatement = "SELECT * FROM book"; + List books = new ArrayList<>(); + try (Connection connection = ConnectionUtils.getConnection(); + PreparedStatement statement = connection.prepareStatement(sqlFindAllStatement); + ResultSet resultSet = statement.executeQuery()) { + + while (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(id, title, price); + books.add(book); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't read data", e); + } + return books; + } + + @Override + public Book update(Book book) { + int idPlace = 3; + int titlePlace = 1; + int pricePlace = 2; + String sqlUpdateStatement = "UPDATE book SET title = ?, price = ? WHERE id = ?"; + try (Connection connection = ConnectionUtils.getConnection(); + PreparedStatement statement = connection.prepareStatement(sqlUpdateStatement)) { + statement.setLong(idPlace,book.getId()); + statement.setString(titlePlace,book.getTitle()); + statement.setBigDecimal(pricePlace,book.getPrice()); + int affectedRows = statement.executeUpdate(); + if (affectedRows > 0) { + return book; + } else { + throw new RuntimeException("Failed to update book with id: " + book.getId()); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't update " + book.toString(), e); + } + } + + @Override + public boolean deleteById(Long id) { + int idPlace = 1; + String sqlDeleteStatement = "DELETE FROM book WHERE id = ? "; + try (Connection connection = ConnectionUtils.getConnection(); + PreparedStatement statement = connection.prepareStatement(sqlDeleteStatement)) { + statement.setLong(idPlace,id); + int affectedRows = statement.executeUpdate(); + return affectedRows > 0; + } catch (SQLException e) { + throw new DataProcessingException("Can't delete book with id: " + id, e); + } + } +} diff --git a/src/main/java/mate/academy/connection/ConnectionUtils.java b/src/main/java/mate/academy/connection/ConnectionUtils.java new file mode 100644 index 00000000..858e9e78 --- /dev/null +++ b/src/main/java/mate/academy/connection/ConnectionUtils.java @@ -0,0 +1,28 @@ +package mate.academy.connection; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; +import mate.academy.exception.DataProcessingException; + +public class ConnectionUtils { + 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", "4321"); + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + throw new DataProcessingException("Can't load JDBC driver", e); + } + } + + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(DB_URL,DB_PROPERTIES); + } +} 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..de9b45dc --- /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(message, ex); + } +} 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..6663bd81 --- /dev/null +++ b/src/main/java/mate/academy/model/Book.java @@ -0,0 +1,72 @@ +package mate.academy.model; + +import java.math.BigDecimal; +import java.util.Objects; + +public class Book { + private long id; + private String title; + private BigDecimal price; + + public Book(long id, String title, BigDecimal price) { + this.id = id; + this.title = title; + this.price = price; + } + + public Book(String title, BigDecimal price) { + this.title = title; + this.price = price; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Book book = (Book) o; + return id == book.id && Objects + .equals(title, book.title) && Objects.equals(price, book.price); + } + + @Override + public int hashCode() { + return Objects.hash(id, title, 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 + System.lineSeparator() + + ", price=" + price + + '}'; + } +} diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql new file mode 100644 index 00000000..0ec996b4 --- /dev/null +++ b/src/main/resources/init_db.sql @@ -0,0 +1,2 @@ +select * +from book \ No newline at end of file From 90a862407335da394e755acc5457b78a9883d125 Mon Sep 17 00:00:00 2001 From: Bohdan Stratiychuk Date: Wed, 23 Oct 2024 16:02:03 +0300 Subject: [PATCH 2/2] checkstyling --- src/main/java/mate/academy/connection/ConnectionUtils.java | 6 ++++-- src/main/java/mate/academy/model/Book.java | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/mate/academy/connection/ConnectionUtils.java b/src/main/java/mate/academy/connection/ConnectionUtils.java index 858e9e78..7537d68e 100644 --- a/src/main/java/mate/academy/connection/ConnectionUtils.java +++ b/src/main/java/mate/academy/connection/ConnectionUtils.java @@ -9,11 +9,13 @@ public class ConnectionUtils { private static final String DB_URL = "jdbc:mysql://localhost:3306/test"; private static final Properties DB_PROPERTIES; + private static final String PASSWORD = "4321"; + private static final String USER = "root"; static { DB_PROPERTIES = new Properties(); - DB_PROPERTIES.put("user", "root"); - DB_PROPERTIES.put("password", "4321"); + DB_PROPERTIES.put("user", USER); + DB_PROPERTIES.put("password", PASSWORD); try { Class.forName("com.mysql.cj.jdbc.Driver"); diff --git a/src/main/java/mate/academy/model/Book.java b/src/main/java/mate/academy/model/Book.java index 6663bd81..6028c56e 100644 --- a/src/main/java/mate/academy/model/Book.java +++ b/src/main/java/mate/academy/model/Book.java @@ -4,11 +4,11 @@ import java.util.Objects; public class Book { - private long id; + private Long id; private String title; private BigDecimal price; - public Book(long id, String title, BigDecimal price) { + public Book(Long id, String title, BigDecimal price) { this.id = id; this.title = title; this.price = price;