diff -r fecda0f466e6 -r cf85ef18f231 src/main/java/de/uapcore/lightpit/dao/AbstractDao.java --- a/src/main/java/de/uapcore/lightpit/dao/AbstractDao.java Sun May 10 10:58:31 2020 +0200 +++ b/src/main/java/de/uapcore/lightpit/dao/AbstractDao.java Mon May 11 19:09:06 2020 +0200 @@ -28,24 +28,65 @@ */ package de.uapcore.lightpit.dao; -import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Types; import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import java.util.function.Function; public abstract class AbstractDao implements GenericDao { - protected abstract PreparedStatement listQuery(Connection connection) throws SQLException; + private final PreparedStatement listQuery; - protected abstract T mapColumns(ResultSet result) throws SQLException; + protected AbstractDao(PreparedStatement listQuery) { + this.listQuery = listQuery; + } + + public final T mapColumns(ResultSet result) throws SQLException { + return mapColumns(result, ""); + } + + public abstract T mapColumns(ResultSet result, String qualifier) throws SQLException; + + /** + * Qualifies a column label if an qualifier is specified. + * + * @param qualifier an optional qualifier + * @param label the column label + * @return the label, qualified if necessary + */ + protected final String qual(String qualifier, String label) { + if (qualifier == null || qualifier.isBlank()) { + return label; + } else { + return qualifier + "." + label; + } + } + + protected final void setStringOrNull(PreparedStatement stmt, int index, String str) throws SQLException { + if (str == null || str.isBlank()) { + stmt.setNull(index, Types.VARCHAR); + } else { + stmt.setString(index, str); + } + } + + protected final void setForeignKeyOrNull(PreparedStatement stmt, int index, T instance, Function keyGetter) throws SQLException { + Integer key = Optional.ofNullable(instance).map(keyGetter).orElse(null); + if (key == null) { + stmt.setNull(index, Types.INTEGER); + } else { + stmt.setInt(index, key); + } + } @Override - public List list(Connection conn) throws SQLException { + public List list() throws SQLException { List list = new ArrayList<>(); - try (PreparedStatement stmt = listQuery(conn); - ResultSet result = stmt.executeQuery()) { + try (ResultSet result = listQuery.executeQuery()) { while (result.next()) { list.add(mapColumns(result)); }