diff --git a/core/src/main/java/me/zort/sqllib/SQLDatabaseConnection.java b/core/src/main/java/me/zort/sqllib/SQLDatabaseConnection.java index 4ce12c7..233428b 100644 --- a/core/src/main/java/me/zort/sqllib/SQLDatabaseConnection.java +++ b/core/src/main/java/me/zort/sqllib/SQLDatabaseConnection.java @@ -1,5 +1,6 @@ package me.zort.sqllib; +import lombok.AllArgsConstructor; import lombok.Getter; import me.zort.sqllib.api.Query; import me.zort.sqllib.api.SQLConnection; @@ -8,7 +9,9 @@ import me.zort.sqllib.api.data.Row; import me.zort.sqllib.api.mapping.StatementMappingOptions; import me.zort.sqllib.internal.factory.SQLConnectionFactory; +import me.zort.sqllib.internal.impl.QueryResultImpl; import me.zort.sqllib.internal.query.*; +import me.zort.sqllib.internal.query.part.SetStatement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -73,18 +76,6 @@ public SQLDatabaseConnection(final @NotNull SQLConnectionFactory connectionFacto public abstract T createGate(Class mappingInterface, @NotNull StatementMappingOptions options); public abstract boolean buildEntitySchema(String tableName, Class entityClass); - /** - * Saves this mapping object into database using upsert query. - *

- * All mapping strategies are described in: - * {@link SQLDatabaseConnection#query(Query, Class)}. - * - * @param table Table to save into. - * @param obj The object to save. - * @return Result of the query. - */ - public abstract QueryResult save(String table, Object obj); - /** * Performs new query and returns the result. This result is never null. * See: {@link QueryRowsResult#isSuccessful()} @@ -121,9 +112,59 @@ public SQLDatabaseConnection(final @NotNull SQLConnectionFactory connectionFacto */ public abstract QueryResult exec(Query query); public abstract QueryResult exec(String query); + protected abstract DefsVals buildDefsVals(Object obj); public abstract boolean isLogSqlErrors(); public abstract boolean isDebug(); + /** + * Saves this mapping object into database using upsert query. + *

+ * All mapping strategies are described in: + * {@link SQLDatabaseConnection#query(Query, Class)}. + * + * @param table Table to save into. + * @param obj The object to save. + * @return Result of the query. + */ + // by default, it creates and upsert request. + public QueryResult save(final @NotNull String table, final @NotNull Object obj) { + DefsVals defsVals = buildDefsVals(obj); + + if(defsVals == null) return new QueryResultImpl(false); + + return save(obj).table(table).execute(); + } + + public UpsertQuery save(final @NotNull Object obj) { + DefsVals defsVals = buildDefsVals(obj); + if(defsVals == null) return null; + + String[] defs = defsVals.getDefs(); + SQLDatabaseConnectionImpl.UnknownValueWrapper[] vals = defsVals.getVals(); + UpsertQuery upsert = upsert().into(null, defs); + for(SQLDatabaseConnectionImpl.UnknownValueWrapper wrapper : vals) { + upsert.appendVal(wrapper.getObject()); + } + SetStatement setStmt = upsert.onDuplicateKey(); + for(int i = 0; i < defs.length; i++) { + setStmt.and(defs[i], vals[i].getObject()); + } + + return (UpsertQuery) setStmt.getAncestor(); + } + + public QueryResult insert(final @NotNull String table, final @NotNull Object obj) { + DefsVals defsVals = buildDefsVals(obj); + if (defsVals == null) return new QueryResultImpl(false); + + InsertQuery query = insert().into(table, defsVals.getDefs()); + for (SQLDatabaseConnectionImpl.UnknownValueWrapper valueWrapper : defsVals.getVals()) { + query.appendVal(valueWrapper.getObject()); + } + + return query.execute(); + } + // --***-- Query builders --***-- public SelectQuery select(String... cols) { @@ -161,7 +202,6 @@ public DeleteQuery delete() { @Override public final boolean connect() { if(isConnected()) disconnect(); - try { connection = connectionFactory.connect(); lastError = null; @@ -176,7 +216,6 @@ public final boolean connect() { @Override public final void disconnect() { if (!isConnected()) return; - try { connection.close(); lastError = null; @@ -195,4 +234,10 @@ protected void logSqlError(Exception e) { if(isLogSqlErrors()) e.printStackTrace(); } + @AllArgsConstructor + @Getter + protected static class DefsVals { + private final String[] defs; + private final SQLDatabaseConnectionImpl.UnknownValueWrapper[] vals; + } } diff --git a/core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java b/core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java index 0ceb2db..0b72a51 100644 --- a/core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java +++ b/core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java @@ -21,9 +21,6 @@ import me.zort.sqllib.internal.impl.DefaultNamingStrategy; import me.zort.sqllib.internal.impl.DefaultObjectMapper; import me.zort.sqllib.internal.impl.QueryResultImpl; -import me.zort.sqllib.internal.query.InsertQuery; -import me.zort.sqllib.internal.query.UpsertQuery; -import me.zort.sqllib.internal.query.part.SetStatement; import me.zort.sqllib.mapping.DefaultResultAdapter; import me.zort.sqllib.mapping.DefaultStatementMappingFactory; import me.zort.sqllib.pool.PooledSQLDatabaseConnection; @@ -279,25 +276,20 @@ public QueryRowsResult query(final @NotNull String query) { return query(() -> query); } - private QueryRowsResult query(final @NotNull Query query, boolean isRetry) { + @NotNull + QueryRowsResult query(final @NotNull Query query, boolean isRetry) { Objects.requireNonNull(query); - - if(!handleAutoReconnect()) { - return new QueryRowsResult<>(false, "Cannot connect to database!"); - } + if(!handleAutoReconnect()) return new QueryRowsResult<>(false, "Cannot connect to database!"); try(PreparedStatement stmt = buildStatement(query); ResultSet resultSet = stmt.executeQuery()) { QueryRowsResult result = new QueryRowsResult<>(true); - while(resultSet.next()) { ResultSetMetaData meta = resultSet.getMetaData(); Row row = new Row(); for(int i = 1; i <= meta.getColumnCount(); i++) { Object obj = resultSet.getObject(i); - if(obj instanceof String) { - obj = ((String) obj).replaceAll("''", "'"); - } + if(obj instanceof String) obj = ((String) obj).replaceAll("''", "'"); row.put(meta.getColumnName(i), obj); } result.add(row); @@ -353,58 +345,6 @@ private QueryResult exec(final @NotNull Query query, boolean isRetry) { } } - /** - * Saves this mapping object into database using upsert query. - *

- * All mapping strategies are described in: - * {@link SQLDatabaseConnection#query(Query, Class)}. - * - * @param table Table to save into. - * @param obj The object to save. - * @return Result of the query. - */ - // by default, it creates and upsert request. - @Override - public QueryResult save(final @NotNull String table, final @NotNull Object obj) { - DefsVals defsVals = buildDefsVals(obj); - - if(defsVals == null) { - return new QueryResultImpl(false); - } - - return save(obj).table(table).execute(); - } - - public UpsertQuery save(final @NotNull Object obj) { - DefsVals defsVals = buildDefsVals(obj); - if(defsVals == null) return null; - - String[] defs = defsVals.getDefs(); - UnknownValueWrapper[] vals = defsVals.getVals(); - UpsertQuery upsert = upsert().into(null, defs); - for(UnknownValueWrapper wrapper : vals) { - upsert.appendVal(wrapper.getObject()); - } - SetStatement setStmt = upsert.onDuplicateKey(); - for(int i = 0; i < defs.length; i++) { - setStmt.and(defs[i], vals[i].getObject()); - } - - return (UpsertQuery) setStmt.getAncestor(); - } - - public QueryResult insert(final @NotNull String table, final @NotNull Object obj) { - DefsVals defsVals = buildDefsVals(obj); - if (defsVals == null) return new QueryResultImpl(false); - - InsertQuery query = insert().into(table, defsVals.getDefs()); - for (UnknownValueWrapper valueWrapper : defsVals.getVals()) { - query.appendVal(valueWrapper.getObject()); - } - - return query.execute(); - } - @SuppressWarnings("unchecked") @Nullable protected DefsVals buildDefsVals(Object obj) { @@ -529,13 +469,6 @@ public PreparedStatement prepare(Connection connection) throws SQLException { } } - @AllArgsConstructor - @Getter - protected static class DefsVals { - private final String[] defs; - private final UnknownValueWrapper[] vals; - } - @AllArgsConstructor @Data public static class UnknownValueWrapper { diff --git a/core/src/main/java/me/zort/sqllib/util/DefsVals.java b/core/src/main/java/me/zort/sqllib/util/DefsVals.java new file mode 100644 index 0000000..c582e5b --- /dev/null +++ b/core/src/main/java/me/zort/sqllib/util/DefsVals.java @@ -0,0 +1,7 @@ +package me.zort.sqllib.util; + +public final class DefsVals { + + + +}