From b00965746e802c4acf3e5e89c2a33ed7ed706091 Mon Sep 17 00:00:00 2001 From: Valerii Date: Sun, 13 Aug 2023 23:35:24 +0300 Subject: [PATCH] first commit --- pom.xml | 7 ++ src/main/java/mate/academy/Main.java | 21 ++++ src/main/java/mate/academy/dao/BookDao.java | 18 +++ .../java/mate/academy/dao/BookDaoImpl.java | 118 ++++++++++++++++++ .../academy/lib/DataProcessingException.java | 11 ++ src/main/java/mate/academy/models/Book.java | 59 +++++++++ .../mate/academy/util/ConnectionUtil.java | 30 +++++ src/main/resources/init_db.sql | 9 ++ 8 files changed, 273 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/lib/DataProcessingException.java create mode 100644 src/main/java/mate/academy/models/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..ffd09e8f 100644 --- a/pom.xml +++ b/pom.xml @@ -8,6 +8,13 @@ jv-jdbc-intro 1.0-SNAPSHOT + + + mysql + mysql-connector-java + 8.0.32 + + 17 17 diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 0058fbf9..d735c39f 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,7 +1,28 @@ package mate.academy; +import java.math.BigDecimal; +import mate.academy.dao.BookDao; +import mate.academy.lib.Injector; +import mate.academy.models.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 book = new Book(); + book.setTitle("Kobzar"); + book.setPrice(BigDecimal.valueOf(500)); + + Book book1 = bookDao.create(book); + book1.setPrice(BigDecimal.valueOf(700)); + System.out.println(book1); + bookDao.update(book1); + System.out.println(bookDao.findById(book1.getId())); + + bookDao.fingAll().forEach(System.out::println); + bookDao.fingAll().forEach(b -> bookDao.deleteById(b.getId())); } } 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..1171bdee --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -0,0 +1,18 @@ +package mate.academy.dao; + +import mate.academy.models.Book; + +import java.util.List; +import java.util.Optional; + +public interface BookDao { + Book create(Book book); + + Optional findById(Long id); + + List fingAll(); + + 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..56becfea --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -0,0 +1,118 @@ +package mate.academy.dao; + +import java.math.BigDecimal; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import mate.academy.lib.Dao; +import mate.academy.lib.DataProcessingException; +import mate.academy.models.Book; +import mate.academy.util.ConnectionUtil; + +@Dao +public class BookDaoImpl implements BookDao{ + @Override + public Book create(Book book) { + String query = "INSERT INTO books(tittle, price) VALUES(?, ?)"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement createBookStatement = connection + .prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { + createBookStatement.setString(1, book.getTitle()); + createBookStatement.setBigDecimal(2, book.getPrice()); + createBookStatement.executeUpdate(); + ResultSet generatedKeys = createBookStatement.getGeneratedKeys(); + if (generatedKeys.next()) { + Long id = generatedKeys.getObject(1, Long.class); + book.setId(id); + } + } catch (SQLException e) { + throw new DataProcessingException("Can`t insert book " + + book + " to DB", e); + } + return book; + } + + @Override + public Optional findById(Long id) { + String query = "SELECT * FROM books WHERE is_deleted = FALSE"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement getAllBookStatement = connection + .prepareStatement(query)) { + ResultSet resultSet = getAllBookStatement.executeQuery(); + while (resultSet.next()) { + Long identifier = resultSet.getObject("id", Long.class); + if (Objects.equals(id, identifier)) { + Book book = getBook(resultSet); + return Optional.of(book); + } + } + } catch (SQLException e) { + throw new DataProcessingException("Can`t get book with id = " + + id + " from DB", e); + } + return Optional.empty(); + } + + @Override + public List fingAll() { + String query = "SELECT * FROM books WHERE is_deleted = FALSE"; + List allBook = new ArrayList<>(); + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement getAllBookStatement = connection + .prepareStatement(query)) { + ResultSet resultSet = getAllBookStatement.executeQuery(); + while (resultSet.next()) { + Book book = getBook(resultSet); + allBook.add(book); + } + + } catch (SQLException e) { + throw new DataProcessingException("Can`t get all manufacturers from DB", e); + } + return allBook; } + + @Override + public Book update(Book book) { + String query = "UPDATE books SET tittle = ?, price = ? " + + "WHERE id = ? AND is_deleted = FALSE"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement createBookStatement = connection + .prepareStatement(query)) { + createBookStatement.setString(1, book.getTitle()); + createBookStatement.setBigDecimal(2, book.getPrice()); + createBookStatement.setLong(3, book.getId()); + createBookStatement.executeUpdate(); + } catch (SQLException e) { + throw new DataProcessingException("Can`t update book " + + book + " to DB", e); + } + return book; } + + @Override + public boolean deleteById(Long id) { + String query = "UPDATE books SET is_deleted = TRUE WHERE id = ?"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement deleteBookStatement = connection + .prepareStatement(query)) { + deleteBookStatement.setLong(1, id); + int updateRows = deleteBookStatement.executeUpdate(); + return updateRows > 0; + } catch (SQLException e) { + throw new DataProcessingException("Can`t delete book with id " + + id + " from DB", e); + } + } + + private Book getBook(ResultSet resultSet) throws SQLException { + String tittle = resultSet.getString("tittle"); + long price = resultSet.getLong("price"); + Long id = resultSet.getObject("id", Long.class); + Book book = new Book(); + book.setId(id); + book.setTitle(tittle); + book.setPrice(BigDecimal.valueOf(price)); + return book; + } +} diff --git a/src/main/java/mate/academy/lib/DataProcessingException.java b/src/main/java/mate/academy/lib/DataProcessingException.java new file mode 100644 index 00000000..ad7660bf --- /dev/null +++ b/src/main/java/mate/academy/lib/DataProcessingException.java @@ -0,0 +1,11 @@ +package mate.academy.lib; + +public class DataProcessingException extends RuntimeException { + private String message; + private Throwable ex; + + public DataProcessingException(String message, Throwable ex) { + this.message = message; + this.ex = ex; + } +} 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..d08dd850 --- /dev/null +++ b/src/main/java/mate/academy/models/Book.java @@ -0,0 +1,59 @@ +package mate.academy.models; + +import java.math.BigDecimal; +import java.util.Objects; + +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 boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return Objects.equals(id, book.id) && Objects.equals(title, book.title) && Objects.equals(price, book.price); + } + + @Override + public int hashCode() { + return Objects.hash(id, title, price); + } + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", price=" + price + + '}'; + } +} 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..cc6f4ca4 --- /dev/null +++ b/src/main/java/mate/academy/util/ConnectionUtil.java @@ -0,0 +1,30 @@ +package mate.academy.util; + +import mate.academy.lib.DataProcessingException; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +public class ConnectionUtil { + static { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + throw new DataProcessingException("Cant load JDBC driver for MySQL", e); + } + } + + public static Connection getConnection() { + try { + Properties dbProperties = new Properties(); + dbProperties.put("user", "root"); + dbProperties.put("password", "admin"); + return DriverManager.getConnection("jdbc:mysql://localhost:3306/library_db", + dbProperties); + } catch (SQLException x) { + throw new DataProcessingException("Cant create connection to DB", x); + } + } +} diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql new file mode 100644 index 00000000..f891e61f --- /dev/null +++ b/src/main/resources/init_db.sql @@ -0,0 +1,9 @@ +CREATE DATABASE `library_db` /*!40100 DEFAULT CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTION='N' */; + +CREATE TABLE `books` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `tittle` varchar(255) DEFAULT NULL, + `price` bigint DEFAULT NULL, + `is_deleted` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;