Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 buildStudentQueryUsingStringConcatenation(
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;
}

}
Original file line number Diff line number Diff line change
@@ -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_whenUsingStringConcatenation_thenGenerateInvalidSql() {

String query =
queryBuilder.buildStudentQueryUsingStringConcatenation(
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);
}

}