Skip to content

Commit

Permalink
completed homework jdbc-intro
Browse files Browse the repository at this point in the history
  • Loading branch information
kankeii committed Oct 24, 2024
1 parent bc1d800 commit a2a0a8d
Show file tree
Hide file tree
Showing 8 changed files with 258 additions and 1 deletion.
10 changes: 10 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,16 @@
</maven.checkstyle.plugin.configLocation>
</properties>

<dependencies>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.1.0</version>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
Expand Down
23 changes: 22 additions & 1 deletion 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 java.util.Arrays;
import java.util.List;
import mate.academy.dao.BookDao;
import mate.academy.lib.Injector;
import mate.academy.model.Book;

public class Main {
public static void main(String[] args) {
private static final Injector injector = Injector.getInstance("mate.academy.dao");

public static void main(String[] args) {
BookDao bookDao = (BookDao) injector.getInstance(BookDao.class);
List<Book> books = Arrays.asList(
new Book(1L, "Book1", BigDecimal.valueOf(5.99)),
new Book(2L, "Book2", BigDecimal.valueOf(4.35)),
new Book(3L, "Book3", BigDecimal.valueOf(10.00))
);
books.forEach(bookDao::create);
Book secondBook = books.get(1);
secondBook.setTitle("Book4");
bookDao.update(secondBook);
System.out.println(bookDao.findById(2L));
System.out.println(bookDao.findAll());
bookDao.deleteById(3L);
}
}
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 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);

}
112 changes: 112 additions & 0 deletions src/main/java/mate/academy/dao/BookDaoImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
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 {
private static final String CREATE = "INSERT INTO books (title, price) VALUES (?, ?)";
private static final String FIND_BY_ID = "SELECT * FROM books WHERE id = ?";
private static final String FIND_ALL = "SELECT * FROM books";
private static final String UPDATE = "UPDATE books SET title = ?, price = ? WHERE id = ?";
private static final String DELETE_BY_ID = "DELETE FROM books WHERE id = ?";

@Override
public Book create(Book book) {
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement
= connection.prepareStatement(CREATE, Statement.RETURN_GENERATED_KEYS)) {
statement.setString(1, book.getTitle());
statement.setBigDecimal(2, book.getPrice());
statement.executeUpdate();

ResultSet generatedKeys = statement.getGeneratedKeys();
if (generatedKeys.next()) {
book.setId(generatedKeys.getLong(1));
}
} catch (SQLException e) {
throw new DataProcessingException("Can't create book: " + book, e);
}
return book;
}

@Override
public Optional<Book> findById(long id) {
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(FIND_BY_ID)) {
statement.setLong(1, id);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
return Optional.of(takeBook(resultSet));
}
} catch (SQLException e) {
throw new DataProcessingException("Can't find book by id: " + id, e);
}
return Optional.empty();
}

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

@Override
public Book update(Book book) {
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(UPDATE)) {
statement.setString(1, book.getTitle());
statement.setBigDecimal(2, book.getPrice());
statement.setLong(3, book.getId());
if (statement.executeUpdate() < 1) {
throw new DataProcessingException("Book with id "
+ book.getId() + " does not found for update");
}
} catch (SQLException e) {
throw new DataProcessingException("Can't update book: " + book, e);
}
return book;
}

@Override
public boolean deleteById(long id) {
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(DELETE_BY_ID)) {
statement.setLong(1, id);
return statement.executeUpdate() > 0;
} catch (SQLException e) {
throw new DataProcessingException("Can't delete book by id: " + id, e);
}
}

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

public class DataProcessingException extends RuntimeException {
public DataProcessingException(String message, Throwable ex) {
super(message, ex);
}

public DataProcessingException(String message) {
super(message);
}
}
53 changes: 53 additions & 0 deletions src/main/java/mate/academy/model/Book.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package mate.academy.model;

import java.math.BigDecimal;

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

public Book() {

}

public Book(Long id, String title, BigDecimal price) {
this.id = id;
this.title = title;
this.price = 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
+ '}';
}
}
27 changes: 27 additions & 0 deletions src/main/java/mate/academy/util/ConnectionUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
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/jdbc_intro";
private static final Properties DB_PROPERTIES;

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

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

0 comments on commit a2a0a8d

Please sign in to comment.