diff --git a/persistence-modules/core-java-persistence-4/src/main/java/com/baeldung/querybuilder/SqlQueryBuilder.java b/persistence-modules/core-java-persistence-4/src/main/java/com/baeldung/querybuilder/SqlQueryBuilder.java new file mode 100644 index 000000000000..5afa6df11fb1 --- /dev/null +++ b/persistence-modules/core-java-persistence-4/src/main/java/com/baeldung/querybuilder/SqlQueryBuilder.java @@ -0,0 +1,103 @@ +package com.baeldung.querybuilder; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.StringJoiner; + +public class SqlQueryBuilder { + + public String buildStudentQueryUsingWhereOneEqualsOne( + String enrollmentDate, + String birthDate) { + + StringBuilder sb = + new StringBuilder( + "SELECT id, name FROM Student WHERE 1=1"); + + if (enrollmentDate != null) { + sb.append(" AND enrollment_date = ?"); + } + + if (birthDate != null) { + sb.append(" AND birth_date = ?"); + } + + return sb.toString(); + } + + + public String buildStudentQueryUsingStringBuilder( + String enrollmentDate, + String birthDate) { + + StringBuilder sb = + new StringBuilder( + "SELECT id, name FROM Student"); + + if (enrollmentDate != null) { + sb.append(" WHERE enrollment_date = ?"); + } + + if (birthDate != null) { + sb.append(" AND birth_date = ?"); + } + + return sb.toString(); + } + + public PreparedStatement createPreparedStatement( + Connection connection, + String enrollmentDate, + String birthDate) throws SQLException { + + String sql = buildStudentQueryUsingWhereOneEqualsOne( + enrollmentDate, + birthDate); + + PreparedStatement ps = + connection.prepareStatement(sql); + + int parameterIndex = 1; + + if (enrollmentDate != null) { + ps.setString(parameterIndex++, enrollmentDate); + } + + if (birthDate != null) { + ps.setString(parameterIndex++, birthDate); + } + + return ps; + } + + public String buildQueryUsingStringJoiner( + boolean includeName, + boolean includeId, + boolean includeEnrollmentDate) { + + String baseQuery = "SELECT * FROM Student"; + + StringJoiner whereClause = + new StringJoiner(" AND "); + + if (includeName) { + whereClause.add("name LIKE ?"); + } + + if (includeId) { + whereClause.add("id = ?"); + } + + if (includeEnrollmentDate) { + whereClause.add("enrollment_date = ?"); + } + + if (whereClause.length() > 0) { + return baseQuery + " WHERE " + whereClause; + } + + return baseQuery; + } + +} \ No newline at end of file diff --git a/persistence-modules/core-java-persistence-4/src/test/java/com/baeldung/querybuilder/SqlQueryBuilderUnitTest.java b/persistence-modules/core-java-persistence-4/src/test/java/com/baeldung/querybuilder/SqlQueryBuilderUnitTest.java new file mode 100644 index 000000000000..57a7ad54b04f --- /dev/null +++ b/persistence-modules/core-java-persistence-4/src/test/java/com/baeldung/querybuilder/SqlQueryBuilderUnitTest.java @@ -0,0 +1,93 @@ +package com.baeldung.querybuilder; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +class SqlQueryBuilderUnitTest { + + private final SqlQueryBuilder queryBuilder = + new SqlQueryBuilder(); + + + @Test + void givenOnlyBirthDate_whenUsingStringBuilder_thenGenerateInvalidSql() { + + String query = + queryBuilder.buildStudentQueryUsingStringBuilder( + null,"2000-01-01"); + + assertEquals( + "SELECT id, name FROM Student AND birth_date = ?", + query); + } + + + @Test + void givenNoFilters_whenUsingWhereOneEqualsOne_thenReturnBaseQuery() { + + String query = + queryBuilder.buildStudentQueryUsingWhereOneEqualsOne( + null, + null); + + assertEquals( + "SELECT id, name FROM Student WHERE 1=1", + query); + } + + @Test + void givenEnrollmentDate_whenUsingWhereOneEqualsOne_thenAppendCondition() { + + String query = + queryBuilder.buildStudentQueryUsingWhereOneEqualsOne( + "2024-01-01", + null); + + assertEquals( + "SELECT id, name FROM Student WHERE 1=1 AND enrollment_date = ?", + query); + } + + @Test + void givenAllFilters_whenUsingWhereOneEqualsOne_thenAppendAllConditions() { + + String query = + queryBuilder.buildStudentQueryUsingWhereOneEqualsOne( + "2024-01-01", + "2000-01-01"); + + assertEquals( + "SELECT id, name FROM Student WHERE 1=1 AND enrollment_date = ? AND birth_date = ?", + query); + } + + @Test + void givenSelectedFilters_whenUsingStringJoiner_thenBuildWhereClause() { + + String query = + queryBuilder.buildQueryUsingStringJoiner( + true, + false, + true); + + assertEquals( + "SELECT * FROM Student WHERE name LIKE ? AND enrollment_date = ?", + query); + } + + @Test + void givenNoFilters_whenUsingStringJoiner_thenReturnBaseQuery() { + + String query = + queryBuilder.buildQueryUsingStringJoiner( + false, + false, + false); + + assertEquals( + "SELECT * FROM Student", + query); + } + +} \ No newline at end of file