From 9a7d83195a0ce48d251cba0760eee83d224843f1 Mon Sep 17 00:00:00 2001 From: Kate Chernyavska Date: Thu, 10 Aug 2023 06:08:30 +0300 Subject: [PATCH 1/7] added model Book --- src/main/java/mate/academy/model/Book.java | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/main/java/mate/academy/model/Book.java 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..d97792c1 --- /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 + + '}'; + } +} From 1b7c7e3f363f8eb169282904c49f5736d5d7a41f Mon Sep 17 00:00:00 2001 From: Kate Chernyavska Date: Thu, 10 Aug 2023 06:11:22 +0300 Subject: [PATCH 2/7] added dao classes to implement crud operation with db --- src/main/java/mate/academy/dao/BookDao.java | 14 +++ .../java/mate/academy/dao/BookDaoImpl.java | 116 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 src/main/java/mate/academy/dao/BookDao.java create mode 100644 src/main/java/mate/academy/dao/BookDaoImpl.java 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/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java new file mode 100644 index 00000000..c07ffb89 --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -0,0 +1,116 @@ +package mate.academy.dao; + +import mate.academy.exception.DataProcessingException; +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 sql = "INSERT INTO books (title, price) VALUES (?, ?)"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql, 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 leas one 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 DataProcessingException("Can't add new book" + book, e); + } + return book; + } + + @Override + public Optional findById(Long id) { + String sql = "SELECT * FROM books WHERE id = ? AND is_deleted = FALSE"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setLong(1, id); + ResultSet resultSet = statement.executeQuery(); + if (resultSet.next()) { + Book book = parse(resultSet); + return Optional.of(book); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't find book by id", e); + } + return Optional.empty(); + } + + @Override + public List findAll() { + List list = new ArrayList<>(); + String sql = "SELECT * FROM books WHERE is_deleted = FALSE"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql)) { + ResultSet resultSet = statement.executeQuery(sql); + while (resultSet.next()) { + Book book = parse(resultSet); + list.add(book); + } + return list; + } catch (SQLException e) { + throw new DataProcessingException("Can't find all books in db", e); + } + } + + @Override + public Book update(Book book) { + String sql = "UPDATE books SET title = ?, price = ? WHERE id = ? AND is_deleted = FALSE"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + statement.setString(1, book.getTitle()); + statement.setBigDecimal(2, book.getPrice()); + statement.setLong(3, book.getId()); + statement.executeUpdate(); + + return book; + } catch (SQLException e) { + throw new DataProcessingException("Can't updated book" + book, e); + } + } + + @Override + public boolean deleteById(Long id) { + String sql = "UPDATE books SET is_deleted = TRUE WHERE id = ?"; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setLong(1, id); + int updatedRows = statement.executeUpdate(); + return updatedRows > 0; + } catch (SQLException e) { + throw new DataProcessingException("Can't delete book", e); + } + } + + private Book parse(ResultSet resultSet) { + try { + Long id = resultSet.getObject("id", Long.class); + String title = resultSet.getString("title"); + BigDecimal price = resultSet.getBigDecimal("price"); + Book book = new Book(); + book.setTitle(title); + book.setPrice(price); + return book; + } catch (SQLException e) { + throw new DataProcessingException("Can't get data from resultSet", e); + } + } +} \ No newline at end of file From fb75bda04250b65726cc060c05ce101272e91999 Mon Sep 17 00:00:00 2001 From: Kate Chernyavska Date: Thu, 10 Aug 2023 06:12:02 +0300 Subject: [PATCH 3/7] added information to connect to db --- .../mate/academy/util/ConnectionUtil.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/mate/academy/util/ConnectionUtil.java 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..9f3f12e8 --- /dev/null +++ b/src/main/java/mate/academy/util/ConnectionUtil.java @@ -0,0 +1,28 @@ +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/library_db"; + private static final Properties DB_PROPERTIES; + + static { + DB_PROPERTIES = new Properties(); + DB_PROPERTIES.put("user", "root"); + DB_PROPERTIES.put("password", "root"); + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Can't load JDBC driver for MySql", e); + } + } + + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(DB_URL, DB_PROPERTIES); + } + +} From 4b02f2488e4acea717dc7a71949d101d620801a1 Mon Sep 17 00:00:00 2001 From: Kate Chernyavska Date: Thu, 10 Aug 2023 06:12:18 +0300 Subject: [PATCH 4/7] added information to connect to db --- src/main/resources/init_db.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/resources/init_db.sql diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql new file mode 100644 index 00000000..a90e5e55 --- /dev/null +++ b/src/main/resources/init_db.sql @@ -0,0 +1,8 @@ +CREATE SCHEMA `library_db` DEFAULT CHARACTER SET utf8 ; + +CREATE TABLE `books` ( + `id` BIGINT(10) NOT NULL AUTO_INCREMENT, + `title` VARCHAR(45) NOT NULL, + `price` DECIMAL NOT NULL, + `is_deleted` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`)); \ No newline at end of file From 699030bb14575ad8e89c32802cdd016b654ba508 Mon Sep 17 00:00:00 2001 From: Kate Chernyavska Date: Thu, 10 Aug 2023 06:12:41 +0300 Subject: [PATCH 5/7] added own exception --- .../mate/academy/exception/DataProcessingException.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/mate/academy/exception/DataProcessingException.java 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..63b937dc --- /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 cause) { + super(message, cause); + } +} From ba70298a2ecd9b18f6ca1705ca9bd9da87caedfb Mon Sep 17 00:00:00 2001 From: Kate Chernyavska Date: Thu, 10 Aug 2023 06:13:48 +0300 Subject: [PATCH 6/7] checked all methods --- src/main/java/mate/academy/Main.java | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 0058fbf9..3ec550cd 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,7 +1,27 @@ 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; + 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("On the Road"); + book.setPrice(new BigDecimal("19")); + bookDao.create(book); + Optional bookGet = bookDao.findById(2L); + List books = bookDao.findAll(); + Book newBook = new Book(); + newBook.setTitle("The partner"); + newBook.setPrice(new BigDecimal("39")); + bookDao.update(book); + System.out.println(book); + bookDao.deleteById(2L); } } From 98054f75c8f5d3651ba5618cdc0d11cf34e3eb33 Mon Sep 17 00:00:00 2001 From: Kate Chernyavska Date: Thu, 10 Aug 2023 06:14:15 +0300 Subject: [PATCH 7/7] added dependency --- pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pom.xml b/pom.xml index 526fbcf3..a79aced6 100644 --- a/pom.xml +++ b/pom.xml @@ -14,4 +14,14 @@ UTF-8 + + + + + com.mysql + mysql-connector-j + 8.0.33 + + +