From d960e6ba684221a0b0cf176b536c92e17fdaa4aa Mon Sep 17 00:00:00 2001 From: Banderan Date: Mon, 1 Jul 2024 15:11:30 +0200 Subject: [PATCH] close to end --- pom.xml | 13 +- src/main/java/mate/academy/StartClass.java | 76 ++++++----- .../java/mate/academy/dao/BookDaoImpl.java | 121 ++++++++++++++++-- .../java/mate/academy/dao/ConnectionUtil.java | 22 ++++ src/main/java/mate/academy/model/Book.java | 14 ++ .../mate/academy/service/BookService.java | 1 - .../mate/academy/service/BookServiceImpl.java | 1 + 7 files changed, 202 insertions(+), 46 deletions(-) create mode 100644 src/main/java/mate/academy/dao/ConnectionUtil.java diff --git a/pom.xml b/pom.xml index 960daf7b..58bbec2f 100644 --- a/pom.xml +++ b/pom.xml @@ -58,16 +58,13 @@ + - mysql - mysql-connector-java - 8.0.32 - - - org.mybatis - mybatis - 3.5.9 + com.mysql + mysql-connector-j + 8.4.0 + diff --git a/src/main/java/mate/academy/StartClass.java b/src/main/java/mate/academy/StartClass.java index 51a62b4d..33a4e216 100644 --- a/src/main/java/mate/academy/StartClass.java +++ b/src/main/java/mate/academy/StartClass.java @@ -2,43 +2,61 @@ import mate.academy.dao.BookDao; import mate.academy.dao.BookDaoImpl; +import mate.academy.model.Book; import mate.academy.service.BookService; import mate.academy.service.BookServiceImpl; -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.PreparedStatement; -import java.sql.SQLException; +import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; public class StartClass { + private final static BookDao bookDao = new BookDaoImpl(); + private final static BookService bookService = new BookServiceImpl(bookDao); + private final static int AMOUNT_OF_BOOKS = 5; + private final static Long FIRST_BOOK_ID = 1L; + private final static Long SECOND_BOOK_ID = 2L; + private final static Long THIRD_BOOK_ID = 3L; + private final static Long FOURTH_BOOK_ID = 4L; + private final static Long FIFTH_BOOK_ID = 5L; + + public static void main(String[] args) { - BookDao bookDao = new BookDaoImpl(); - BookService bookService = new BookServiceImpl(bookDao); - /* - bookService.create();//C - bookService.readID();//R - bookService.readAll(); - bookService.update();//U - bookService.delete();//D - */ - //------------------------ - try { - Class.forName("com.mysql.cj.jdbc.Driver"); - Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", - "root", "root"); - String initTable = "src/main/resources/init_db.sql"; - List lines = Files.readAllLines(Path.of(initTable)); - String sqlCodeForTable = lines.stream() - .collect(Collectors.joining(" ")); - PreparedStatement statement = connection.prepareStatement(sqlCodeForTable); - statement.executeUpdate(); - } catch (ClassNotFoundException | SQLException | IOException e) { - throw new RuntimeException(e); + List books = createBook(); + Book newBook = new Book("okok", BigDecimal.valueOf(420)); + + bookService.create(books.get(0));//C + bookService.create(books.get(1)); + bookService.create(books.get(2)); + bookService.create(books.get(3)); + bookService.create(books.get(4)); + + Optional book = bookService.readID(SECOND_BOOK_ID);//R + + boolean delete = bookService.delete(THIRD_BOOK_ID);//D + + Book update = bookService.update(newBook);//U + + List listOfBooks = bookService.readAll(); + + System.out.println("We have " + book + + ", we delete third book? -> " + delete + + " and we updated this book -> " + update); + for (int i = 0; i < listOfBooks.size(); i++) { + System.out.println("Our " + i + "th book: " + listOfBooks.get(i)); + } + } + + private static List createBook() { + String title = "Java"; + BigDecimal price = BigDecimal.valueOf(12.32); + List books = new ArrayList<>(); + for (int i = 0; i < AMOUNT_OF_BOOKS; i++) { + books.add(new Book(title + i, + price.add(BigDecimal.valueOf(i)))); } + return books; } } diff --git a/src/main/java/mate/academy/dao/BookDaoImpl.java b/src/main/java/mate/academy/dao/BookDaoImpl.java index b806c281..9d81449d 100644 --- a/src/main/java/mate/academy/dao/BookDaoImpl.java +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -2,38 +2,143 @@ import mate.academy.lib.Dao; import mate.academy.model.Book; + +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.file.Files; +import java.nio.file.Path; +import java.sql.*; +import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Dao -public class BookDaoImpl implements BookDao{ +public class BookDaoImpl implements BookDao { + private static final int FIRST_QUESTION_MARK_INDEX = 1; + private static final int SECOND_QUESTION_MARK_INDEX = 2; + private static final String ID = "id"; + private static final String TITLE = "title"; + private static final String PRICE = "price"; + private static final String ADD_LINE = " "; + private static final String INIT_DB_SQL = "src/main/resources/init_db.sql"; + private static final String TAKE_BOOK_FROM_DB = "SELECT * FROM book WHERE id = ?"; + private static final String DELETE_BOOK_FROM_DB = "DELETE * FROM book WHERE id = ?"; + private static final String TAKE_BOOKS_FROM_DB = "SELECT * FROM book"; + private static final String SAVE_BOOK_IN_DB = "INSERT INTO book (title, price) VALUES (?, ?)"; + @Override public void createTable() { + try (Connection connection = ConnectionUtil.getConnection()) { + String sqlCodeForTable = Files.readAllLines(Path.of(INIT_DB_SQL)) + .stream() + .collect(Collectors.joining(ADD_LINE)); + PreparedStatement statement = connection.prepareStatement(sqlCodeForTable); + statement.executeUpdate(); + } catch (SQLException | IOException e) { + throw new RuntimeException(e); + } } @Override public Book save(Book book) { - return null; + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(SAVE_BOOK_IN_DB, + Statement.RETURN_GENERATED_KEYS)) { + + statement.setString(FIRST_QUESTION_MARK_INDEX, + book.getTitle()); + statement.setBigDecimal(SECOND_QUESTION_MARK_INDEX, + book.getPrice()); + int end = statement.executeUpdate(); + if (end < 1) { + throw new RuntimeException("Failed to save book"); + } + ResultSet generatedKeys = statement.getGeneratedKeys(); + if (generatedKeys.next()) { + Long id = generatedKeys.getObject(FIRST_QUESTION_MARK_INDEX, Long.class); + book.setId(id); + } + + } catch (SQLException e) { + throw new RuntimeException(e); + } + return book; } @Override public Optional findById(Long id) { - return Optional.empty(); + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(TAKE_BOOK_FROM_DB)) { + + statement.setLong(FIRST_QUESTION_MARK_INDEX, id); + ResultSet resultSet = statement.executeQuery(); + + if (resultSet.next()) { + + Long idFromBook = resultSet.getObject(ID, + Long.class); + String titleFromBook = resultSet.getString(TITLE); + BigDecimal priceFromBook = resultSet.getObject(PRICE, + BigDecimal.class); + + Book book = new Book(idFromBook, titleFromBook, priceFromBook); + return Optional.of(book); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return null; } @Override public List findAll() { - return List.of(); - } + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(TAKE_BOOKS_FROM_DB)) { + ResultSet resultSet = statement.executeQuery(); + List books = new ArrayList<>(); + while (resultSet.next()) { - @Override - public Book update(Book book) { - return null; + Long idFromBook = resultSet.getObject(ID, + Long.class); + String titleFromBook = resultSet.getString(TITLE); + BigDecimal priceFromBook = resultSet.getObject(PRICE, + BigDecimal.class); + + Book book = new Book(idFromBook, titleFromBook, priceFromBook); + books.add(book); + } + return books; + } catch (SQLException e) { + throw new RuntimeException(e); + } } @Override public boolean deleteById(Long id) { + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(DELETE_BOOK_FROM_DB)) { + + statement.setLong(FIRST_QUESTION_MARK_INDEX, id); + ResultSet resultSet = statement.executeQuery(); + + if (resultSet.next()) { + return true; + } + } catch (SQLException e) { + throw new RuntimeException(e); + } return false; } + + @Override + public Book update(Book book) { + long bookID = book.getId(); + boolean deleteById = deleteById(bookID); + if (deleteById) { + save(book); + } + return book; + } } diff --git a/src/main/java/mate/academy/dao/ConnectionUtil.java b/src/main/java/mate/academy/dao/ConnectionUtil.java new file mode 100644 index 00000000..9cc0d63c --- /dev/null +++ b/src/main/java/mate/academy/dao/ConnectionUtil.java @@ -0,0 +1,22 @@ +package mate.academy.dao; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class ConnectionUtil { + private static final String DB_URL = "jdbc:mysql://localhost:3306/test"; + private static final String DB_USER = "root"; + private static final String DB_PASSWORD = "root"; + private static final String CLASS_NAME = "com.mysql.cj.jdbc.Driver"; + static { + try { + Class.forName(CLASS_NAME); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWORD); + } +} diff --git a/src/main/java/mate/academy/model/Book.java b/src/main/java/mate/academy/model/Book.java index 20bbe757..6deb49ca 100644 --- a/src/main/java/mate/academy/model/Book.java +++ b/src/main/java/mate/academy/model/Book.java @@ -7,6 +7,20 @@ public class Book { private String title; private BigDecimal price; + public Book() { + } + + public Book(String title, BigDecimal price) { + this.title = title; + this.price = price; + } + + public Book(Long id, String title, BigDecimal price) { + this.id = id; + this.title = title; + this.price = price; + } + public Long getId() { return id; } diff --git a/src/main/java/mate/academy/service/BookService.java b/src/main/java/mate/academy/service/BookService.java index 2df3179c..86d266f5 100644 --- a/src/main/java/mate/academy/service/BookService.java +++ b/src/main/java/mate/academy/service/BookService.java @@ -1,7 +1,6 @@ package mate.academy.service; import mate.academy.model.Book; - import java.util.List; import java.util.Optional; diff --git a/src/main/java/mate/academy/service/BookServiceImpl.java b/src/main/java/mate/academy/service/BookServiceImpl.java index 770dffbc..c4a64d4d 100644 --- a/src/main/java/mate/academy/service/BookServiceImpl.java +++ b/src/main/java/mate/academy/service/BookServiceImpl.java @@ -14,6 +14,7 @@ public BookServiceImpl(BookDao bookDao) { bookDao.createTable(); } + @Override public Book create(Book book) { return bookDao.save(book);