[BAEL-2842] SQL JOINS (#6718)
This commit is contained in:
parent
14bf329f9f
commit
2cc1de2e39
@ -6,15 +6,21 @@
|
||||
<version>0.1.0-SNAPSHOT</version>
|
||||
<name>core-java-persistence</name>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-java</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<relativePath>../../parent-java</relativePath>
|
||||
</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>
|
||||
@ -52,7 +58,7 @@
|
||||
<version>${springframework.boot.spring-boot-starter.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
<build>
|
||||
<finalName>core-java-persistence</finalName>
|
||||
<resources>
|
||||
@ -62,8 +68,10 @@
|
||||
</resource>
|
||||
</resources>
|
||||
</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>
|
||||
@ -72,5 +80,5 @@
|
||||
<springframework.boot.spring-boot-starter.version>1.5.8.RELEASE</springframework.boot.spring-boot-starter.version>
|
||||
<springframework.spring-web.version>4.3.4.RELEASE</springframework.spring-web.version>
|
||||
</properties>
|
||||
|
||||
|
||||
</project>
|
@ -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