Skip to content

Commit

Permalink
implement task
Browse files Browse the repository at this point in the history
  • Loading branch information
romazan07 committed Jun 24, 2024
1 parent bc1d800 commit 699105f
Show file tree
Hide file tree
Showing 11 changed files with 323 additions and 1 deletion.
8 changes: 8 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@
</maven.checkstyle.plugin.configLocation>
</properties>

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

<build>
<plugins>
<plugin>
Expand Down
39 changes: 39 additions & 0 deletions src/main/java/mate/academy/ConnectionUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package mate.academy;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
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/jv-jdbc-intro";
private static final Properties DB_PROPERTIES;

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

public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(DB_URL, DB_PROPERTIES);
}

private static String getPassword() {
String path = "src/main/resources/pswrd.txt";
try {
return Files.readString(Path.of(path));

} catch (IOException e) {
throw new RuntimeException("Can't read a file with path: " + path, e);
}
}
}
25 changes: 24 additions & 1 deletion src/main/java/mate/academy/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,30 @@
package mate.academy;

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

public class Main {
public static void main(String[] args) {

Injector injector = Injector.getInstance("mate.academy");
BookDao bookDao = (BookDao) injector.getInstance(BookDao.class);
// create
Book book = new Book();
book.setTitle("Java Programming");
book.setPrice(100.00);
System.out.println(bookDao.create(book));
// update
Book bookUpdate = new Book();
bookUpdate.setTitle("Updated title");
bookUpdate.setPrice(200.00);
bookUpdate.setId(new BigInteger("1"));
System.out.println(bookDao.update(bookUpdate));
// findById
System.out.println(bookDao.findById(2L));
// findAll
System.out.println(bookDao.findAll());
// deleteById
System.out.println(bookDao.deleteById(1L));
}
}
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 java.util.List;
import java.util.Optional;
import mate.academy.model.Book;

public interface BookDao {
Book create(Book book);

Optional<Book> findById(Long id);

List<Book> findAll();

Book update(Book book);

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

import java.math.BigDecimal;
import java.math.BigInteger;
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.ConnectionUtil;
import mate.academy.exception.DataProcessingException;
import mate.academy.lib.Dao;
import mate.academy.model.Book;

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

@Override
public Optional<Book> findById(Long id) {
String query = "SELECT * FROM books WHERE id = ?";
try (
Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(query)) {
statement.setLong(1, id);
statement.executeQuery();
ResultSet resultSet = statement.getResultSet();
if (resultSet.next()) {
Book book = new Book();
book.setId(resultSet.getObject("id", BigInteger.class));
book.setTitle(resultSet.getObject("title", String.class));
book.setPrice(resultSet.getObject("price", Double.class));
return Optional.of(book);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return Optional.empty();
}

@Override
public List<Book> findAll() {
List<Book> books = new ArrayList<>();
String query = "SELECT * FROM books";
try (
Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(query)) {
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
do {
Book book = new Book();
book.setId(resultSet.getObject("id", BigInteger.class));
book.setTitle(resultSet.getObject("title", String.class));
book.setPrice(resultSet.getObject("price", Double.class));
books.add(book);
} while (resultSet.next());
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return books;
}

@Override
public Book update(Book book) {
String query = "UPDATE books SET title = ?, price = ? WHERE id = ?";
try (
Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(query)) {
statement.setString(1, book.getTitle());
statement.setDouble(2, book.getPrice());
statement.setBigDecimal(3, new BigDecimal(book.getId()));
int affectedRows = statement.executeUpdate();
if (affectedRows < 1) {
throw new RuntimeException(
"Expected to update at least one row, but updated 0 rows.");
}
return book;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}

@Override
public boolean deleteById(Long id) {
String query = "DELETE FROM books WHERE id = ?";
try (
Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(query)) {
statement.setLong(1, id);
int affectedRows = statement.executeUpdate();
if (affectedRows < 1) {
throw new RuntimeException(
"Expected to delete at least one row, but deleted 0 rows.");
}
} catch (SQLException e) {
throw new DataProcessingException("Can't delete book where id = " + id, e);
}
return true;
}
}
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);
}
}
42 changes: 42 additions & 0 deletions src/main/java/mate/academy/model/Book.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package mate.academy.model;

import java.math.BigInteger;

public class Book {
private BigInteger id;
private String title;
private double price;

public BigInteger getId() {
return id;
}

public void setId(BigInteger id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

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

import java.util.List;
import java.util.Optional;
import mate.academy.model.Book;

public interface BookService {
Book create(Book book);

Optional<Book> findById(Long id);

List<Book> findAll();

Book update(Book book);

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

import java.util.List;
import java.util.Optional;
import mate.academy.dao.BookDao;
import mate.academy.model.Book;
import mate.academy.service.BookService;

public class BookServiceImpl implements BookService {
private BookDao bookDao;

@Override
public Book create(Book book) {
return bookDao.create(book);
}

@Override
public Optional<Book> findById(Long id) {
return bookDao.findById(id);
}

@Override
public List<Book> findAll() {
return bookDao.findAll();
}

@Override
public Book update(Book book) {
return bookDao.update(book);
}

@Override
public boolean deleteById(Long id) {
return bookDao.deleteById(id);
}
}
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 BIGINIT NOT NULL AUTO_INCREMENT,
title VARCHAR(100),
price DECIMAL(10, 2),
PRIMARY KEY (id)
);
1 change: 1 addition & 0 deletions src/main/resources/pswrd.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
My66524407m

0 comments on commit 699105f

Please sign in to comment.