Skip to content

Commit

Permalink
Entity Book, dao layer and its implementation were created and tested…
Browse files Browse the repository at this point in the history
… in presentation layer
  • Loading branch information
TymurProkhorov committed Aug 8, 2023
1 parent 96f414d commit abf076f
Show file tree
Hide file tree
Showing 8 changed files with 270 additions and 0 deletions.
8 changes: 8 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,12 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>

</project>
18 changes: 18 additions & 0 deletions src/main/java/mate/academy/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,25 @@
package mate.academy;

import mate.academy.dao.BookDao;
import mate.academy.lib.Injector;
import mate.academy.model.Book;
import java.math.BigDecimal;

public class Main {
public static final Injector injector = Injector.getInstance("mate.academy");

public static void main(String[] args) {
BookDao bookDao = (BookDao) injector.getInstance(BookDao.class);
Book mist = new Book();
mist.setTitle("Mist");
mist.setPrice(BigDecimal.valueOf(100));

bookDao.create(mist);
mist.setTitle("Mist by S.King");
mist.setPrice(BigDecimal.valueOf(101));
bookDao.update(mist);
System.out.println(bookDao.findById(mist.getId()));
bookDao.findAll().forEach(System.out::println);
System.out.println("delete successful: " + bookDao.deleteById(mist.getId()));
}
}
17 changes: 17 additions & 0 deletions src/main/java/mate/academy/dao/BookDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
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<Book> findById(Long id);

List<Book> findAll();

Book update(Book book);

boolean deleteById(Long id);
}
132 changes: 132 additions & 0 deletions src/main/java/mate/academy/dao/impl/BookDaoImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package mate.academy.dao.impl;

import mate.academy.dao.BookDao;
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.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;

@Dao
public class BookDaoImpl implements BookDao {
@Override
public Book create(Book book) {
String insertBookQuery = "INSERT INTO books(title, price) values(?, ?);";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement createBookStatement =
connection.prepareStatement(
insertBookQuery, Statement.RETURN_GENERATED_KEYS)) {

createBookStatement.setString(1, book.getTitle());
createBookStatement.setObject(
2, book.getPrice());
createBookStatement.executeUpdate();
ResultSet generatedKeys = createBookStatement.getGeneratedKeys();
if (generatedKeys.next()) {
Long id = generatedKeys.getObject(1, Long.class);
book.setId(id);
}
} catch (SQLException e) {
throw new DataProcessingException("Can`t insert book to DB" + book, e);
}
return book;
}

@Override
public Optional<Book> findById(Long id) {
String findByIdQuery = "SELECT * FROM books "
+ "WHERE is_deleted = 'FALSE' AND id = ?;";
Book book = null;
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement findByIdStatement =
connection.prepareStatement(findByIdQuery)) {

findByIdStatement.setLong(1, id);
ResultSet resultSet = findByIdStatement.executeQuery();
while (resultSet.next()) {
if (resultSet.getObject("id", Long.class).equals(id)) {
book = getBookFromResultSet(resultSet);
}
}
} catch (SQLException e) {
throw new DataProcessingException(
"Can`t find book by id from DB. id = " + id, e);
}
return Optional.ofNullable(book);
}

@Override
public List<Book> findAll() {
String getAllQuery = "SELECT * FROM books "
+ "WHERE is_deleted = 'FALSE';";
List<Book> books = new ArrayList<>();
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement findAllBooksStatement =
connection.prepareStatement(getAllQuery)) {
ResultSet resultSet = findAllBooksStatement.executeQuery();
while (resultSet.next()) {
Book bookFromResultSet =
getBookFromResultSet(resultSet);
books.add(bookFromResultSet);
}
} catch (SQLException e) {
throw new DataProcessingException(
"Can`t find all books from DB" + books, e);
}
return books;
}

@Override
public Book update(Book book) {
String updateQuery =
"UPDATE books SET title = ?, price = ? "
+ "WHERE is_deleted = FALSE AND id = ?;";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement updateBookStatement =
connection.prepareStatement(updateQuery)) {

updateBookStatement.setString(1, book.getTitle());
updateBookStatement.setObject(
2, book.getPrice());
updateBookStatement.setLong(3, book.getId());
updateBookStatement.executeUpdate();
} catch (SQLException e) {
throw new DataProcessingException("Can`t update book: " + book, e);
}
return book;
}

@Override
public boolean deleteById(Long id) {
String deleteQuery = "UPDATE books SET is_deleted = TRUE "
+ "WHERE id = ?;";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement deleteBookStatement =
connection.prepareStatement(deleteQuery)) {
deleteBookStatement.setLong(1, id);
return deleteBookStatement.executeUpdate() > 0;
} catch (SQLException e) {
throw new DataProcessingException(
"Can`t delete book by id from DB. id = " + id, e);
}
}

private Book getBookFromResultSet(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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package mate.academy.exception;

public class DataProcessingException extends RuntimeException {
public DataProcessingException(String message, Throwable ex) {
super(message, ex);
}
}
46 changes: 46 additions & 0 deletions src/main/java/mate/academy/model/Book.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
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
+ '}';
}
}
33 changes: 33 additions & 0 deletions src/main/java/mate/academy/util/ConnectionUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
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 URL = "jdbc:mysql://localhost:3306/books";
private static final String USERNAME = "root";
private static final String PASSWORD = "2121105";
private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";

static {
try {
Class.forName(JDBC_DRIVER);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}

public static Connection getConnection() {
try {
Properties dbProperties = new Properties();
dbProperties.put("user", USERNAME);
dbProperties.put("password", PASSWORD);
return DriverManager.getConnection(
URL, dbProperties);
} catch (SQLException e) {
throw new RuntimeException("Can`t create connection to DB", e);
}
}
}
9 changes: 9 additions & 0 deletions src/main/resources/init_db.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
CREATE DATABASE `books`

CREATE TABLE `books`(
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(45) DEFAULT NULL,
`price` bigint DEFAULT NULL,
`is_deleted` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

0 comments on commit abf076f

Please sign in to comment.