Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
JeniaSan committed Aug 3, 2023
1 parent ee3ea7f commit 3c0d704
Show file tree
Hide file tree
Showing 8 changed files with 244 additions and 2 deletions.
8 changes: 7 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,11 @@
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
</project>
22 changes: 21 additions & 1 deletion src/main/java/mate/academy/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,27 @@
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 {
private static final Injector injector = Injector.getInstance("mate.academy");
public static void main(String[] args) {

BookDao bookDao = (BookDao) injector.getInstance(BookDao.class);
Book firstBook = new Book();
firstBook.setTitle("firstBook");
firstBook.setPrice(BigDecimal.valueOf(10));
Book secondBook = new Book();
secondBook.setTitle("secondBook");
secondBook.setPrice(BigDecimal.valueOf(20));
bookDao.create(firstBook);
bookDao.create(secondBook);
System.out.println(bookDao.findById(firstBook.getId()));
bookDao.findAll().forEach(System.out::println);
firstBook.setPrice(BigDecimal.valueOf(30));
firstBook.setTitle("newFirstBook");
bookDao.update(firstBook);
System.out.println(bookDao.deleteById(secondBook.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);
}
115 changes: 115 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,115 @@
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.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Dao
public class BookDaoImpl implements BookDao {
@Override
public Book create(Book book) {
String request = "INSERT INTO books (title, price) VALUES(?, ?)";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(
request, PreparedStatement.RETURN_GENERATED_KEYS
)) {
statement.setString(1, book.getTitle());
statement.setObject(2, book.getPrice());
int affectedRows = statement.executeUpdate();
if (affectedRows < 1) {
throw new RuntimeException(
"Expected to insert at leas one row, but inserted 0 rows.");
}
ResultSet resultSet = statement.getGeneratedKeys();
if (resultSet.next()) {
Long id = resultSet.getObject(1, Long.class);
book.setId(id);
}
} catch (SQLException e) {
throw new DataProcessingException("Can't save a book " + book, e);
}
return book;
}

@Override
public Optional<Book> findById(Long id) {
String request = "SELECT * FROM books WHERE id = ?";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(request)) {
statement.setLong(1, id);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
return Optional.of(initializedBook(resultSet));
}
} catch (SQLException e) {
throw new DataProcessingException("Can't find book by id= " + id, e);
}
return Optional.empty();
}

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

@Override
public Book update(Book book) {
String request = "UPDATE books SET title = ?, price = ? WHERE id = ?";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(request)) {
statement.setString(1, book.getTitle());
statement.setObject(2, book.getPrice());
statement.setObject(3, book.getId());
if (statement.executeUpdate() < 1) {
throw new RuntimeException(
"Expected to insert at least one row, but inserted 0 rows");
}
} catch (SQLException e) {
throw new DataProcessingException("Can't update book " + book, e);
}
return book;
}

@Override
public boolean deleteById(Long id) {
String request = "DELETE FROM books WHERE id = ?";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(request)) {
statement.setObject(1, id);
return statement.executeUpdate() > 0;
} catch (SQLException e) {
throw new DataProcessingException("Can't delete book by id= " + id, e);
}
}
private Book initializedBook(ResultSet resultSet) throws SQLException {
Long id = resultSet.getObject("id", Long.class);
String title = resultSet.getString("title");
BigDecimal price = BigDecimal.valueOf(resultSet.getLong("price"));
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);
}
}
45 changes: 45 additions & 0 deletions src/main/java/mate/academy/model/Book.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
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
+ '}';
}
}
26 changes: 26 additions & 0 deletions src/main/java/mate/academy/util/ConnectionUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
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/books";
private static final Properties DB_PROPERTIES;

static {
DB_PROPERTIES = new Properties();
DB_PROPERTIES.put("user", "root");
DB_PROPERTIES.put("password", "qwerty123");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new RuntimeException("Can't load JDBC driver for MySQL", e);
}
}

public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(DB_URL, DB_PROPERTIES);
}
}
6 changes: 6 additions & 0 deletions src/main/resources/init_db.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
CREATE TABLE `books` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255),
`price` INT,
PRIMARY KEY (`id`)
);

0 comments on commit 3c0d704

Please sign in to comment.