diff --git a/httpclient-2/pom.xml b/httpclient-2/pom.xml
index a6b2ede900..85fc1d87e7 100644
--- a/httpclient-2/pom.xml
+++ b/httpclient-2/pom.xml
@@ -43,6 +43,12 @@
${spring-boot.version}
test
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+ ${spring-boot.version}
+
diff --git a/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java b/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java
new file mode 100644
index 0000000000..9bd2f825ad
--- /dev/null
+++ b/httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/SpringWebClientUnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.httpclient.readresponsebodystring;
+
+import org.junit.Test;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+
+public class SpringWebClientUnitTest {
+ public static final String DUMMY_URL = "https://postman-echo.com/get";
+
+ @Test
+ public void whenUseWebClientRetrieve_thenCorrect() {
+ WebClient webClient = WebClient.create(DUMMY_URL);
+ Mono body = webClient.get().retrieve().bodyToMono(String.class);
+ String s = body.block();
+ System.out.println(s);
+ }
+}
diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml
index 289597adc9..8d05d2013c 100644
--- a/libraries-6/pom.xml
+++ b/libraries-6/pom.xml
@@ -123,9 +123,9 @@
- bedatadriven
- bedatadriven public repo
- https://nexus.bedatadriven.com/content/groups/public/
+ mulesoft
+ Mulesoft Repository
+ https://repository.mulesoft.org/nexus/content/repositories/public/
diff --git a/libraries-io/pom.xml b/libraries-io/pom.xml
index 2f65fd989b..0cea9ae9ac 100644
--- a/libraries-io/pom.xml
+++ b/libraries-io/pom.xml
@@ -29,6 +29,11 @@
commons-vfs2
${vfs.version}
+
+ net.lingala.zip4j
+ zip4j
+ 2.9.0
+
diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/CreateSplitZipFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/CreateSplitZipFile.java
new file mode 100644
index 0000000000..cc39bc9dd2
--- /dev/null
+++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/CreateSplitZipFile.java
@@ -0,0 +1,22 @@
+package com.baeldung.java.io.zip4j;
+
+import net.lingala.zip4j.ZipFile;
+import net.lingala.zip4j.exception.ZipException;
+import net.lingala.zip4j.model.ZipParameters;
+import net.lingala.zip4j.model.enums.EncryptionMethod;
+
+import java.io.File;
+import java.util.Arrays;
+
+public class CreateSplitZipFile {
+
+ public static void main(String[] args) throws ZipException {
+ ZipParameters zipParameters = new ZipParameters();
+ zipParameters.setEncryptFiles(true);
+ zipParameters.setEncryptionMethod(EncryptionMethod.AES);
+ ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
+ int splitLength = 1024 * 1024 * 10; //10MB
+ zipFile.createSplitZipFile(Arrays.asList(new File("aFile.txt")), zipParameters, true, splitLength);
+ zipFile.createSplitZipFileFromFolder(new File("/users/folder_to_add"), zipParameters, true, splitLength);
+ }
+}
diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractAllFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractAllFile.java
new file mode 100644
index 0000000000..10e7ddd339
--- /dev/null
+++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractAllFile.java
@@ -0,0 +1,12 @@
+package com.baeldung.java.io.zip4j;
+
+import net.lingala.zip4j.ZipFile;
+import net.lingala.zip4j.exception.ZipException;
+
+public class ExtractAllFile {
+
+ public static void main(String[] args) throws ZipException {
+ ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
+ zipFile.extractAll("/destination_directory");
+ }
+}
diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractSingleFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractSingleFile.java
new file mode 100644
index 0000000000..4cf466d02b
--- /dev/null
+++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ExtractSingleFile.java
@@ -0,0 +1,12 @@
+package com.baeldung.java.io.zip4j;
+
+import net.lingala.zip4j.ZipFile;
+import net.lingala.zip4j.exception.ZipException;
+
+public class ExtractSingleFile {
+
+ public static void main(String[] args) throws ZipException {
+ ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
+ zipFile.extractFile("aFile.txt", "/destination_directory");
+ }
+}
diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipFolder.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipFolder.java
new file mode 100644
index 0000000000..4d89e8665f
--- /dev/null
+++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipFolder.java
@@ -0,0 +1,19 @@
+package com.baeldung.java.io.zip4j;
+
+import net.lingala.zip4j.ZipFile;
+import net.lingala.zip4j.exception.ZipException;
+import net.lingala.zip4j.model.ZipParameters;
+import net.lingala.zip4j.model.enums.EncryptionMethod;
+
+import java.io.File;
+
+public class ZipFolder {
+
+ public static void main(String[] args) throws ZipException {
+ ZipParameters zipParameters = new ZipParameters();
+ zipParameters.setEncryptFiles(true);
+ zipParameters.setEncryptionMethod(EncryptionMethod.AES);
+ ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
+ zipFile.addFolder(new File("/users/folder_to_add"), zipParameters);
+ }
+}
diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipMultiFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipMultiFile.java
new file mode 100644
index 0000000000..dcb860ef92
--- /dev/null
+++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipMultiFile.java
@@ -0,0 +1,27 @@
+package com.baeldung.java.io.zip4j;
+
+import net.lingala.zip4j.ZipFile;
+import net.lingala.zip4j.exception.ZipException;
+import net.lingala.zip4j.model.ZipParameters;
+import net.lingala.zip4j.model.enums.EncryptionMethod;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+public class ZipMultiFile {
+
+ public static void main(String[] args) throws ZipException {
+ ZipParameters zipParameters = new ZipParameters();
+ zipParameters.setEncryptFiles(true);
+ zipParameters.setEncryptionMethod(EncryptionMethod.AES);
+
+ List filesToAdd = Arrays.asList(
+ new File("aFile.txt"),
+ new File("bFile.txt")
+ );
+
+ ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
+ zipFile.addFiles(filesToAdd, zipParameters);
+ }
+}
diff --git a/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipSingleFile.java b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipSingleFile.java
new file mode 100644
index 0000000000..a5f600df47
--- /dev/null
+++ b/libraries-io/src/main/java/com/baeldung/java/io/zip4j/ZipSingleFile.java
@@ -0,0 +1,21 @@
+package com.baeldung.java.io.zip4j;
+
+import net.lingala.zip4j.ZipFile;
+import net.lingala.zip4j.exception.ZipException;
+import net.lingala.zip4j.model.ZipParameters;
+import net.lingala.zip4j.model.enums.CompressionLevel;
+import net.lingala.zip4j.model.enums.EncryptionMethod;
+
+import java.io.File;
+
+public class ZipSingleFile {
+
+ public static void main(String[] args) throws ZipException {
+ ZipParameters zipParameters = new ZipParameters();
+ zipParameters.setEncryptFiles(true);
+ zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
+ zipParameters.setEncryptionMethod(EncryptionMethod.AES);
+ ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
+ zipFile.addFile(new File("aFile.txt"));
+ }
+}
diff --git a/maven-modules/host-maven-repo-example/pom.xml b/maven-modules/host-maven-repo-example/pom.xml
new file mode 100644
index 0000000000..9434e4a3b3
--- /dev/null
+++ b/maven-modules/host-maven-repo-example/pom.xml
@@ -0,0 +1,108 @@
+
+
+ 4.0.0
+
+ com.baeldung.maven.plugin
+ host-maven-repo-example
+ 1.0-SNAPSHOT
+
+ https://github.com/sgrverma23/host-maven-repo-example.git
+
+
+ github
+ 8
+ 8
+
+
+
+ https://github.com/sgrverma23/host-maven-repo-example.git
+ scm:git:git@github.com:sgrverma23/host-maven-repo-example.git
+ scm:git:git@github.com:sgrverma23/host-maven-repo-example.git
+
+
+
+
+
+ internal.repo
+ Temporary Staging Repository
+ file://${project.build.directory}/mvn-artifact
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.1.0
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+ com.github.github
+ site-maven-plugin
+ 0.12
+
+ Maven artifacts for ${project.version}
+ true
+ ${project.build.directory}
+ refs/heads/main
+
+ **/*
+
+ true
+ host-maven-repo-example
+ sgrverma23
+ github
+
+
+
+
+ site
+
+ deploy
+
+
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+ internal.repo::default::file://${project.build.directory}/mvn-artifact
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.1.0
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+
+
+ PROJECT-REPO-URL
+ https://github.com/sgrverma23/host-maven-repo-example/main
+
+ true
+ always
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/host-maven-repo-example/src/java/com/baeldung/maven/plugin/MainApp.java b/maven-modules/host-maven-repo-example/src/java/com/baeldung/maven/plugin/MainApp.java
new file mode 100644
index 0000000000..521606313c
--- /dev/null
+++ b/maven-modules/host-maven-repo-example/src/java/com/baeldung/maven/plugin/MainApp.java
@@ -0,0 +1,7 @@
+package com.baeldung.maven.plugin;
+
+public class MainApp {
+ public static void main(String[] args){
+ System.out.println("Maven Repo Add");
+ }
+}
diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml
index 0700c6e637..9fc201f46d 100644
--- a/maven-modules/pom.xml
+++ b/maven-modules/pom.xml
@@ -33,6 +33,7 @@
versions-maven-plugin
maven-printing-plugins
maven-builder-plugin
+ host-maven-repo-example
plugin-management
diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/MvcMainClass.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/MvcMainClass.java
new file mode 100644
index 0000000000..9ccd4ee74c
--- /dev/null
+++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/MvcMainClass.java
@@ -0,0 +1,24 @@
+package com.baeldung.mvc_mvp.mvc;
+
+public class MvcMainClass {
+
+ public static void main(String[] args) {
+
+ Product model = retrieveProductFromDatabase();
+ ProductView view = new ProductView();
+ model.setView(view);
+ model.showProduct();
+
+ ProductController controller = new ProductController(model);
+ controller.setName("SmartPhone");
+ model.showProduct();
+ }
+
+ private static Product retrieveProductFromDatabase() {
+ Product product = new Product();
+ product.setName("Mobile");
+ product.setDescription("New Brand");
+ product.setPrice(1000.0);
+ return product;
+ }
+}
diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/Product.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/Product.java
new file mode 100644
index 0000000000..5c44d4475a
--- /dev/null
+++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/Product.java
@@ -0,0 +1,45 @@
+package com.baeldung.mvc_mvp.mvc;
+
+public class Product {
+ private String name;
+ private String description;
+ private Double price;
+ private ProductView view;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Double getPrice() {
+ return price;
+ }
+
+ public void setPrice(Double price) {
+ this.price = price;
+ }
+
+ public ProductView getView() {
+ return view;
+ }
+
+ public void setView(ProductView view) {
+ this.view = view;
+ }
+
+ public void showProduct() {
+ view.printProductDetails(name, description, price);
+ }
+
+}
diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductController.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductController.java
new file mode 100644
index 0000000000..62cdb76f23
--- /dev/null
+++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductController.java
@@ -0,0 +1,34 @@
+package com.baeldung.mvc_mvp.mvc;
+
+public class ProductController {
+ private final Product product;
+
+ public ProductController(Product product) {
+ this.product = product;
+ }
+
+ public String getName() {
+ return product.getName();
+ }
+
+ public void setName(String name) {
+ product.setName(name);
+ }
+
+ public String getDescription() {
+ return product.getDescription();
+ }
+
+ public void setDescription(String description) {
+ product.setDescription(description);
+ }
+
+ public Double getPrice() {
+ return product.getPrice();
+ }
+
+ public void setPrice(Double price) {
+ product.setPrice(price);
+ }
+
+}
diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductView.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductView.java
new file mode 100644
index 0000000000..43f45b6df7
--- /dev/null
+++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvc/ProductView.java
@@ -0,0 +1,15 @@
+package com.baeldung.mvc_mvp.mvc;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProductView {
+ private static Logger log = LoggerFactory.getLogger(ProductView.class);
+
+ public void printProductDetails(String name, String description, Double price) {
+ log.info("Product details:");
+ log.info("product Name: " + name);
+ log.info("product Description: " + description);
+ log.info("product price: " + price);
+ }
+}
diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/MvpMainClass.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/MvpMainClass.java
new file mode 100644
index 0000000000..7d12a0142c
--- /dev/null
+++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/MvpMainClass.java
@@ -0,0 +1,22 @@
+package com.baeldung.mvc_mvp.mvp;
+
+public class MvpMainClass {
+
+ public static void main(String[] args) {
+
+ Product model = retrieveProductFromDatabase();
+ ProductView view = new ProductView();
+ ProductPresenter presenter = new ProductPresenter(model, view);
+ presenter.showProduct();
+ presenter.setName("SmartPhone");
+ presenter.showProduct();
+ }
+
+ private static Product retrieveProductFromDatabase() {
+ Product product = new Product();
+ product.setName("Mobile");
+ product.setDescription("New Brand");
+ product.setPrice(1000.0);
+ return product;
+ }
+}
diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/Product.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/Product.java
new file mode 100644
index 0000000000..315e6e69b6
--- /dev/null
+++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/Product.java
@@ -0,0 +1,32 @@
+package com.baeldung.mvc_mvp.mvp;
+
+public class Product {
+ private String name;
+ private String description;
+ private Double price;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Double getPrice() {
+ return price;
+ }
+
+ public void setPrice(Double price) {
+ this.price = price;
+ }
+
+}
diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductPresenter.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductPresenter.java
new file mode 100644
index 0000000000..2b87bdbbb5
--- /dev/null
+++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductPresenter.java
@@ -0,0 +1,40 @@
+package com.baeldung.mvc_mvp.mvp;
+
+public class ProductPresenter {
+ private final Product product;
+ private final ProductView view;
+
+ public ProductPresenter(Product product, ProductView view) {
+ this.product = product;
+ this.view = view;
+ }
+
+ public String getName() {
+ return product.getName();
+ }
+
+ public void setName(String name) {
+ product.setName(name);
+ }
+
+ public String getDescription() {
+ return product.getDescription();
+ }
+
+ public void setDescription(String description) {
+ product.setDescription(description);
+ }
+
+ public Double getProductPrice() {
+ return product.getPrice();
+ }
+
+ public void setPrice(Double price) {
+ product.setPrice(price);
+ }
+
+ public void showProduct() {
+ view.printProductDetails(product.getName(), product.getDescription(), product.getPrice());
+ }
+
+}
diff --git a/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductView.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductView.java
new file mode 100644
index 0000000000..27ccc6743d
--- /dev/null
+++ b/patterns/design-patterns-architectural/src/main/java/com/baeldung/mvc_mvp/mvp/ProductView.java
@@ -0,0 +1,15 @@
+package com.baeldung.mvc_mvp.mvp;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProductView {
+ private static Logger log = LoggerFactory.getLogger(ProductView.class);
+
+ public void printProductDetails(String name, String description, Double price) {
+ log.info("Product details:");
+ log.info("product Name: " + name);
+ log.info("product Description: " + description);
+ log.info("product price: " + price);
+ }
+}
diff --git a/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/jdbcautocommit/Person.java b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/jdbcautocommit/Person.java
new file mode 100644
index 0000000000..81c60a0db1
--- /dev/null
+++ b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/jdbcautocommit/Person.java
@@ -0,0 +1,51 @@
+package com.baeldung.jdbcautocommit;
+
+public class Person {
+
+ private Integer id;
+ private String name;
+ private String lastName;
+ private Integer age;
+
+ public Person() {
+ }
+
+ public Person(Integer id, String name, String lastName, Integer age) {
+ this.id = id;
+ this.name = name;
+ this.lastName = lastName;
+ this.age = age;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+}
diff --git a/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/jdbcautocommit/AutoCommitUnitTest.java b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/jdbcautocommit/AutoCommitUnitTest.java
new file mode 100644
index 0000000000..a3e3d8f34c
--- /dev/null
+++ b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/jdbcautocommit/AutoCommitUnitTest.java
@@ -0,0 +1,259 @@
+package com.baeldung.jdbcautocommit;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+public class AutoCommitUnitTest {
+
+ private static final String INSERT_PERSON_SQL = "INSERT INTO Person VALUES (?,?,?,?)";
+ private static final String SELECT_ALL_PEOPLE_SQL = "SELECT * FROM Person";
+ private static final String UPDATE_PERSON_AGE_BY_ID_SQL = "UPDATE Person SET age = ? WHERE id = ?";
+ private static final String DELETE_ALL_PEOPLE_SQL = "DELETE FROM Person";
+ private static final String UPDATE_PERSON_AGE_BY_NAME_SQL
+ = "UPDATE Person SET age = ? WHERE id = (SELECT id FROM Person WHERE name = ?)";
+ private static final String CREATE_PERSON_TABLE_SQL
+ = "CREATE TABLE Person (id INTEGER not null, name VARCHAR(50), lastName VARCHAR(50), age INTEGER, PRIMARY KEY (id))";
+
+ private static Connection connection1;
+ private static Connection connection2;
+
+ @BeforeAll
+ static void setup() throws SQLException {
+ connection1 = DriverManager.getConnection("jdbc:h2:mem:autocommit", "sa", "");
+ createPersonTable(connection1);
+
+ connection2 = DriverManager.getConnection("jdbc:h2:mem:autocommit", "sa", "");
+ }
+
+ @Test
+ void givenAutoCommitTrue_whenInsertAndUpdateRecord_thenDataPersistedAfterEachWithoutCommit() throws SQLException {
+
+ connection1.setAutoCommit(true);
+
+ Person person = new Person(1, "John", "Doe", 45);
+ insertPerson(connection1, person);
+
+ // no explicit commit needed here when auto-commit true
+
+ // viewed from different connection, connection2 : assert person has been persisted into
+ // the database
+ List people = selectAllPeople(connection2);
+ assertThat("person record inserted OK into empty table", people.size(), is(equalTo(1)));
+ Person personInserted = people.iterator().next();
+ assertThat("id correct", personInserted.getId(), is(equalTo(1)));
+
+ // update age for person in database
+ updatePersonAgeById(connection1, 1, 65);
+
+ // no explicit commit needed here
+
+ // viewed from connection2 : assert person's age has been updated to database
+ people = selectAllPeople(connection2);
+ Person personUpdated = people.iterator().next();
+ assertThat("updated age correct", personUpdated.getAge(), is(equalTo(65)));
+ }
+
+ @Test
+ void givenAutoCommitFalse_whenInsertCommitAndUpdateCommit_thenDataViewableAfterEachCommit() throws SQLException {
+
+ connection1.setAutoCommit(false);
+
+ Person person = new Person(1, "John", "Doe", 45);
+ insertPerson(connection1, person);
+
+ // viewed from different connection, connection2 : assert that person has not yet been
+ // persisted to database before issuing commit
+ List people = selectAllPeople(connection2);
+ assertThat("No people have been inserted into database yet", people.size(), is(equalTo(0)));
+
+ connection1.commit();
+
+ // viewed from connection2 : assert that person has been persisted to database after
+ // issuing commit
+ people = selectAllPeople(connection2);
+ assertThat("Person has been inserted into empty table after commit", people.size(), is(equalTo(1)));
+ Person personInserted = people.iterator().next();
+ assertThat("id correct", personInserted.getId(), is(equalTo(1)));
+
+ updatePersonAgeById(connection1, 1, 65);
+
+ // assert that person's age has not been updated before issuing commit
+ people = selectAllPeople(connection2);
+ Person personUpdated = people.iterator().next();
+ assertThat("person's age still 45, not updated", personUpdated.getAge(), is(equalTo(45)));
+
+ connection1.commit();
+
+ // viewed from connection2 : assert that person's age has been updated after issuing commit
+ people = selectAllPeople(connection2);
+ personUpdated = people.iterator().next();
+ assertThat("person's age updated to 65", personUpdated.getAge(), is(equalTo(65)));
+ }
+
+ @Test
+ void givenAutoCommitFalse_whenInsertAndUpdateWithCommitOnlyAtEnd_thenDataOnlyViewableAfterCommit() throws SQLException {
+
+ connection1.setAutoCommit(false);
+
+ Person person = new Person(1, "John", "Doe", 45);
+ insertPerson(connection1, person);
+
+ // viewed from different connection, connection2 : assert that person has not yet been
+ // persisted to database before issuing commit
+ List people = selectAllPeople(connection2);
+ assertThat("No people have been inserted into database yet", people.size(), is(equalTo(0)));
+
+ updatePersonAgeById(connection1, 1, 65);
+
+ // viewed from connection2 : assert that person has still not yet been
+ // persisted to database before issuing commit
+ people = selectAllPeople(connection2);
+ assertThat("No people have been inserted into database yet", people.size(), is(equalTo(0)));
+
+ connection1.commit();
+
+ // viewed from connection2 : assert that person record has been persisted to
+ // database and person's age has been updated after issuing commit
+ people = selectAllPeople(connection2);
+ Person personUpdated = people.iterator().next();
+ assertThat("person's age updated to 65", personUpdated.getAge(), is(equalTo(65)));
+ }
+
+ @Test
+ void givenAutoCommitTrue_whenUpdateWithNestedSelect_thenUpdatePersistedWithoutCommit() throws SQLException {
+
+ connection1.setAutoCommit(true);
+
+ Person person = new Person(1, "John", "Doe", 45);
+ insertPerson(connection1, person);
+
+ updatePersonAgeByName(connection1, "John", 77);
+
+ // viewed from connection2 : assert person's age has been updated correctly to database
+ // without issuing commit
+ List people = selectAllPeople(connection2);
+ Person personUpdated = people.iterator().next();
+ assertThat("updated age correct", personUpdated.getAge(), is(equalTo(77)));
+ }
+
+ @Test
+ void givenAutoCommitFalse_whenModeChangedToTrueAfterSQLUpdate_thenUpdatePersistedWithoutCommit() throws SQLException {
+
+ connection1.setAutoCommit(false);
+
+ Person person = new Person(1, "John", "Doe", 45);
+ insertPerson(connection1, person);
+ updatePersonAgeByName(connection1, "John", 77);
+
+ connection1.setAutoCommit(true);
+
+ // viewed from connection2 : assert record inserted and person's age has been updated
+ // correctly to database after auto-commit changed false -> true ... without explicit commit needed
+ List people = selectAllPeople(connection2);
+ Person personUpdated = people.iterator().next();
+ assertThat("updated age correct", personUpdated.getAge(), is(equalTo(77)));
+ }
+
+ @AfterEach
+ void deleteAllRecords() throws SQLException {
+
+ if (connection1.getAutoCommit() == false) {
+ connection1.setAutoCommit(true);
+ }
+
+ deleteAllPeople(connection1);
+ }
+
+ @AfterAll
+ static void closeConnections() throws SQLException {
+
+ connection1.close();
+ connection2.close();
+ }
+
+ private static void createPersonTable(Connection connection) throws SQLException {
+ try(Statement statement = connection.createStatement()) {
+ statement.executeUpdate(CREATE_PERSON_TABLE_SQL);
+ }
+ }
+
+ private static int insertPerson(Connection connection, Person person) throws SQLException {
+
+ try (PreparedStatement preparedStatement = connection.prepareStatement(INSERT_PERSON_SQL)) {
+
+ preparedStatement.setInt(1, person.getId());
+ preparedStatement.setString(2, person.getName());
+ preparedStatement.setString(3, person.getLastName());
+ preparedStatement.setInt(4, person.getAge());
+
+ // execute statement and return the number of rows inserted
+ return preparedStatement.executeUpdate();
+ }
+ }
+
+ private static void deleteAllPeople(Connection connection) throws SQLException {
+ try (Statement statement = connection.createStatement()) {
+ statement.execute(DELETE_ALL_PEOPLE_SQL);
+ }
+ }
+
+ private static List selectAllPeople(Connection connection) throws SQLException {
+
+ List people = null;
+
+ try (Statement statement = connection.createStatement()) {
+
+ people = new ArrayList<>();
+ ResultSet resultSet = statement.executeQuery(SELECT_ALL_PEOPLE_SQL);
+
+ while (resultSet.next()) {
+ Person person = new Person();
+
+ person.setId(resultSet.getInt("id"));
+ person.setName(resultSet.getString("name"));
+ person.setLastName(resultSet.getString("lastName"));
+ person.setAge(resultSet.getInt("age"));
+
+ people.add(person);
+ }
+ }
+
+ return people;
+ }
+
+ private static void updatePersonAgeById(Connection connection, int id, int newAge) throws SQLException {
+
+ try (PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_PERSON_AGE_BY_ID_SQL)) {
+
+ preparedStatement.setInt(1, newAge);
+ preparedStatement.setInt(2, id);
+
+ preparedStatement.executeUpdate();
+ }
+ }
+
+ private static void updatePersonAgeByName(Connection connection, String name, int newAge) throws SQLException {
+ try (PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_PERSON_AGE_BY_NAME_SQL)) {
+
+ preparedStatement.setInt(1, newAge);
+ preparedStatement.setString(2, name);
+
+ preparedStatement.executeUpdate();
+ }
+ }
+}
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index 77f3fdb625..86e496e3f8 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -58,6 +58,7 @@
spring-boot-persistence-h2
spring-boot-persistence-mongodb
spring-data-cassandra
+ spring-data-cassandra-test
spring-data-cassandra-reactive
spring-data-cosmosdb
spring-data-couchbase-2
@@ -87,7 +88,7 @@
spring-jpa-2
spring-jdbc
spring-jooq
-
+ spring-mybatis
spring-persistence-simple
diff --git a/persistence-modules/spring-data-cassandra-test/README.md b/persistence-modules/spring-data-cassandra-test/README.md
new file mode 100644
index 0000000000..cfad972cb3
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/README.md
@@ -0,0 +1,16 @@
+## Spring @DataCassandraTest
+
+### Build the Project
+```
+mvn clean install
+```
+
+### Prerequisite To Run Test
+- Docker Engine must be running on the system
+- Docker Compose must be installed
+
+### Run Tests Directly
+```
+mvn test
+```
+
diff --git a/persistence-modules/spring-data-cassandra-test/pom.xml b/persistence-modules/spring-data-cassandra-test/pom.xml
new file mode 100644
index 0000000000..f2cbc834de
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/pom.xml
@@ -0,0 +1,77 @@
+
+
+ 4.0.0
+ spring-data-cassandra-test
+ spring-data-cassandra-test
+ jar
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+ 2.5.3
+ 1.18.18
+ 4.13.0
+ 4.3.1.0
+ 1.15.3
+ 1.5.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-cassandra
+ ${spring-boot-starter-data-cassandra.version}
+
+
+
+ com.datastax.oss
+ java-driver-core
+ ${java-driver-core.version}
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+
+ com.datastax.oss
+ native-protocol
+ ${native-protocol.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.testcontainers
+ testcontainers
+ ${testcontainers.version}
+ test
+
+
+
+ org.testcontainers
+ cassandra
+ ${testcontainers.version}
+ test
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/CassandraDataTestApplication.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/CassandraDataTestApplication.java
new file mode 100644
index 0000000000..f0e6ba3c88
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/CassandraDataTestApplication.java
@@ -0,0 +1,11 @@
+package com.baeldung.spring.data.cassandra.test;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class CassandraDataTestApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(CassandraDataTestApplication.class, args);
+ }
+}
diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/api/InventoryController.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/api/InventoryController.java
new file mode 100644
index 0000000000..6c4dfe055c
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/api/InventoryController.java
@@ -0,0 +1,43 @@
+package com.baeldung.spring.data.cassandra.test.api;
+
+import com.baeldung.spring.data.cassandra.test.domain.Vehicle;
+import com.baeldung.spring.data.cassandra.test.service.InventoryService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/v1/api/inventory")
+public class InventoryController {
+ private InventoryService inventoryService;
+
+ public InventoryController(InventoryService inventoryService) {
+ this.inventoryService = inventoryService;
+ }
+
+ @GetMapping("/vehicles")
+ public List getVehicles() {
+ return this.inventoryService.getVehicles();
+ }
+
+ @PostMapping("/vehicles")
+ public void addVehicles(@RequestBody List vehicles) {
+ this.inventoryService.addVehicles(vehicles);
+ }
+
+ @PutMapping("/vehicles")
+ public void updateVehicles(@RequestBody List vehicles) {
+ this.inventoryService.updateVehicles(vehicles);
+ }
+
+ @PutMapping("/vehicles/{vin}")
+ public void updateVehicles(@PathVariable(name = "vin") String vin,
+ @RequestBody Vehicle vehicles) {
+ this.inventoryService.updateVehicle(vin, vehicles);
+ }
+
+ @DeleteMapping("/vehicles/{vin}")
+ public void removeVehicle(@PathVariable(name = "vin") String vin) {
+ this.inventoryService.deleteVehicle(vin);
+ }
+}
diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/config/CassandraConfig.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/config/CassandraConfig.java
new file mode 100644
index 0000000000..d362d67a68
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/config/CassandraConfig.java
@@ -0,0 +1,24 @@
+package com.baeldung.spring.data.cassandra.test.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.cassandra.config.AbstractCassandraConfiguration;
+
+@Configuration
+public class CassandraConfig extends AbstractCassandraConfiguration {
+ @Override
+ protected String getKeyspaceName() {
+ return "inventory";
+ }
+
+ @Override
+ public String getContactPoints() {
+ return "localhost";
+ }
+
+ @Override
+ protected String getLocalDataCenter() {
+ return "datacenter1";
+ }
+
+
+}
diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/domain/Vehicle.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/domain/Vehicle.java
new file mode 100644
index 0000000000..aa16440c83
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/domain/Vehicle.java
@@ -0,0 +1,17 @@
+package com.baeldung.spring.data.cassandra.test.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.cassandra.core.mapping.Table;
+
+@Data
+@Table("vehicles")
+@AllArgsConstructor
+public class Vehicle {
+ @Id
+ private String vin;
+ private Integer year;
+ private String make;
+ private String model;
+}
diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/repository/InventoryRepository.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/repository/InventoryRepository.java
new file mode 100644
index 0000000000..c6fe4a91fe
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/repository/InventoryRepository.java
@@ -0,0 +1,26 @@
+package com.baeldung.spring.data.cassandra.test.repository;
+
+import com.baeldung.spring.data.cassandra.test.domain.Vehicle;
+import com.datastax.oss.driver.api.core.DefaultConsistencyLevel;
+import org.springframework.data.cassandra.repository.Consistency;
+import org.springframework.data.cassandra.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface InventoryRepository extends CrudRepository {
+
+ @Query("select * from vehicles")
+ @Consistency(DefaultConsistencyLevel.LOCAL_QUORUM)
+ List findAllVehicles();
+
+ @Consistency(DefaultConsistencyLevel.LOCAL_QUORUM)
+ Optional findByVin(@Param("vin") String vin);
+
+ @Consistency(DefaultConsistencyLevel.LOCAL_QUORUM)
+ void deleteByVin(String vin);
+}
diff --git a/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/service/InventoryService.java b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/service/InventoryService.java
new file mode 100644
index 0000000000..75a198738a
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/main/java/com/baeldung/spring/data/cassandra/test/service/InventoryService.java
@@ -0,0 +1,47 @@
+package com.baeldung.spring.data.cassandra.test.service;
+
+import com.baeldung.spring.data.cassandra.test.domain.Vehicle;
+import com.baeldung.spring.data.cassandra.test.repository.InventoryRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class InventoryService {
+ private final InventoryRepository inventoryRepository;
+
+ public InventoryService(InventoryRepository inventoryRepository) {
+ this.inventoryRepository = inventoryRepository;
+ }
+
+ public List getVehicles() {
+ return this.inventoryRepository.findAllVehicles();
+ }
+
+ public Vehicle getVehicle(String vin) {
+ return this.inventoryRepository.findByVin(vin).orElse(null);
+ }
+
+ public void addVehicles(List vehicles) {
+ this.inventoryRepository.saveAll(vehicles);
+ }
+
+ public void updateVehicles(List vehicles) {
+ this.inventoryRepository.saveAll(vehicles);
+ }
+
+ public void updateVehicle(String vin, Vehicle vehicle) {
+ Vehicle existingVehicle = this.inventoryRepository.findByVin(vin)
+ .orElseThrow(() -> new RuntimeException("Vehicle not found"));
+
+ existingVehicle.setMake(vehicle.getMake());
+ existingVehicle.setYear(vehicle.getYear());
+ existingVehicle.setModel(vehicle.getModel());
+
+ this.inventoryRepository.save(existingVehicle);
+ }
+
+ public void deleteVehicle(String vin) {
+ this.inventoryRepository.deleteByVin(vin);
+ }
+}
diff --git a/persistence-modules/spring-data-cassandra-test/src/main/resources/application.yml b/persistence-modules/spring-data-cassandra-test/src/main/resources/application.yml
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/persistence-modules/spring-data-cassandra-test/src/main/resources/logback.xml b/persistence-modules/spring-data-cassandra-test/src/main/resources/logback.xml
new file mode 100644
index 0000000000..612e9cac40
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/main/resources/logback.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ %d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cassandra-test/src/test/java/com/baeldung/spring/data/cassandra/test/service/InventoryServiceLiveTest.java b/persistence-modules/spring-data-cassandra-test/src/test/java/com/baeldung/spring/data/cassandra/test/service/InventoryServiceLiveTest.java
new file mode 100644
index 0000000000..80958d01d2
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/test/java/com/baeldung/spring/data/cassandra/test/service/InventoryServiceLiveTest.java
@@ -0,0 +1,71 @@
+package com.baeldung.spring.data.cassandra.test.service;
+
+import com.baeldung.spring.data.cassandra.test.config.CassandraConfig;
+import com.baeldung.spring.data.cassandra.test.domain.Vehicle;
+import com.baeldung.spring.data.cassandra.test.repository.InventoryRepository;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.data.cassandra.DataCassandraTest;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.testcontainers.containers.DockerComposeContainer;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@DataCassandraTest
+@Import(CassandraConfig.class)
+public class InventoryServiceLiveTest {
+ @Autowired
+ private InventoryRepository repository;
+
+ private InventoryService inventoryService;
+
+ @ClassRule
+ public static DockerComposeContainer environment =
+ new DockerComposeContainer(new File("src/test/resources/compose-test.yml"));
+
+ @Before
+ public void setUp() {
+ inventoryService = new InventoryService(this.repository);
+ }
+
+ @Test
+ public void givenVehiclesInDBInitially_whenRetrieved_thenReturnAllVehiclesFromDB() {
+ List vehicles = inventoryService.getVehicles();
+ assertThat(vehicles).isNotNull();
+ assertThat(vehicles).isNotEmpty();
+ }
+
+ @Test
+ public void whenAddMoreVehiclesToDB_thenRetrievalReturnsAllVehicles() {
+ String vin1 = "ABC123";
+ String vin2 = "XYZ123";
+ List vehicles = Arrays.asList(
+ new Vehicle(vin1, 2020, "Toyota", "Camry"),
+ new Vehicle(vin2, 2019, "Honda", "Prius")
+ );
+ inventoryService.addVehicles(vehicles);
+
+ vehicles = inventoryService.getVehicles();
+ assertThat(vehicles).isNotNull();
+ assertThat(vehicles).isNotEmpty();
+ assertThat(vehicles.size()).isEqualTo(5);
+
+ Vehicle vehicle = inventoryService.getVehicle(vin1);
+ assertThat(vehicle).isNotNull();
+ assertThat(vehicle.getVin()).isEqualTo(vin1);
+
+ vehicle = inventoryService.getVehicle(vin2);
+ assertThat(vehicle).isNotNull();
+ assertThat(vehicle.getVin()).isEqualTo(vin2);
+ }
+}
diff --git a/persistence-modules/spring-data-cassandra-test/src/test/resources/bootstrap-test.cql b/persistence-modules/spring-data-cassandra-test/src/test/resources/bootstrap-test.cql
new file mode 100644
index 0000000000..6f3821ed83
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/test/resources/bootstrap-test.cql
@@ -0,0 +1,20 @@
+CREATE KEYSPACE inventory
+WITH replication = {
+ 'class' : 'NetworkTopologyStrategy',
+ 'datacenter1' : 3
+};
+
+use inventory;
+
+CREATE TABLE vehicles (
+ vin text PRIMARY KEY,
+ year int,
+ make varchar,
+ model varchar
+);
+
+consistency LOCAL_QUORUM;
+
+insert into vehicles (vin, year, make, model) values ('387KSJHFK23874GH', 2020, 'Ford', 'F-150');
+insert into vehicles (vin, year, make, model) values ('534HNDHFK23873EF', 2020, 'Honda', 'Accord');
+insert into vehicles (vin, year, make, model) values ('953TOYJEK23853DB', 2020, 'Toyota', 'Camry');
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cassandra-test/src/test/resources/compose-test.yml b/persistence-modules/spring-data-cassandra-test/src/test/resources/compose-test.yml
new file mode 100644
index 0000000000..50f0f448f6
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-test/src/test/resources/compose-test.yml
@@ -0,0 +1,79 @@
+version: '2.1'
+services:
+ cassandra1:
+ image: cassandra:3.11.10
+ hostname: cassandra1
+ networks:
+ - cassandranet
+ ports:
+ - "9042:9042"
+ environment:
+ CASSANDRA_SEEDS: "cassandra1"
+ CASSANDRA_DC: datacenter1
+ CASSANDRA_RACK: rack1
+ CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
+ healthcheck:
+ test: [ "CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces" ]
+ interval: 15s
+ timeout: 10s
+ retries: 10
+
+ cassandra2:
+ image: cassandra:3.11.10
+ hostname: cassandra2
+ networks:
+ - cassandranet
+ depends_on:
+ cassandra1:
+ condition: service_healthy
+ ports:
+ - "9043:9042"
+ environment:
+ CASSANDRA_SEEDS: "cassandra1"
+ CASSANDRA_DC: datacenter1
+ CASSANDRA_RACK: rack1
+ CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
+ healthcheck:
+ test: [ "CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces" ]
+ interval: 15s
+ timeout: 10s
+ retries: 10
+
+ cassandra3:
+ image: cassandra:3.11.10
+ hostname: cassandra3
+ networks:
+ - cassandranet
+ depends_on:
+ cassandra2:
+ condition: service_healthy
+ ports:
+ - "9044:9042"
+ environment:
+ CASSANDRA_SEEDS: "cassandra1"
+ CASSANDRA_DC: datacenter1
+ CASSANDRA_RACK: rack1
+ CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
+ healthcheck:
+ test: [ "CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces" ]
+ interval: 15s
+ timeout: 10s
+ retries: 10
+
+ cassandra-load-keyspace:
+ image: cassandra:3.11.10
+ networks:
+ - cassandranet
+ depends_on:
+ cassandra1:
+ condition: service_healthy
+ cassandra2:
+ condition: service_healthy
+ cassandra3:
+ condition: service_healthy
+ volumes:
+ - ./bootstrap-test.cql:/schema.cql
+ command: /bin/bash -c "echo loading cassandra keyspace && cqlsh cassandra1 -f /schema.cql"
+
+networks:
+ cassandranet:
\ No newline at end of file
diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml
index 9247d59fe4..1a55e76900 100644
--- a/persistence-modules/spring-mybatis/pom.xml
+++ b/persistence-modules/spring-mybatis/pom.xml
@@ -84,7 +84,7 @@
- 5.1.8.RELEASE
+ 5.3.8
2.0.2
3.5.2
diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootUnitTest.java
similarity index 82%
rename from persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java
rename to persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootUnitTest.java
index 531356ffa2..d9f757aa30 100644
--- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootIntegrationTest.java
+++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperBootUnitTest.java
@@ -8,6 +8,6 @@ import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = PersistenceAutoConfig.class)
-public class ArticleMapperBootIntegrationTest extends ArticleMapperCommonTest {
+public class ArticleMapperBootUnitTest extends ArticleMapperCommonUnitTest {
}
diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java
similarity index 94%
rename from persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java
rename to persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java
index 33071dc0c1..2a93ca3d61 100644
--- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonTest.java
+++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java
@@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import static org.assertj.core.api.Assertions.assertThat;
-class ArticleMapperCommonTest {
+class ArticleMapperCommonUnitTest {
@Autowired
ArticleMapper articleMapper;
diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperUnitTest.java
similarity index 80%
rename from persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java
rename to persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperUnitTest.java
index 9298714cb2..9c677ecee5 100644
--- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperIntegrationTest.java
+++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperUnitTest.java
@@ -6,6 +6,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = PersistenceConfig.class)
-public class ArticleMapperIntegrationTest extends ArticleMapperCommonTest {
+public class ArticleMapperUnitTest extends ArticleMapperCommonUnitTest {
}
diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLUnitTest.java
similarity index 79%
rename from persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java
rename to persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLUnitTest.java
index de8974d4ad..96c7c162c5 100644
--- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLIntegrationTest.java
+++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperXMLUnitTest.java
@@ -6,6 +6,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/beans.xml")
-public class ArticleMapperXMLIntegrationTest extends ArticleMapperCommonTest {
+public class ArticleMapperXMLUnitTest extends ArticleMapperCommonUnitTest {
}