-
Notifications
You must be signed in to change notification settings - Fork 438
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
323 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
7 changes: 7 additions & 0 deletions
7
src/main/java/mate/academy/exception/DataProcessingException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
+ '}'; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
36
src/main/java/mate/academy/service/impl/BookServiceImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
My66524407m |