Skip to content

Commit cb9d13a

Browse files
committed
Merge branch 'release/1.15'
2 parents 4bc5d04 + 1fd6b93 commit cb9d13a

File tree

8 files changed

+206
-6
lines changed

8 files changed

+206
-6
lines changed

dependency-reduced-pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>fr.maxlego08.sarah</groupId>
55
<artifactId>SarahORM</artifactId>
6-
<version>1.14</version>
6+
<version>1.15</version>
77
<build>
88
<plugins>
99
<plugin>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>fr.maxlego08.sarah</groupId>
88
<artifactId>SarahORM</artifactId>
9-
<version>1.14</version>
9+
<version>1.15</version>
1010

1111
<properties>
1212
<maven.compiler.source>1.8</maven.compiler.source>

src/main/java/fr/maxlego08/sarah/RequestHelper.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import fr.maxlego08.sarah.database.Schema;
44
import fr.maxlego08.sarah.logger.Logger;
5+
import fr.maxlego08.sarah.requests.InsertBatchRequest;
6+
import fr.maxlego08.sarah.requests.UpsertBatchRequest;
57

68
import java.sql.SQLException;
79
import java.util.ArrayList;
@@ -112,4 +114,14 @@ public void delete(String tableName, Consumer<Schema> consumer) {
112114
exception.printStackTrace();
113115
}
114116
}
117+
118+
public void upsertMultiple(List<Schema> schemas) {
119+
UpsertBatchRequest request = new UpsertBatchRequest(schemas);
120+
request.execute(this.connection, this.connection.getDatabaseConfiguration(), this.logger);
121+
}
122+
123+
public void insertMultiple(List<Schema> schemas) {
124+
InsertBatchRequest request = new InsertBatchRequest(schemas);
125+
request.execute(this.connection, this.connection.getDatabaseConfiguration(), this.logger);
126+
}
115127
}

src/main/java/fr/maxlego08/sarah/SchemaBuilder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,11 @@ public Schema bool(String columnName, boolean value) {
281281
return this.addColumn(new ColumnDefinition(columnName).setObject(value));
282282
}
283283

