Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Kulibchenko committed Aug 13, 2023
1 parent 96f414d commit b009657
Show file tree
Hide file tree
Showing 8 changed files with 273 additions and 0 deletions.
7 changes: 7 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@
<artifactId>jv-jdbc-intro</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/mate/academy/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,28 @@
package mate.academy;

import java.math.BigDecimal;
import mate.academy.dao.BookDao;
import mate.academy.lib.Injector;
import mate.academy.models.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("Kobzar");
book.setPrice(BigDecimal.valueOf(500));

Book book1 = bookDao.create(book);
book1.setPrice(BigDecimal.valueOf(700));
System.out.println(book1);
bookDao.update(book1);
System.out.println(bookDao.findById(book1.getId()));

bookDao.fingAll().forEach(System.out::println);
bookDao.fingAll().forEach(b -> bookDao.deleteById(b.getId()));

}
}
18 changes: 18 additions & 0 deletions src/main/java/mate/academy/dao/BookDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package mate.academy.dao;

import mate.academy.models.Book;

import java.util.List;
import java.util.Optional;

public interface BookDao {
Book create(Book book);

Optional<Book> findById(Long id);

List<Book> fingAll();

Book update(Book book);

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

import java.math.BigDecimal;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import mate.academy.lib.Dao;
import mate.academy.lib.DataProcessingException;
import mate.academy.models.Book;
import mate.academy.util.ConnectionUtil;

@Dao
public class BookDaoImpl implements BookDao{
@Override
public Book create(Book book) {
String query = "INSERT INTO books(tittle, price) VALUES(?, ?)";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement createBookStatement = connection
.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) {
createBookStatement.setString(1, book.getTitle());
createBookStatement.setBigDecimal(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 "
+ book + " to DB", e);
}
return book;
}

@Override
public Optional<Book> findById(Long id) {
String query = "SELECT * FROM books WHERE is_deleted = FALSE";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement getAllBookStatement = connection
.prepareStatement(query)) {
ResultSet resultSet = getAllBookStatement.executeQuery();
while (resultSet.next()) {
Long identifier = resultSet.getObject("id", Long.class);
if (Objects.equals(id, identifier)) {
Book book = getBook(resultSet);
return Optional.of(book);
}
}
} catch (SQLException e) {
throw new DataProcessingException("Can`t get book with id = "
+ id + " from DB", e);
}
return Optional.empty();
}

@Override
public List<Book> fingAll() {
String query = "SELECT * FROM books WHERE is_deleted = FALSE";
List<Book> allBook = new ArrayList<>();
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement getAllBookStatement = connection
.prepareStatement(query)) {
ResultSet resultSet = getAllBookStatement.executeQuery();
while (resultSet.next()) {
Book book = getBook(resultSet);
allBook.add(book);
}

} catch (SQLException e) {
throw new DataProcessingException("Can`t get all manufacturers from DB", e);
}
return allBook; }

@Override
public Book update(Book book) {
String query = "UPDATE books SET tittle = ?, price = ? "
+ "WHERE id = ? AND is_deleted = FALSE";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement createBookStatement = connection
.prepareStatement(query)) {
createBookStatement.setString(1, book.getTitle());
createBookStatement.setBigDecimal(2, book.getPrice());
createBookStatement.setLong(3, book.getId());
createBookStatement.executeUpdate();
} catch (SQLException e) {
throw new DataProcessingException("Can`t update book "
+ book + " to DB", e);
}
return book; }

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

private Book getBook(ResultSet resultSet) throws SQLException {
String tittle = resultSet.getString("tittle");
long price = resultSet.getLong("price");
Long id = resultSet.getObject("id", Long.class);
Book book = new Book();
book.setId(id);
book.setTitle(tittle);
book.setPrice(BigDecimal.valueOf(price));
return book;
}
}
11 changes: 11 additions & 0 deletions src/main/java/mate/academy/lib/DataProcessingException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package mate.academy.lib;

public class DataProcessingException extends RuntimeException {
private String message;
private Throwable ex;

public DataProcessingException(String message, Throwable ex) {
this.message = message;
this.ex = ex;
}
}
59 changes: 59 additions & 0 deletions src/main/java/mate/academy/models/Book.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package mate.academy.models;

import java.math.BigDecimal;
import java.util.Objects;

public class Book {
private Long id;
private String title;
private BigDecimal price;

public Book() {
}

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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(id, book.id) && Objects.equals(title, book.title) && Objects.equals(price, book.price);
}

@Override
public int hashCode() {
return Objects.hash(id, title, price);
}

@Override
public String toString() {
return "Book{"
+ "id=" + id
+ ", title='" + title + '\''
+ ", price=" + price
+ '}';
}
}
30 changes: 30 additions & 0 deletions src/main/java/mate/academy/util/ConnectionUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package mate.academy.util;

import mate.academy.lib.DataProcessingException;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class ConnectionUtil {
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new DataProcessingException("Cant load JDBC driver for MySQL", e);
}
}

public static Connection getConnection() {
try {
Properties dbProperties = new Properties();
dbProperties.put("user", "root");
dbProperties.put("password", "admin");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/library_db",
dbProperties);
} catch (SQLException x) {
throw new DataProcessingException("Cant create connection to DB", x);
}
}
}
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 `library_db` /*!40100 DEFAULT CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTION='N' */;

CREATE TABLE `books` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tittle` varchar(255) DEFAULT NULL,
`price` bigint DEFAULT NULL,
`is_deleted` tinyint NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

0 comments on commit b009657

Please sign in to comment.