From 699105f98cdb4e2b7f4ae59c19154694044613d2 Mon Sep 17 00:00:00 2001 From: Roman K Date: Mon, 24 Jun 2024 14:31:00 +0300 Subject: [PATCH] implement task --- pom.xml | 8 ++ .../java/mate/academy/ConnectionUtil.java | 39 ++++++ src/main/java/mate/academy/Main.java | 25 +++- src/main/java/mate/academy/dao/BookDao.java | 17 +++ .../java/mate/academy/dao/BookDaoImpl.java | 126 ++++++++++++++++++ .../exception/DataProcessingException.java | 7 + src/main/java/mate/academy/model/Book.java | 42 ++++++ .../mate/academy/service/BookService.java | 17 +++ .../academy/service/impl/BookServiceImpl.java | 36 +++++ src/main/resources/init_db.sql | 6 + src/main/resources/pswrd.txt | 1 + 11 files changed, 323 insertions(+), 1 deletion(-) create mode 100644 src/main/java/mate/academy/ConnectionUtil.java 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/exception/DataProcessingException.java create mode 100644 src/main/java/mate/academy/model/Book.java create mode 100644 src/main/java/mate/academy/service/BookService.java create mode 100644 src/main/java/mate/academy/service/impl/BookServiceImpl.java create mode 100644 src/main/resources/init_db.sql create mode 100644 src/main/resources/pswrd.txt 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/ConnectionUtil.java b/src/main/java/mate/academy/ConnectionUtil.java new file mode 100644 index 00000000..31e5215f --- /dev/null +++ b/src/main/java/mate/academy/ConnectionUtil.java @@ -0,0 +1,39 @@ +package mate.academy; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +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/jv-jdbc-intro"; + private static final Properties DB_PROPERTIES; + + static { + DB_PROPERTIES = new Properties(); + DB_PROPERTIES.put("user", "root"); + DB_PROPERTIES.put("password", getPassword()); + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Can't load the JDBC driver.", e); + } + } + + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(DB_URL, DB_PROPERTIES); + } + + private static String getPassword() { + String path = "src/main/resources/pswrd.txt"; + try { + return Files.readString(Path.of(path)); + + } catch (IOException e) { + throw new RuntimeException("Can't read a file with path: " + path, e); + } + } +} diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 0058fbf9..4b70699a 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -1,7 +1,30 @@ package mate.academy; +import java.math.BigInteger; +import mate.academy.dao.BookDao; +import mate.academy.lib.Injector; +import mate.academy.model.Book; + public class Main { public static void main(String[] args) { - + Injector injector = Injector.getInstance("mate.academy"); + BookDao bookDao = (BookDao) injector.getInstance(BookDao.class); + // create + Book book = new Book(); + book.setTitle("Java Programming"); + book.setPrice(100.00); + System.out.println(bookDao.create(book)); + // update + Book bookUpdate = new Book(); + bookUpdate.setTitle("Updated title"); + bookUpdate.setPrice(200.00); + bookUpdate.setId(new BigInteger("1")); + System.out.println(bookDao.update(bookUpdate)); + // findById + System.out.println(bookDao.findById(2L)); + // findAll + System.out.println(bookDao.findAll()); + // deleteById + System.out.println(bookDao.deleteById(1L)); } } 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..d60c063d --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -0,0 +1,17 @@ +package mate.academy.dao; + +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/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java new file mode 100644 index 00000000..2f884cac --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -0,0 +1,126 @@ +package mate.academy.dao; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Connection; +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; +import mate.academy.ConnectionUtil; +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) { + String query = "INSERT INTO books (title, price) VALUES (?, ?)"; + try ( + Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { + statement.setString(1, book.getTitle()); + statement.setDouble(2, book.getPrice()); + int affectedRows = statement.executeUpdate(); + if (affectedRows < 1) { + throw new RuntimeException( + "Expected to insert at least one row, but inserted 0 rows."); + } + ResultSet generatedKeys = statement.getGeneratedKeys(); + if (generatedKeys.next()) { + BigInteger id = generatedKeys.getObject(1, BigInteger.class); + book.setId(id); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't create a book " + book, e); + } + return book; + } + + @Override + public Optional findById(Long id) { + String query = "SELECT * FROM books WHERE id = ?"; + try ( + Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + statement.setLong(1, id); + statement.executeQuery(); + ResultSet resultSet = statement.getResultSet(); + if (resultSet.next()) { + Book book = new Book(); + book.setId(resultSet.getObject("id", BigInteger.class)); + book.setTitle(resultSet.getObject("title", String.class)); + book.setPrice(resultSet.getObject("price", Double.class)); + return Optional.of(book); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return Optional.empty(); + } + + @Override + public List findAll() { + List books = new ArrayList<>(); + String query = "SELECT * FROM books"; + try ( + Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + ResultSet resultSet = statement.executeQuery(); + if (resultSet.next()) { + do { + Book book = new Book(); + book.setId(resultSet.getObject("id", BigInteger.class)); + book.setTitle(resultSet.getObject("title", String.class)); + book.setPrice(resultSet.getObject("price", Double.class)); + books.add(book); + } while (resultSet.next()); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return books; + } + + @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.setDouble(2, book.getPrice()); + statement.setBigDecimal(3, new BigDecimal(book.getId())); + int affectedRows = statement.executeUpdate(); + if (affectedRows < 1) { + throw new RuntimeException( + "Expected to update at least one row, but updated 0 rows."); + } + return book; + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @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 affectedRows = statement.executeUpdate(); + if (affectedRows < 1) { + throw new RuntimeException( + "Expected to delete at least one row, but deleted 0 rows."); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't delete book where id = " + id, e); + } + return true; + } +} 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..d3ad20c9 --- /dev/null +++ b/src/main/java/mate/academy/model/Book.java @@ -0,0 +1,42 @@ +package mate.academy.model; + +import java.math.BigInteger; + +public class Book { + private BigInteger id; + private String title; + private double price; + + public BigInteger getId() { + return id; + } + + public void setId(BigInteger id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public double getPrice() { + return price; + } + + public void setPrice(double 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..8900cb2d --- /dev/null +++ b/src/main/java/mate/academy/service/BookService.java @@ -0,0 +1,17 @@ +package mate.academy.service; + +import java.util.List; +import java.util.Optional; +import mate.academy.model.Book; + +public interface BookService { + 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/service/impl/BookServiceImpl.java b/src/main/java/mate/academy/service/impl/BookServiceImpl.java new file mode 100644 index 00000000..a6664ae1 --- /dev/null +++ b/src/main/java/mate/academy/service/impl/BookServiceImpl.java @@ -0,0 +1,36 @@ +package mate.academy.service.impl; + +import java.util.List; +import java.util.Optional; +import mate.academy.dao.BookDao; +import mate.academy.model.Book; +import mate.academy.service.BookService; + +public class BookServiceImpl implements BookService { + private BookDao bookDao; + + @Override + public Book create(Book book) { + return bookDao.create(book); + } + + @Override + public Optional findById(Long id) { + return bookDao.findById(id); + } + + @Override + public List findAll() { + return bookDao.findAll(); + } + + @Override + public Book update(Book book) { + return bookDao.update(book); + } + + @Override + public boolean deleteById(Long id) { + return bookDao.deleteById(id); + } +} diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql new file mode 100644 index 00000000..0087ea2b --- /dev/null +++ b/src/main/resources/init_db.sql @@ -0,0 +1,6 @@ +CREATE TABLE books ( + id BIGINIT NOT NULL AUTO_INCREMENT, + title VARCHAR(100), + price DECIMAL(10, 2), + PRIMARY KEY (id) +); diff --git a/src/main/resources/pswrd.txt b/src/main/resources/pswrd.txt new file mode 100644 index 00000000..4edabb31 --- /dev/null +++ b/src/main/resources/pswrd.txt @@ -0,0 +1 @@ +My66524407m \ No newline at end of file