From a2a0a8d71eb7ef18273491320500c89107a70632 Mon Sep 17 00:00:00 2001 From: kankeii Date: Thu, 24 Oct 2024 11:44:14 +0300 Subject: [PATCH] completed homework jdbc-intro --- pom.xml | 10 ++ src/main/java/mate/academy/Main.java | 23 +++- src/main/java/mate/academy/dao/BookDao.java | 18 +++ .../java/mate/academy/dao/BookDaoImpl.java | 112 ++++++++++++++++++ .../exception/DataProcessingException.java | 11 ++ src/main/java/mate/academy/model/Book.java | 53 +++++++++ .../mate/academy/util/ConnectionUtil.java | 27 +++++ src/main/resources/init_db.sql | 5 + 8 files changed, 258 insertions(+), 1 deletion(-) 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/util/ConnectionUtil.java create mode 100644 src/main/resources/init_db.sql diff --git a/pom.xml b/pom.xml index 683e84ec..1cc5b503 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,16 @@ + + + + com.mysql + mysql-connector-j + 9.1.0 + + + + diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index 0058fbf9..045de590 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 java.util.Arrays; +import java.util.List; +import mate.academy.dao.BookDao; +import mate.academy.lib.Injector; +import mate.academy.model.Book; + public class Main { - public static void main(String[] args) { + private static final Injector injector = Injector.getInstance("mate.academy.dao"); + public static void main(String[] args) { + BookDao bookDao = (BookDao) injector.getInstance(BookDao.class); + List books = Arrays.asList( + new Book(1L, "Book1", BigDecimal.valueOf(5.99)), + new Book(2L, "Book2", BigDecimal.valueOf(4.35)), + new Book(3L, "Book3", BigDecimal.valueOf(10.00)) + ); + books.forEach(bookDao::create); + Book secondBook = books.get(1); + secondBook.setTitle("Book4"); + bookDao.update(secondBook); + System.out.println(bookDao.findById(2L)); + System.out.println(bookDao.findAll()); + bookDao.deleteById(3L); } } 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..76326cd5 --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDao.java @@ -0,0 +1,18 @@ +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..f4c514ca --- /dev/null +++ b/src/main/java/mate/academy/dao/BookDaoImpl.java @@ -0,0 +1,112 @@ +package mate.academy.dao; + +import java.math.BigDecimal; +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.exception.DataProcessingException; +import mate.academy.lib.Dao; +import mate.academy.model.Book; +import mate.academy.util.ConnectionUtil; + +@Dao +public class BookDaoImpl implements BookDao { + private static final String CREATE = "INSERT INTO books (title, price) VALUES (?, ?)"; + private static final String FIND_BY_ID = "SELECT * FROM books WHERE id = ?"; + private static final String FIND_ALL = "SELECT * FROM books"; + private static final String UPDATE = "UPDATE books SET title = ?, price = ? WHERE id = ?"; + private static final String DELETE_BY_ID = "DELETE FROM books WHERE id = ?"; + + @Override + public Book create(Book book) { + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement + = connection.prepareStatement(CREATE, Statement.RETURN_GENERATED_KEYS)) { + statement.setString(1, book.getTitle()); + statement.setBigDecimal(2, book.getPrice()); + statement.executeUpdate(); + + ResultSet generatedKeys = statement.getGeneratedKeys(); + if (generatedKeys.next()) { + book.setId(generatedKeys.getLong(1)); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't create book: " + book, e); + } + return book; + } + + @Override + public Optional findById(long id) { + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(FIND_BY_ID)) { + statement.setLong(1, id); + ResultSet resultSet = statement.executeQuery(); + if (resultSet.next()) { + return Optional.of(takeBook(resultSet)); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't find book by id: " + id, e); + } + return Optional.empty(); + } + + @Override + public List findAll() { + List books = new ArrayList<>(); + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(FIND_ALL)) { + ResultSet resultSet = statement.executeQuery(); + while (resultSet.next()) { + books.add(takeBook(resultSet)); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't find all books", e); + } + return books; + } + + @Override + public Book update(Book book) { + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(UPDATE)) { + statement.setString(1, book.getTitle()); + statement.setBigDecimal(2, book.getPrice()); + statement.setLong(3, book.getId()); + if (statement.executeUpdate() < 1) { + throw new DataProcessingException("Book with id " + + book.getId() + " does not found for update"); + } + } catch (SQLException e) { + throw new DataProcessingException("Can't update book: " + book, e); + } + return book; + } + + @Override + public boolean deleteById(long id) { + try (Connection connection = ConnectionUtil.getConnection(); + PreparedStatement statement = connection.prepareStatement(DELETE_BY_ID)) { + statement.setLong(1, id); + return statement.executeUpdate() > 0; + } catch (SQLException e) { + throw new DataProcessingException("Can't delete book by id: " + id, e); + } + } + + private Book takeBook(ResultSet resultSet) throws SQLException { + Long id = resultSet.getObject("id", Long.class); + String title = resultSet.getString("title"); + BigDecimal price = resultSet.getBigDecimal("price"); + Book book = new Book(); + book.setId(id); + book.setTitle(title); + book.setPrice(price); + return book; + } +} 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..02f156f9 --- /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, Throwable ex) { + super(message, ex); + } + + public DataProcessingException(String message) { + super(message); + } +} 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..fc3566e0 --- /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() { + + } + + public Book(Long id, String title, BigDecimal price) { + this.id = id; + 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 + + '}'; + } +} 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..e9aab3a8 --- /dev/null +++ b/src/main/java/mate/academy/util/ConnectionUtil.java @@ -0,0 +1,27 @@ +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/jdbc_intro"; + 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("Cannot load the JDBC driver", e); + } + } + + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(DB_URL, DB_PROPERTIES); + } +} diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql new file mode 100644 index 00000000..576c355f --- /dev/null +++ b/src/main/resources/init_db.sql @@ -0,0 +1,5 @@ +CREATE TABLE books ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + price DECIMAL(10, 2) NOT NULL +); \ No newline at end of file