[BAEL-2842] SQL JOINS (#6718)
This commit is contained in:
parent
14bf329f9f
commit
2cc1de2e39
@ -15,6 +15,12 @@
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>${postgresql.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
@ -64,6 +70,8 @@
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<postgresql.version>42.2.5.jre7</postgresql.version>
|
||||
<mysql-connector.version>8.0.15</mysql-connector.version>
|
||||
<assertj-core.version>3.10.0</assertj-core.version>
|
||||
<h2database.version>1.4.197</h2database.version>
|
||||
<commons-dbcp2.version>2.4.0</commons-dbcp2.version>
|
||||
|
@ -0,0 +1,41 @@
|
||||
package com.baeldung.jdbc.joins;
|
||||
|
||||
class ArticleWithAuthor {
|
||||
|
||||
private String title;
|
||||
|
||||
private String authorFirstName;
|
||||
|
||||
private String authorLastName;
|
||||
|
||||
public ArticleWithAuthor(String title, String authorFirstName, String authorLastName) {
|
||||
this.title = title;
|
||||
this.authorFirstName = authorFirstName;
|
||||
this.authorLastName = authorLastName;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getAuthorFirstName() {
|
||||
return authorFirstName;
|
||||
}
|
||||
|
||||
public void setAuthorFirstName(String authorFirstName) {
|
||||
this.authorFirstName = authorFirstName;
|
||||
}
|
||||
|
||||
public String getAuthorLastName() {
|
||||
return authorLastName;
|
||||
}
|
||||
|
||||
public void setAuthorLastName(String authorLastName) {
|
||||
this.authorLastName = authorLastName;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package com.baeldung.jdbc.joins;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
class ArticleWithAuthorDAO {
|
||||
|
||||
private static final String QUERY_TEMPLATE = "SELECT ARTICLE.TITLE, AUTHOR.LAST_NAME, AUTHOR.FIRST_NAME FROM ARTICLE %s AUTHOR ON AUTHOR.id=ARTICLE.AUTHOR_ID";
|
||||
private final Connection connection;
|
||||
|
||||
ArticleWithAuthorDAO(Connection connection) {
|
||||
this.connection = connection;
|
||||
}
|
||||
|
||||
List<ArticleWithAuthor> articleInnerJoinAuthor() {
|
||||
String query = String.format(QUERY_TEMPLATE, "INNER JOIN");
|
||||
return executeQuery(query);
|
||||
}
|
||||
|
||||
List<ArticleWithAuthor> articleLeftJoinAuthor() {
|
||||
String query = String.format(QUERY_TEMPLATE, "LEFT JOIN");
|
||||
return executeQuery(query);
|
||||
}
|
||||
|
||||
List<ArticleWithAuthor> articleRightJoinAuthor() {
|
||||
String query = String.format(QUERY_TEMPLATE, "RIGHT JOIN");
|
||||
return executeQuery(query);
|
||||
}
|
||||
|
||||
List<ArticleWithAuthor> articleFullJoinAuthor() {
|
||||
String query = String.format(QUERY_TEMPLATE, "FULL JOIN");
|
||||
return executeQuery(query);
|
||||
}
|
||||
|
||||
private List<ArticleWithAuthor> executeQuery(String query) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
ResultSet resultSet = statement.executeQuery(query);
|
||||
return mapToList(resultSet);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<ArticleWithAuthor> mapToList(ResultSet resultSet) throws SQLException {
|
||||
List<ArticleWithAuthor> list = new ArrayList<>();
|
||||
while (resultSet.next()) {
|
||||
ArticleWithAuthor articleWithAuthor = new ArticleWithAuthor(
|
||||
resultSet.getString("TITLE"),
|
||||
resultSet.getString("FIRST_NAME"),
|
||||
resultSet.getString("LAST_NAME")
|
||||
);
|
||||
list.add(articleWithAuthor);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
@ -0,0 +1,89 @@
|
||||
package com.baeldung.jdbc.joins;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.List;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class ArticleWithAuthorDAOIntegrationTest {
|
||||
private Connection connection;
|
||||
|
||||
private ArticleWithAuthorDAO articleWithAuthorDAO;
|
||||
|
||||
@Before
|
||||
public void setup() throws ClassNotFoundException, SQLException {
|
||||
Class.forName("org.postgresql.Driver");
|
||||
connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/myDb", "user", "pass");
|
||||
articleWithAuthorDAO = new ArticleWithAuthorDAO(connection);
|
||||
Statement statement = connection.createStatement();
|
||||
String createAuthorSql = "CREATE TABLE IF NOT EXISTS AUTHOR (ID int NOT NULL PRIMARY KEY, FIRST_NAME varchar(255), LAST_NAME varchar(255));";
|
||||
String createArticleSql = "CREATE TABLE IF NOT EXISTS ARTICLE (ID int NOT NULL PRIMARY KEY, TITLE varchar(255) NOT NULL, AUTHOR_ID int, FOREIGN KEY(AUTHOR_ID) REFERENCES AUTHOR(ID));";
|
||||
statement.execute(createAuthorSql);
|
||||
statement.execute(createArticleSql);
|
||||
|
||||
insertTestData(statement);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenQueryWithInnerJoin_thenShouldReturnProperRows() {
|
||||
List<ArticleWithAuthor> articleWithAuthorList = articleWithAuthorDAO.articleInnerJoinAuthor();
|
||||
|
||||
assertThat(articleWithAuthorList).hasSize(4);
|
||||
assertThat(articleWithAuthorList).noneMatch(row -> row.getAuthorFirstName() == null || row.getTitle() == null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenQueryWithLeftJoin_thenShouldReturnProperRows() {
|
||||
List<ArticleWithAuthor> articleWithAuthorList = articleWithAuthorDAO.articleLeftJoinAuthor();
|
||||
|
||||
assertThat(articleWithAuthorList).hasSize(5);
|
||||
assertThat(articleWithAuthorList).anyMatch(row -> row.getAuthorFirstName() == null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenQueryWithRightJoin_thenShouldReturnProperRows() {
|
||||
List<ArticleWithAuthor> articleWithAuthorList = articleWithAuthorDAO.articleRightJoinAuthor();
|
||||
|
||||
assertThat(articleWithAuthorList).hasSize(5);
|
||||
assertThat(articleWithAuthorList).anyMatch(row -> row.getTitle() == null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenQueryWithFullJoin_thenShouldReturnProperRows() {
|
||||
List<ArticleWithAuthor> articleWithAuthorList = articleWithAuthorDAO.articleFullJoinAuthor();
|
||||
|
||||
assertThat(articleWithAuthorList).hasSize(6);
|
||||
assertThat(articleWithAuthorList).anyMatch(row -> row.getTitle() == null);
|
||||
assertThat(articleWithAuthorList).anyMatch(row -> row.getAuthorFirstName() == null);
|
||||
}
|
||||
|
||||
@After
|
||||
public void cleanup() throws SQLException {
|
||||
connection.createStatement().execute("DROP TABLE ARTICLE");
|
||||
connection.createStatement().execute("DROP TABLE AUTHOR");
|
||||
connection.close();
|
||||
}
|
||||
|
||||
public void insertTestData(Statement statement) throws SQLException {
|
||||
String insertAuthors = "INSERT INTO AUTHOR VALUES "
|
||||
+ "(1, 'Siena', 'Kerr'),"
|
||||
+ "(2, 'Daniele', 'Ferguson'),"
|
||||
+ "(3, 'Luciano', 'Wise'),"
|
||||
+ "(4, 'Jonas', 'Lugo');";
|
||||
String insertArticles = "INSERT INTO ARTICLE VALUES "
|
||||
+ "(1, 'First steps in Java', 1),"
|
||||
+ "(2, 'SpringBoot tutorial', 1),"
|
||||
+ "(3, 'Java 12 insights', null),"
|
||||
+ "(4, 'SQL JOINS', 2),"
|
||||
+ "(5, 'Introduction to Spring Security', 3);";
|
||||
statement.execute(insertAuthors);
|
||||
statement.execute(insertArticles);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user