diff --git a/pom.xml b/pom.xml
index 683e84ec..76157d43 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,15 @@
+
+
+ mysql
+ mysql-connector-java
+ 8.0.33
+
+
+
+
diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java
index 0058fbf9..3fd46db1 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.BigDecimal;
+import java.util.Optional;
+import mate.academy.dao.BookDao;
+import mate.academy.lib.Injector;
+import mate.academy.model.Book;
+
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("Sherlock Holmes");
+ book.setPrice(BigDecimal.valueOf(110L));
+
+ Book savedBook = bookDao.create(book);
+ Optional bookById = bookDao.findById(savedBook.getId());
+ System.out.println(bookById);
+ System.out.println(bookDao.findAll());
+ book.setPrice(BigDecimal.valueOf(371L));
+ bookDao.update(book);
+ bookDao.findById(savedBook.getId());
+ bookDao.deleteById(savedBook.getId());
+ System.out.println(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..23e8097c
--- /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..6f92c07e
--- /dev/null
+++ b/src/main/java/mate/academy/dao/BookDaoImpl.java
@@ -0,0 +1,129 @@
+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 {
+
+ @Override
+ public Book create(Book book) {
+ String insertRequest = "INSERT INTO books (title, price) VALUES (?, ?)";
+ try (Connection connection = ConnectionUtil.getConnection();
+ PreparedStatement createObjectStatement
+ = connection.prepareStatement(insertRequest,
+ Statement.RETURN_GENERATED_KEYS)) {
+ createObjectStatement.setString(1, book.getTitle());
+ createObjectStatement.setBigDecimal(2, book.getPrice());
+
+ int affectedRows = createObjectStatement.executeUpdate();
+ if (affectedRows < 1) {
+ throw new RuntimeException("Expected to insert at least 1 row, "
+ + "but inserted 0 rows");
+ }
+
+ ResultSet generatedKeys = createObjectStatement.getGeneratedKeys();
+ if (generatedKeys.next()) {
+ book.setId(generatedKeys.getLong(1));
+ }
+
+ } catch (SQLException e) {
+ throw new DataProcessingException("Can`t insert book "
+ + book + " to DB", e);
+ }
+ return book;
+ }
+
+ @Override
+ public Optional findById(Long id) {
+ String getRequest = "SELECT * FROM books WHERE id = ?";
+ try (Connection connection = ConnectionUtil.getConnection();
+ PreparedStatement getBookStatement
+ = connection.prepareStatement(getRequest)) {
+ getBookStatement.setLong(1, id);
+ ResultSet resultSet = getBookStatement.executeQuery();
+
+ if (resultSet.next()) {
+ Book book = createBook(resultSet);
+ return Optional.of(book);
+ }
+ } catch (SQLException e) {
+ throw new DataProcessingException("Can`t get book by id = " + id, e);
+ }
+ return Optional.empty();
+ }
+
+ @Override
+ public List findAll() {
+ List books = new ArrayList<>();
+ String getAllRequest = "SELECT * FROM books";
+ try (Connection connection = ConnectionUtil.getConnection();
+ PreparedStatement getAllBooksStatement
+ = connection.prepareStatement(getAllRequest)) {
+ ResultSet resultSet = getAllBooksStatement.executeQuery();
+
+ while (resultSet.next()) {
+ Book book = createBook(resultSet);
+ books.add(book);
+ }
+
+ } catch (SQLException e) {
+ throw new DataProcessingException("Can`t get all books from DB", e);
+ }
+ return books;
+ }
+
+ @Override
+ public Book update(Book book) {
+ String updateRequest = "UPDATE books SET title = ?, price = ? WHERE id = ?";
+ try (Connection connection = ConnectionUtil.getConnection();
+ PreparedStatement updateBookStatement
+ = connection.prepareStatement(updateRequest)) {
+ updateBookStatement.setString(1, book.getTitle());
+ updateBookStatement.setBigDecimal(2, book.getPrice());
+ updateBookStatement.setString(3, String.valueOf(book.getId()));
+ updateBookStatement.executeUpdate();
+ } catch (SQLException e) {
+ throw new DataProcessingException("Can`t update book "
+ + book + " from DB", e);
+ }
+ return book;
+ }
+
+ @Override
+ public boolean deleteById(Long id) {
+ String deleteRequest = "DELETE FROM books WHERE id = ?";
+ try (Connection connection = ConnectionUtil.getConnection();
+ PreparedStatement deletedStatement
+ = connection.prepareStatement(deleteRequest)) {
+ deletedStatement.setLong(1, id);
+ int rowsAffected = deletedStatement.executeUpdate();
+ return rowsAffected > 0;
+ } catch (SQLException e) {
+ throw new DataProcessingException("Can`t delete book by id "
+ + id + " from DB", e);
+ }
+ }
+
+ private static Book createBook(ResultSet resultSet) throws SQLException {
+ Long id = resultSet.getObject("id", Long.class);
+ String title = resultSet.getString("title");
+ BigDecimal price = resultSet.getObject("price", BigDecimal.class);
+ 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..4750d839
--- /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);
+ }
+}
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..2cf9c7cc
--- /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
+ + '}';
+ }
+}
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..67939b57
--- /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/test";
+
+ private static final Properties DB_PROPERTIES;
+
+ static {
+ DB_PROPERTIES = new Properties();
+ DB_PROPERTIES.put("user", "root");
+ DB_PROPERTIES.put("password", "202-42HP");
+
+ try {
+ Class.forName("com.mysql.cj.jdbc.Driver");
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException("Can not load JDBC driver for MySQL", e);
+ }
+ }
+
+ public static Connection getConnection() throws SQLException {
+ return DriverManager.getConnection(DB_URL, DB_PROPERTIES);
+ }
+}
diff --git a/src/main/java/resources/init_db.sql b/src/main/java/resources/init_db.sql
new file mode 100644
index 00000000..180ea140
--- /dev/null
+++ b/src/main/java/resources/init_db.sql
@@ -0,0 +1,7 @@
+CREATE DATABASE test;
+CREATE TABLE books (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ title VARCHAR(255),
+ price DECIMAL(10,2),
+ PRIMARY KEY (id)
+);
\ No newline at end of file