diff --git a/dbunit/README.md b/dbunit/README.md
new file mode 100644
index 0000000000..383bd6fb7e
--- /dev/null
+++ b/dbunit/README.md
@@ -0,0 +1,6 @@
+### Database schema
+
+
+
+### Relevant Articles:
+- [Introduction To DBUnit](https://www.baeldung.com/dbunit)
diff --git a/dbunit/docs/db_schema.png b/dbunit/docs/db_schema.png
new file mode 100644
index 0000000000..d9185bacd2
Binary files /dev/null and b/dbunit/docs/db_schema.png differ
diff --git a/dbunit/pom.xml b/dbunit/pom.xml
new file mode 100644
index 0000000000..b77b15f2d4
--- /dev/null
+++ b/dbunit/pom.xml
@@ -0,0 +1,35 @@
+
+ 4.0.0
+ dbunit
+ 1.0
+ dbunit
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.dbunit
+ dbunit
+ ${dbunit.version}
+ test
+
+
+
+ com.h2database
+ h2
+ 1.4.197
+ test
+
+
+
+
+
+ 2.6.0
+
+
+
diff --git a/dbunit/src/main/java/com/baeldung/dbunit/.gitkeep b/dbunit/src/main/java/com/baeldung/dbunit/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/dbunit/src/main/resources/logback.xml b/dbunit/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/dbunit/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java
new file mode 100644
index 0000000000..a703863614
--- /dev/null
+++ b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java
@@ -0,0 +1,111 @@
+package com.baeldung.dbunit;
+
+import org.dbunit.Assertion;
+import org.dbunit.IDatabaseTester;
+import org.dbunit.JdbcDatabaseTester;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.ITable;
+import org.dbunit.dataset.xml.FlatXmlDataSet;
+import org.dbunit.operation.DatabaseOperation;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.ResultSet;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class OldSchoolDbUnitTest {
+ private static final String JDBC_DRIVER = org.h2.Driver.class.getName();
+ private static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'";
+ private static final String USER = "sa";
+ private static final String PASSWORD = "";
+
+ private static IDatabaseTester tester = null;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ tester = initDatabaseTester();
+ }
+
+ private static IDatabaseTester initDatabaseTester() throws Exception {
+ final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD);
+ tester.setDataSet(initDataSet());
+ tester.setSetUpOperation(DatabaseOperation.REFRESH);
+ tester.setTearDownOperation(DatabaseOperation.NONE);
+ return tester;
+ }
+
+ private static IDataSet initDataSet() throws Exception {
+ final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("data.xml");
+ return new FlatXmlDataSet(is);
+ }
+
+ @Before
+ public void setup() throws Exception {
+ tester.onSetup();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ tester.onTearDown();
+ }
+
+ @Test
+ public void testSelect() throws Exception {
+ // Arrange
+ final Connection connection = tester.getConnection().getConnection();
+
+ // Act
+ final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1");
+
+ // Assert
+ assertTrue(rs.next());
+ assertEquals("Grey T-Shirt", rs.getString("title"));
+ }
+
+ @Test
+ public void testDelete() throws Exception {
+ // Arrange
+ final Connection connection = tester.getConnection().getConnection();
+
+ final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml");
+ ITable expectedTable = (new FlatXmlDataSet(is)).getTable("items");
+ //expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"produced"});
+
+ // Act
+ connection.createStatement().executeUpdate("delete from ITEMS where id = 2");
+
+ // Assert
+ final IDataSet databaseDataSet = tester.getConnection().createDataSet();
+ ITable actualTable = databaseDataSet.getTable("items");
+ //actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"});
+
+ Assertion.assertEquals(expectedTable, actualTable);
+ }
+
+ @Test
+ public void testUpdate() throws Exception {
+ // Arrange
+ final Connection connection = tester.getConnection().getConnection();
+
+ final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml");
+ ITable expectedTable = (new FlatXmlDataSet(is)).getTable("items");
+ //expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"produced"});
+
+ // Act
+ connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1");
+
+ // Assert
+ final IDataSet databaseDataSet = tester.getConnection().createDataSet();
+ ITable actualTable = databaseDataSet.getTable("items");
+ //actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"});
+
+ Assertion.assertEquals(expectedTable, actualTable);
+ }
+
+}
diff --git a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java
new file mode 100644
index 0000000000..c3882d5eab
--- /dev/null
+++ b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java
@@ -0,0 +1,103 @@
+package com.baeldung.dbunit;
+
+import org.dbunit.*;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
+import org.dbunit.operation.DatabaseOperation;
+import org.dbunit.util.fileloader.DataFileLoader;
+import org.dbunit.util.fileloader.FlatXmlDataFileLoader;
+import org.junit.Test;
+
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.ResultSet;
+
+public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase {
+ private static final String JDBC_DRIVER = org.h2.Driver.class.getName();
+ private static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'";
+ private static final String USER = "sa";
+ private static final String PASSWORD = "";
+
+ @Override
+ public void setUp() throws Exception {
+ setDatabaseTester(initDatabaseTester());
+ setDataFileLoader(initDataFileLoader());
+ super.setUp();
+ }
+
+ private IDatabaseTester initDatabaseTester() throws Exception {
+ final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD);
+ tester.setDataSet(initDataSet());
+ tester.setSetUpOperation(DatabaseOperation.REFRESH);
+ return tester;
+ }
+
+ private IDataSet initDataSet() throws Exception {
+ final InputStream is = getClass().getClassLoader().getResourceAsStream("data.xml");
+ return new FlatXmlDataSetBuilder().build(is);
+ }
+
+ private DataFileLoader initDataFileLoader() {
+ return new FlatXmlDataFileLoader();
+ }
+
+ @Test
+ public void testSelect() throws Exception {
+ // Arrange
+ final Connection connection = getConnection().getConnection();
+ final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})};
+ final String[] prepDataFiles = {"/users.xml"};
+ final String[] expectedDataFiles = {"/users.xml"};
+ final PrepAndExpectedTestCaseSteps testSteps = () -> {
+ // invoke the method being tested here; for the sake of simplicity we use JDBC API directly in this example
+ final ResultSet rs = connection.createStatement().executeQuery("select * from USERS where id = 1");
+
+ // either place assertions here
+ //assertTrue(rs.next());
+ //assertEquals("Xavier", rs.getString("last_name"));
+
+ return rs;
+ };
+
+ // Act
+ final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps);
+
+ // or place assertions at the end
+ assertTrue(rs.next());
+ assertEquals("Xavier", rs.getString("last_name"));
+ }
+
+ @Test
+ public void testUpdate() throws Exception {
+ // Arrange
+ final Connection connection = getConnection().getConnection();
+ final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; // define tables to verify
+ final String[] prepDataFiles = {"/users.xml"}; // define prep files
+ final String[] expectedDataFiles = {"/users_exp_rename.xml"}; // define expected files
+ final PrepAndExpectedTestCaseSteps testSteps = () -> {
+ // invoke the method being tested here; for the sake of simplicity we use JDBC API directly in this example
+ return connection.createStatement().executeUpdate("update USERS set first_name = 'new name' where id = 1");
+ // after this method exits, dbUnit will:
+ // * verify configured tables
+ // * cleanup tables as configured
+ };
+
+ // Act
+ super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps);
+ }
+
+ @Test
+ public void testDelete() throws Exception {
+ // Arrange
+ final Connection connection = getConnection().getConnection();
+ final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})};
+ final String[] prepDataFiles = {"/users.xml"};
+ final String[] expectedDataFiles = {"/users_exp_delete.xml"};
+ final PrepAndExpectedTestCaseSteps testSteps =
+ () -> connection.createStatement().executeUpdate("delete from USERS where id = 2");
+
+ // Act
+ super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps);
+ }
+
+}
diff --git a/dbunit/src/test/resources/data.xml b/dbunit/src/test/resources/data.xml
new file mode 100644
index 0000000000..e4498513e0
--- /dev/null
+++ b/dbunit/src/test/resources/data.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dbunit/src/test/resources/items.xml b/dbunit/src/test/resources/items.xml
new file mode 100644
index 0000000000..04a975d7ee
--- /dev/null
+++ b/dbunit/src/test/resources/items.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/dbunit/src/test/resources/items_exp_delete.xml b/dbunit/src/test/resources/items_exp_delete.xml
new file mode 100644
index 0000000000..1aaeff59ca
--- /dev/null
+++ b/dbunit/src/test/resources/items_exp_delete.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/dbunit/src/test/resources/items_exp_rename.xml b/dbunit/src/test/resources/items_exp_rename.xml
new file mode 100644
index 0000000000..237280e758
--- /dev/null
+++ b/dbunit/src/test/resources/items_exp_rename.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/dbunit/src/test/resources/schema.sql b/dbunit/src/test/resources/schema.sql
new file mode 100644
index 0000000000..9b5018985a
--- /dev/null
+++ b/dbunit/src/test/resources/schema.sql
@@ -0,0 +1,28 @@
+CREATE TABLE IF NOT EXISTS USERS
+(
+ `id` int AUTO_INCREMENT NOT NULL,
+ `first_name` varchar(100) NOT NULL,
+ `last_name` varchar(100) NOT NULL,
+ PRIMARY KEY (`id`)
+);
+
+CREATE TABLE IF NOT EXISTS ITEMS
+(
+ `id` int AUTO_INCREMENT NOT NULL,
+ `title` varchar(100) NOT NULL,
+ `produced` date,
+ `price` float,
+ PRIMARY KEY (`id`)
+);
+
+CREATE TABLE IF NOT EXISTS PURCHASES
+(
+ `id` int NOT NULL AUTO_INCREMENT,
+ `id_user` int NOT NULL,
+ `id_item` int NOT NULL,
+ `total_price` float NOT NULL,
+ `quantity` int(11) NOT NULL,
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`id_user`) REFERENCES USERS (`id`) ON DELETE CASCADE,
+ FOREIGN KEY (`id_item`) REFERENCES ITEMS (`id`) ON DELETE CASCADE ON UPDATE CASCADE
+);
diff --git a/dbunit/src/test/resources/users.xml b/dbunit/src/test/resources/users.xml
new file mode 100644
index 0000000000..cebadf2e67
--- /dev/null
+++ b/dbunit/src/test/resources/users.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/dbunit/src/test/resources/users_exp_delete.xml b/dbunit/src/test/resources/users_exp_delete.xml
new file mode 100644
index 0000000000..8b72ceef89
--- /dev/null
+++ b/dbunit/src/test/resources/users_exp_delete.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/dbunit/src/test/resources/users_exp_rename.xml b/dbunit/src/test/resources/users_exp_rename.xml
new file mode 100644
index 0000000000..9bc1254967
--- /dev/null
+++ b/dbunit/src/test/resources/users_exp_rename.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+