From b24dc29021dd8e13ce570979f4f07d3dc3dbc160 Mon Sep 17 00:00:00 2001 From: codered23 Date: Wed, 2 Aug 2023 13:53:34 +0300 Subject: [PATCH 1/2] commit --- pom.xml | 14 +++ src/main/java/mate/academy/Main.java | 23 +++- src/main/java/mate/academy/dao/BookDao.java | 14 +++ .../mate/academy/dao/impl/BookDaoImpl.java | 102 ++++++++++++++++++ src/main/java/mate/academy/model/Book.java | 53 +++++++++ .../mate/academy/util/ConnectionUtil.java | 32 ++++++ src/main/resources/init_db.sql | 6 ++ 7 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 src/main/java/mate/academy/dao/BookDao.java create mode 100644 src/main/java/mate/academy/dao/impl/BookDaoImpl.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 969b5f3e..2a1f8977 100644 --- a/pom.xml +++ b/pom.xml @@ -13,5 +13,19 @@ 17 UTF-8 + + + mysql + mysql-connector-java + 8.0.28 + + + org.projectlombok + lombok-maven-plugin + 1.18.20.0 + provided + + + \ 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 0058fbf9..e5e6f84d 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 mate.academy.dao.BookDao; +import mate.academy.lib.Injector; +import mate.academy.model.Book; + +import java.math.BigDecimal; + 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("Harry Potter", BigDecimal.valueOf(400)); + Book book2 = new Book("Harry Potter2", BigDecimal.valueOf(450)); + Book book3 = new Book("Harry Potter3", BigDecimal.valueOf(490)); + System.out.println("added " + bookDao.create(book)); + System.out.println("added " + bookDao.create(book2)); + System.out.println("added " + bookDao.create(book3)); + System.out.println("all books: " + bookDao.findAll()); + book3.setTitle("Will"); + book3.setPrice(BigDecimal.valueOf(300)); + System.out.println("updated " + bookDao.update(book3)); + System.out.println("all books with update " + bookDao.findAll()); + System.out.println("find by id " + bookDao.findById(3L)); + bookDao.deleteById(3l); + System.out.println("all books after delete " + bookDao.findAll()); } } 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..70f5463c --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -0,0 +1,14 @@ +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/impl/BookDaoImpl.java b/src/main/java/mate/academy/dao/impl/BookDaoImpl.java new file mode 100644 index 00000000..78681f30 --- /dev/null +++ b/src/main/java/mate/academy/dao/impl/BookDaoImpl.java @@ -0,0 +1,102 @@ +package mate.academy.dao.impl; + +import mate.academy.dao.BookDao; +import mate.academy.lib.Dao; +import mate.academy.model.Book; +import mate.academy.util.ConnectionUtil; + +import java.math.BigDecimal; +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 insert = "INSERT INTO books (title, price) VALUES (?, ?)"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS)) { + statement.setString(1, book.getTitle()); + statement.setBigDecimal(2, book.getPrice()); + statement.executeUpdate(); + 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 add book to db ", e); + } + return book; + } + + @Override + public Optional findById(Long id) { + String query = "SELECT id, title, price " + "FROM books WHERE id = ?;"; + Book book = null; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + statement.setLong(1, id); + ResultSet resultSet = statement.executeQuery(); + if (resultSet.next()) { + book = getBookFromResultSet(resultSet); + } + } catch(SQLException e){ + throw new RuntimeException("Couldn't find book by id " + id, e); + } + return Optional.ofNullable(book); + } + + @Override + public List findAll () { + String query = "SELECT id, title, price FROM books"; + List bookList = new ArrayList<>(); + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + ResultSet resultSet = statement.executeQuery(); + while (resultSet.next()) { + bookList.add(getBookFromResultSet(resultSet)); + } + } catch (SQLException e) { + throw new RuntimeException("Couldn't get all books", e); + } + return bookList; + } + + @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()); + statement.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException("Couldn't update book by 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, id); + int deletedRows = statement.executeUpdate(); + return deletedRows > 0; + } catch (SQLException e) { + throw new RuntimeException("Couldn't delete book by id " + id, e); + } + } + + private Book getBookFromResultSet(ResultSet resultSet) throws SQLException { + long id = resultSet.getObject(1, Long.class); + String title = resultSet.getString("title"); + BigDecimal price = resultSet.getBigDecimal("price"); + Book book = new Book(id, title, price); + return book; + } +} 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..2ae6d721 --- /dev/null +++ b/src/main/java/mate/academy/model/Book.java @@ -0,0 +1,53 @@ +package mate.academy.model; + +import java.math.BigDecimal; + +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; + } + + 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 + + '}'; + } +} \ No newline at end of file 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..30c0bf54 --- /dev/null +++ b/src/main/java/mate/academy/util/ConnectionUtil.java @@ -0,0 +1,32 @@ +package mate.academy.util; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +public class ConnectionUtil { + public static final String URL = "jdbc:mysql://localhost:3306/library"; + public static final String USERNAME = "root"; + public static final String PASSWORD = "olegAndriy"; + private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; + + static { + try { + Class.forName(JDBC_DRIVER); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Can't load JDBC driver for MySQL", e); + } + } + + public static Connection getConnection() { + Properties dbProperties = new Properties(); + dbProperties.setProperty("user", USERNAME); + dbProperties.setProperty("password", PASSWORD); + try { + return DriverManager.getConnection(URL, dbProperties); + } catch (SQLException e) { + throw new RuntimeException("Can't create connection to DataBase", e); + } + } + } diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql new file mode 100644 index 00000000..2560cf34 --- /dev/null +++ b/src/main/resources/init_db.sql @@ -0,0 +1,6 @@ +CREATE TABLE books ( + id bigint NOT NULL AUTO_INCREMENT, + title varchar(255) NOT NULL, + price decimal NOT NULL, + PRIMARY KEY (id) +); \ No newline at end of file From d9c8e62ca4bd443dab3fefc7320ebb2c4d2e0e08 Mon Sep 17 00:00:00 2001 From: codered23 Date: Wed, 2 Aug 2023 18:25:48 +0300 Subject: [PATCH 2/2] commit --- .../java/mate/academy/dao/impl/BookDaoImpl.java | 17 +++++++++-------- .../exception/DataProcessingException.java | 11 +++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 src/main/java/mate/academy/exception/DataProcessingException.java diff --git a/src/main/java/mate/academy/dao/impl/BookDaoImpl.java b/src/main/java/mate/academy/dao/impl/BookDaoImpl.java index 78681f30..a77f0e38 100644 --- a/src/main/java/mate/academy/dao/impl/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/impl/BookDaoImpl.java @@ -1,6 +1,7 @@ package mate.academy.dao.impl; import mate.academy.dao.BookDao; +import mate.academy.exception.DataProcessingException; import mate.academy.lib.Dao; import mate.academy.model.Book; import mate.academy.util.ConnectionUtil; @@ -26,14 +27,14 @@ public Book create(Book book) { book.setId(id); } } catch (SQLException e) { - throw new RuntimeException("Can't add book to db ", e); + throw new DataProcessingException("Can't add book to db ", e); } return book; } @Override public Optional findById(Long id) { - String query = "SELECT id, title, price " + "FROM books WHERE id = ?;"; + String query = "SELECT id, title, price FROM books WHERE id = ?;"; Book book = null; try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement statement = connection.prepareStatement(query)) { @@ -43,7 +44,7 @@ public Optional findById(Long id) { book = getBookFromResultSet(resultSet); } } catch(SQLException e){ - throw new RuntimeException("Couldn't find book by id " + id, e); + throw new DataProcessingException("Couldn't find book by id " + id, e); } return Optional.ofNullable(book); } @@ -59,12 +60,12 @@ public List findAll () { bookList.add(getBookFromResultSet(resultSet)); } } catch (SQLException e) { - throw new RuntimeException("Couldn't get all books", e); + throw new DataProcessingException("Couldn't get all books", e); } return bookList; } - @Override + @Override public Book update (Book book) { String query = "UPDATE books SET title = ?, price = ? WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); @@ -74,12 +75,12 @@ public Book update (Book book) { statement.setLong(3, book.getId()); statement.executeUpdate(); } catch (SQLException e) { - throw new RuntimeException("Couldn't update book by id " + book.getId(), e); + throw new DataProcessingException("Couldn't update book by id " + book.getId(), e); } return book; } - @Override + @Override public boolean deleteById (Long id) { String query = "DELETE FROM books WHERE id = ?"; try (Connection connection = ConnectionUtil.getConnection(); @@ -88,7 +89,7 @@ public boolean deleteById (Long id) { int deletedRows = statement.executeUpdate(); return deletedRows > 0; } catch (SQLException e) { - throw new RuntimeException("Couldn't delete book by id " + id, e); + throw new DataProcessingException("Couldn't delete book by id " + id, e); } } 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..71a3d05e --- /dev/null +++ b/src/main/java/mate/academy/exception/DataProcessingException.java @@ -0,0 +1,11 @@ +package mate.academy.exception; + +public class DataProcessingException extends RuntimeException { + public DataProcessingException(String message) { + super(message); + } + + public DataProcessingException(String message, Throwable cause) { + super(message, cause); + } +}