diff --git a/src/main/java/de/hsel/itech/db/Database.java b/src/main/java/de/hsel/itech/db/Database.java index 2faa88e..687a647 100644 --- a/src/main/java/de/hsel/itech/db/Database.java +++ b/src/main/java/de/hsel/itech/db/Database.java @@ -59,7 +59,7 @@ public class Database { private Database() { Configuration config = Configuration.get(); dataSource = new MariaDbPoolDataSource("jdbc:mysql://" + config.getDatabase().getHostname() - + ":" + config.getDatabase().getPort() + "/" + config.getDatabase().getDatabase()); + + ":" + config.getDatabase().getPort() + "/" + config.getDatabase().getDatabase() + "?useUnicode=true&characterEncoding=UTF-8"); try { dataSource.setUser(config.getDatabase().getUsername()); dataSource.setPassword(config.getDatabase().getPassword()); @@ -146,25 +146,34 @@ public class Database { return author; } + /** + * gets author by name. + * + * @param name author name + * @return {@link de.hsel.itech.db.pojo.Author} + */ @Nullable public Author getAuthor(String name) { + Map.Entry entry = getResultSets(author, "name", name); + assert entry != null; + assert entry.getKey() != null; + Author author = null; - - Map.Entry, Connection> set = getResultSets(this.author, "name", name); - - if(set == null){ - return null; - } - - if (set.getKey().size() > 0) { - try { - author = new Author(set.getKey().get(0).getLong("id"), set.getKey().get(0).getString("name")); - } catch (SQLException e) { - e.printStackTrace(); + ResultSet rs = entry.getKey(); + try { + while(rs.next()) { + System.out.println(rs.getString("name")); } + rs.beforeFirst(); + if(!rs.next()) { + System.out.println("test"); + }else + author = new Author(rs.getLong("id"), rs.getString("name")); + entry.getValue().close(); + } catch (SQLException e) { + e.printStackTrace(); } - return author; } @@ -178,15 +187,47 @@ public class Database { public Category getCategory(long id) { Map.Entry entry = getResultSet(id, category); assert entry != null; - ResultSet rs = entry.getKey(); - Category category = null; + try { - category = new Category(rs.getLong("id"), rs.getString("name"), rs.getString("image")); - entry.getValue().close(); + while(rs.next()) { + System.out.println(rs.getLong("id")); + } + + rs.beforeFirst(); } catch (SQLException e) { e.printStackTrace(); } + return getCategory(entry); + } + + /** + * get category by name. + * + * @param name category name + * @return {@link de.hsel.itech.db.pojo.Category} + */ + @Nullable + public Category getCategory(String name) { + Map.Entry entry = getResultSets(category, "name", name); + assert entry != null; + + return getCategory(entry); + } + + @Nullable + private Category getCategory(@NotNull Map.Entry entry) { + ResultSet rs = entry.getKey(); + Category category = null; + try{ + System.out.println(rs.getStatement()); + while(rs.next()) { + category = new Category(rs.getLong("id"), rs.getString("name"), rs.getString("image")); + } + entry.getValue().close(); + }catch (SQLException ex) { + ex.printStackTrace(); + } return category; } @@ -212,6 +253,32 @@ public class Database { return publisher; } + /** + * get publisher by name. + * + * @param name publisher name + * @return {@link de.hsel.itech.db.pojo.Publisher} + */ + @Nullable + public Publisher getPublisher(String name) { + Map.Entry entry = getResultSets(publisher, "name", name); + assert entry != null; + assert entry.getKey() != null; + + Publisher publisher = null; + ResultSet rs = entry.getKey(); + try { + while(rs.next()) { + publisher = new Publisher(rs.getLong("id"), rs.getString("name")); + } + entry.getValue().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + + return publisher; + } + /** * gets list of author ids from database. * @@ -220,11 +287,12 @@ public class Database { */ @Nullable private List getAuthors(long id) { - Map.Entry, Connection> entry = getResultSets(id, authorBook, book); + Map.Entry entry = getResultSets(id, authorBook, book); assert entry != null; try { List list = new ArrayList<>(); - for (ResultSet rs : entry.getKey()) { + ResultSet rs = entry.getKey(); + while (rs.next()) { list.add(rs.getInt(author)); } entry.getValue().close(); @@ -252,7 +320,10 @@ public class Database { Category category = getCategory(rs.getLong(this.category)); Publisher publisher = getPublisher(rs.getLong(this.publisher)); List authorIds = getAuthors(id); + assert category != null; + assert publisher != null; assert authorIds != null; + List authors = new ArrayList<>(); for (int i : authorIds) { Author author = getAuthor(i); @@ -276,13 +347,14 @@ public class Database { */ @Nullable public List getBooks() { - Map.Entry, Connection> entry = getResultSets(book, "id"); + Map.Entry entry = getResultSets(book, "id"); assert entry != null; List ids = new ArrayList<>(); try { - for (ResultSet resultSet : entry.getKey()) { - ids.add(resultSet.getLong("id")); + ResultSet rs = entry.getKey(); + while (rs.next()) { + ids.add(rs.getLong("id")); } entry.getValue().close(); } catch (SQLException ex) { @@ -349,6 +421,47 @@ public class Database { int insertCount = 0; + //author exists ? + List authors = new ArrayList<>(); + for (Author author : book.getAuthors()) { + if (author.getId() == 0) { + Author dbAuthor = getAuthor(author.getName()); + System.out.println(dbAuthor); + if (dbAuthor == null) { + insertCount += insert(author); + dbAuthor = getAuthor(author.getName()); + } + authors.add(dbAuthor); + }else authors.add(author); + } + + //publisher exists ? + Publisher publisher; + if(book.getPublisher().getId() == 0) { + Publisher dbPublisher = getPublisher(book.getPublisher().getName()); + if(dbPublisher != null) + publisher = dbPublisher; + else { + insertCount += insert(new Publisher(book.getPublisher().getName())); + publisher = getPublisher(book.getPublisher().getName()); + } + }else publisher = book.getPublisher(); + + //category exists ? + Category category; + if(book.getCategory().getId() == 0) { + Category dbCategory = getCategory(book.getCategory().getName()); + if(dbCategory != null) + category = dbCategory; + else { + insertCount += insert(new Category(book.getCategory().getName(), book.getCategory().getImage())); + category = getCategory(book.getCategory().getName()); + } + }else category = book.getCategory(); + + assert publisher != null; + assert category != null; + try { PreparedStatement statement = connection.prepareStatement("INSERT INTO book(title, description, " + "price, year, publisher, category, image) VALUES (?, ?, ?, ?, ?, ?, ?)"); @@ -356,12 +469,12 @@ public class Database { statement.setString(2, book.getDescription()); statement.setInt(3, book.getPrice()); statement.setInt(4, book.getYear().getValue()); - statement.setLong(5, book.getPublisher().getId()); - statement.setLong(6, book.getCategory().getId()); + statement.setLong(5, publisher.getId()); + statement.setLong(6, category.getId()); statement.setString(7, book.getImage()); insertCount += statement.executeUpdate(); - for (Author author : book.getAuthors()) { + for (Author author : authors) { PreparedStatement authorStatement = connection.prepareStatement("INSERT INTO author_book (author, book) VALUES (?, ?)"); statement.setLong(1, author.getId()); statement.setLong(2, book.getIsbn()); @@ -519,9 +632,8 @@ public class Database { int deleteCount = 0; try { - PreparedStatement statement = connection.prepareStatement("DELETE FROM ? WHERE id=?"); - statement.setString(1, table); - statement.setLong(2, id); + PreparedStatement statement = connection.prepareStatement("DELETE FROM " + table + " WHERE id=?"); + statement.setLong(1, id); deleteCount = +statement.executeUpdate(); @@ -544,9 +656,8 @@ public class Database { Connection connection = getConnection(); try { assert connection != null; - PreparedStatement statement = connection.prepareStatement("SELECT * FROM ? WHERE ID = ?"); - statement.setString(1, table); - statement.setLong(2, id); + PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + table + " WHERE id = ?"); + statement.setLong(1, id); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { return new AbstractMap.SimpleEntry<>(resultSet, connection); @@ -568,14 +679,12 @@ public class Database { * @return {@link java.util.Map.Entry} */ @Nullable - private Map.Entry, Connection> getResultSets(long id, @NotNull String table, @NotNull String column) { + private Map.Entry getResultSets(long id, @NotNull String table, @NotNull String column) { Connection connection = getConnection(); try { assert connection != null; - PreparedStatement statement = connection.prepareStatement("SELECT * FROM ? WHERE ? = ?"); - statement.setString(1, table); - statement.setString(2, column); - statement.setLong(3, id); + PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + table + " WHERE " + column + " = ?"); + statement.setLong(1, id); return getAllEntries(connection, statement); } catch (SQLException ex) { @@ -592,16 +701,12 @@ public class Database { * @return {@link java.util.Map.Entry} */ @Nullable - private Map.Entry, Connection> getResultSets(@NotNull String table, @NotNull String column, @NotNull String value) { + private Map.Entry getResultSets(@NotNull String table, @NotNull String column, @NotNull String value) { Connection connection = getConnection(); try { assert connection != null; - PreparedStatement statement = connection.prepareStatement("SELECT * FROM ? WHERE ? = ?"); - statement.setString(1, table); - statement.setString(2, column); - statement.setString(3, value); - - System.out.println(statement); + PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + table + " WHERE " + column + " = ?"); + statement.setString(1, value); return getAllEntries(connection, statement); } catch (SQLException ex) { @@ -618,13 +723,11 @@ public class Database { * @return {@link java.util.Map.Entry} */ @Nullable - private Map.Entry, Connection> getResultSets(@NotNull String table, @NotNull String... columns) { + private Map.Entry getResultSets(@NotNull String table, @NotNull String... columns) { Connection connection = getConnection(); try { assert connection != null; - PreparedStatement statement = connection.prepareStatement("SELECT (?) FROM ?"); - statement.setString(1, String.join(",", columns)); - statement.setString(2, table); + PreparedStatement statement = connection.prepareStatement("SELECT (" + String.join(",", columns) + ") FROM " + table); return getAllEntries(connection, statement); } catch (SQLException ex) { @@ -641,15 +744,10 @@ public class Database { * @return {@link java.util.Map.Entry} */ @Nullable - private Map.Entry, Connection> getAllEntries(@NotNull Connection connection, @NotNull PreparedStatement statement) { + private Map.Entry getAllEntries(@NotNull Connection connection, @NotNull PreparedStatement statement) { try { ResultSet resultSet = statement.executeQuery(); - - Map.Entry, Connection> entry = new AbstractMap.SimpleEntry<>(new ArrayList<>(), connection); - while (resultSet.next()) { - entry.getKey().add(resultSet); - } - return entry; + return new AbstractMap.SimpleEntry<>(resultSet, connection); } catch (SQLException ex) { ex.printStackTrace(); } diff --git a/src/main/java/de/hsel/itech/db/pojo/Category.java b/src/main/java/de/hsel/itech/db/pojo/Category.java index 28eb94e..b3099ed 100644 --- a/src/main/java/de/hsel/itech/db/pojo/Category.java +++ b/src/main/java/de/hsel/itech/db/pojo/Category.java @@ -1,9 +1,6 @@ package de.hsel.itech.db.pojo; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; +import lombok.*; /** * POJO for Category. @@ -16,9 +13,15 @@ import lombok.RequiredArgsConstructor; @Data @AllArgsConstructor @RequiredArgsConstructor +@NoArgsConstructor public class Category { private long id; @NonNull private String name; - @NonNull private String image; + private String image; + + public Category(String name, String image) { + this.name = name; + this.image = image; + } } diff --git a/src/main/java/de/hsel/itech/servlet/BookList.java b/src/main/java/de/hsel/itech/servlet/BookList.java index 0ff4a15..3c5c252 100644 --- a/src/main/java/de/hsel/itech/servlet/BookList.java +++ b/src/main/java/de/hsel/itech/servlet/BookList.java @@ -1,5 +1,6 @@ package de.hsel.itech.servlet; +import de.hsel.itech.db.Database; import de.hsel.itech.db.pojo.Author; import de.hsel.itech.db.pojo.Book; import de.hsel.itech.db.pojo.Category; @@ -21,7 +22,7 @@ public class BookList extends HttpServlet { throws IOException { //get database object - de.hsel.itech.db.Database db = de.hsel.itech.db.Database.getInstance(); + Database db = Database.getInstance(); //print parameter (debug) Enumeration names = req.getParameterNames(); @@ -43,26 +44,23 @@ public class BookList extends HttpServlet { String authorName = req.getParameter("author"); int price = Integer.parseInt(req.getParameter("price")); int year = Integer.parseInt(req.getParameter("year")); - String category = req.getParameter("category"); + String categoryName = req.getParameter("category"); String description = req.getParameter("description"); String publisher = req.getParameter("publisher"); String image = req.getParameter("image"); - ArrayList authors = new ArrayList(); - Author author = null; - - author = db.getAuthor(authorName); - - if(author == null){ - author = new Author(authorName); - db.insert(author); + ArrayList authors = new ArrayList<>(); + String[] authorNames = authorName.split(","); + for(String name : authorNames) { + authors.add(new Author(name)); } - authors.add(author); + Category category = new Category(); + category.setName(categoryName); Book book = new Book( authors, new Publisher(publisher), - new Category(category, "DxAzOKSiPoE"), + category, title, Year.of(year),price,description, image ); db.insert(book);