284+
@Override
285+
public Schema json(String columnName) {
286+
return addColumn(new ColumnDefinition(columnName, "JSON"));
287+
}
288+
284289
@Override
285290
public Schema blob(String columnName) {
286291
return addColumn(new ColumnDefinition(columnName, "BLOB"));

src/main/java/fr/maxlego08/sarah/database/Schema.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* Represents a schema builder for database operations.
1919
*/
2020
public interface Schema {
21-
// Column types
21+
2222
Schema uuid(String columnName);
2323

2424
Schema uuid(String columnName, UUID value);
@@ -51,6 +51,8 @@ public interface Schema {
5151

5252
Schema bool(String columnName, boolean value);
5353

54+
Schema json(String columnName);
55+
5456
Schema blob(String columnName);
5557

5658
Schema blob(String columnName, byte[] value);
@@ -159,5 +161,4 @@ public interface Schema {
159161
List<SelectCondition> getSelectColumns();
160162

161163
String getNewTableName();
162-
}
163-
164+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package fr.maxlego08.sarah.requests;
2+
3+
import fr.maxlego08.sarah.DatabaseConfiguration;
4+
import fr.maxlego08.sarah.DatabaseConnection;
5+
import fr.maxlego08.sarah.conditions.ColumnDefinition;
6+
import fr.maxlego08.sarah.database.Executor;
7+
import fr.maxlego08.sarah.database.Schema;
8+
import fr.maxlego08.sarah.logger.Logger;
9+
10+
import java.sql.Connection;
11+
import java.sql.PreparedStatement;
12+
import java.sql.ResultSet;
13+
import java.sql.SQLException;
14+
import java.sql.Statement;
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
public class InsertBatchRequest implements Executor {
19+
20+
private final List<Schema> schemas;
21+
22+
public InsertBatchRequest(List<Schema> schemas) {
23+
this.schemas = schemas;
24+
}
25+
26+
@Override
27+
public int execute(DatabaseConnection databaseConnection, DatabaseConfiguration databaseConfiguration, Logger logger) {
28+
if (schemas.isEmpty()) {
29+
return 0;
30+
}
31+
32+
Schema firstSchema = schemas.get(0);
33+
StringBuilder insertQuery = new StringBuilder("INSERT INTO " + firstSchema.getTableName() + " (");
34+
StringBuilder valuesQuery = new StringBuilder("VALUES ");
35+
36+
List<Object> values = new ArrayList<>();
37+
List<String> placeholders = new ArrayList<>();
38+
List<String> columnNames = new ArrayList<>();
39+
40+
for (ColumnDefinition column : firstSchema.getColumns()) {
41+
columnNames.add(column.getSafeName());
42+
}
43+
44+
insertQuery.append(String.join(", ", columnNames)).append(") ");
45+
46+
for (Schema schema : schemas) {
47+
List<String> rowPlaceholders = new ArrayList<>();
48+
for (ColumnDefinition column : schema.getColumns()) {
49+
rowPlaceholders.add("?");
50+
values.add(column.getObject());
51+
}
52+
placeholders.add("(" + String.join(", ", rowPlaceholders) + ")");
53+
}
54+
55+
valuesQuery.append(String.join(", ", placeholders));
56+
insertQuery.append(valuesQuery);
57+
58+
String finalQuery = databaseConfiguration.replacePrefix(insertQuery.toString());
59+
if (databaseConfiguration.isDebug()) {
60+
logger.info("Executing SQL: " + finalQuery);
61+
}
62+
63+
try (Connection connection = databaseConnection.getConnection();
64+
PreparedStatement preparedStatement = connection.prepareStatement(finalQuery, Statement.RETURN_GENERATED_KEYS)) {
65+
66+
int index = 1;
67+
for (Object value : values) {
68+
preparedStatement.setObject(index++, value);
69+
}
70+
71+
int updatedRows = preparedStatement.executeUpdate();
72+
73+
try (ResultSet generatedKeys = preparedStatement.getGeneratedKeys()) {
74+
if (generatedKeys.next()) {
75+
return generatedKeys.getInt(1);
76+
}
77+
}
78+
return updatedRows;
79+
} catch (SQLException exception) {
80+
exception.printStackTrace();
81+
return -1;
82+
}
83+
}
84+
}

src/main/java/fr/maxlego08/sarah/requests/InsertRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public int execute(DatabaseConnection databaseConnection, DatabaseConfiguration
5555

5656
try (ResultSet generatedKeys = preparedStatement.getGeneratedKeys()) {
5757
if (generatedKeys.next()) {
58-
return 1;
58+
return generatedKeys.getInt(1);
5959
} else {
6060
return 0;
6161
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package fr.maxlego08.sarah.requests;
2+
3+
import fr.maxlego08.sarah.DatabaseConfiguration;
4+
import fr.maxlego08.sarah.DatabaseConnection;
5+
import fr.maxlego08.sarah.conditions.ColumnDefinition;
6+
import fr.maxlego08.sarah.database.DatabaseType;
7+
import fr.maxlego08.sarah.database.Executor;
8+
import fr.maxlego08.sarah.database.Schema;
9+
import fr.maxlego08.sarah.logger.Logger;
10+
11+
import java.sql.Connection;
12+
import java.sql.PreparedStatement;
13+
import java.sql.SQLException;
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
17+
public class UpsertBatchRequest implements Executor {
18+
19+
private final List<Schema> schemas;
20+
21+
public UpsertBatchRequest(List<Schema> schemas) {
22+
this.schemas = schemas;
23+
}
24+
25+
@Override
26+
public int execute(DatabaseConnection databaseConnection, DatabaseConfiguration databaseConfiguration, Logger logger) {
27+
if (schemas.isEmpty()) {
28+
return 0;
29+
}
30+
31+
DatabaseType databaseType = databaseConfiguration.getDatabaseType();
32+
Schema firstSchema = schemas.get(0);
33+
StringBuilder insertQuery = new StringBuilder("INSERT INTO " + firstSchema.getTableName() + " (");
34+
StringBuilder valuesQuery = new StringBuilder("VALUES ");
35+
StringBuilder onUpdateQuery = new StringBuilder();
36+
37+
List<Object> values = new ArrayList<>();
38+
List<String> placeholders = new ArrayList<>();
39+
List<String> columnNames = new ArrayList<>();
40+
41+
for (ColumnDefinition column : firstSchema.getColumns()) {
42+
columnNames.add(column.getSafeName());
43+
}
44+
45+
insertQuery.append(String.join(", ", columnNames)).append(") ");
46+
47+
for (Schema schema : schemas) {
48+
List<String> rowPlaceholders = new ArrayList<>();
49+
for (ColumnDefinition column : schema.getColumns()) {
50+
rowPlaceholders.add("?");
51+
values.add(column.getObject());
52+
}
53+
placeholders.add("(" + String.join(", ", rowPlaceholders) + ")");
54+
}
55+
56+
valuesQuery.append(String.join(", ", placeholders));
57+
58+
if (databaseType == DatabaseType.SQLITE) {
59+
StringBuilder onConflictQuery = new StringBuilder(" ON CONFLICT (");
60+
List<String> primaryKeys = firstSchema.getPrimaryKeys();
61+
onConflictQuery.append(String.join(", ", primaryKeys)).append(") DO UPDATE SET ");
62+
63+
for (int i = 0; i < columnNames.size(); i++) {
64+
if (i > 0) onUpdateQuery.append(", ");
65+
onUpdateQuery.append(columnNames.get(i)).append(" = excluded.").append(columnNames.get(i));
66+
}
67+
68+
insertQuery.append(valuesQuery).append(onConflictQuery).append(onUpdateQuery);
69+
} else {
70+
onUpdateQuery.append(" ON DUPLICATE KEY UPDATE ");
71+
for (int i = 0; i < columnNames.size(); i++) {
72+
if (i > 0) onUpdateQuery.append(", ");
73+
onUpdateQuery.append(columnNames.get(i)).append(" = VALUES(").append(columnNames.get(i)).append(")");
74+
}
75+
76+
insertQuery.append(valuesQuery).append(onUpdateQuery);
77+
}
78+
79+
String finalQuery = databaseConfiguration.replacePrefix(insertQuery.toString());
80+
if (databaseConfiguration.isDebug()) {
81+
logger.info("Executing SQL: " + finalQuery);
82+
}
83+
84+
try (Connection connection = databaseConnection.getConnection();
85+
PreparedStatement preparedStatement = connection.prepareStatement(finalQuery)) {
86+
87+
int index = 1;
88+
for (Object value : values) {
89+
preparedStatement.setObject(index++, value);
90+
}
91+
92+
return preparedStatement.executeUpdate();
93+
} catch (SQLException exception) {
94+
exception.printStackTrace();
95+
return -1;
96+
}
97+
}
98+
}

0 commit comments

Comments
 (0)