diff --git a/core-java/pom.xml b/core-java/pom.xml
index d958b45807..1f5897ee2d 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -98,6 +98,13 @@
${lombok.version}
provided
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.version}
+
@@ -212,6 +219,7 @@
**/*IntegrationTest.java
**/*LongRunningUnitTest.java
**/*ManualTest.java
+ **/JdbcTest.java
true
@@ -366,6 +374,9 @@
1.7.21
1.1.7
+
+
+ 6.0.6
21.0
diff --git a/core-java/src/main/java/com/baeldung/jdbc/Employee.java b/core-java/src/main/java/com/baeldung/jdbc/Employee.java
new file mode 100644
index 0000000000..749855ca3b
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/jdbc/Employee.java
@@ -0,0 +1,51 @@
+package com.baeldung.jdbc;
+
+public class Employee {
+ private int id;
+ private String name;
+ private String position;
+ private double salary;
+
+ public Employee() {
+ }
+
+ public Employee(int id, String name, double salary, String position) {
+ this.id = id;
+ this.name = name;
+ this.salary = salary;
+ this.position = position;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(double salary) {
+ this.salary = salary;
+ }
+
+ public String getPosition() {
+ return position;
+ }
+
+ public void setPosition(String position) {
+ this.position = position;
+ }
+
+}
diff --git a/core-java/src/main/resources/log4j.properties b/core-java/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..621cf01735
--- /dev/null
+++ b/core-java/src/main/resources/log4j.properties
@@ -0,0 +1,6 @@
+log4j.rootLogger=DEBUG, A1
+
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/jdbc/JdbcTest.java b/core-java/src/test/java/com/baeldung/jdbc/JdbcTest.java
new file mode 100644
index 0000000000..ff786c7267
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/jdbc/JdbcTest.java
@@ -0,0 +1,158 @@
+package com.baeldung.jdbc;
+
+import static org.junit.Assert.*;
+
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.IntStream;
+
+import org.apache.log4j.Logger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class JdbcTest {
+
+ private static final Logger LOG = Logger.getLogger(JdbcTest.class);
+
+ private Connection con;
+
+ @Before
+ public void setup() throws ClassNotFoundException, SQLException {
+ Class.forName("com.mysql.cj.jdbc.Driver");
+
+ con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDb?noAccessToProcedureBodies=true", "user1", "pass");
+
+ Statement stmt = con.createStatement();
+
+ String tableSql = "CREATE TABLE IF NOT EXISTS employees (emp_id int PRIMARY KEY AUTO_INCREMENT, name varchar(30), position varchar(30), salary double)";
+ stmt.execute(tableSql);
+
+ }
+
+ @Test
+ public void whenInsertUpdateRecord_thenCorrect() throws SQLException {
+ Statement stmt = con.createStatement();
+
+ String insertSql = "INSERT INTO employees(name, position, salary) values ('john', 'developer', 2000)";
+ stmt.executeUpdate(insertSql);
+
+ String selectSql = "SELECT * FROM employees";
+ ResultSet resultSet = stmt.executeQuery(selectSql);
+
+ List employees = new ArrayList<>();
+
+ while (resultSet.next()) {
+ Employee emp = new Employee();
+ emp.setId(resultSet.getInt("emp_id"));
+ emp.setName(resultSet.getString("name"));
+ emp.setSalary(resultSet.getDouble("salary"));
+ emp.setPosition(resultSet.getString("position"));
+ employees.add(emp);
+ }
+
+ assertEquals("employees list size incorrect", 1, employees.size());
+ assertEquals("name incorrect", "john", employees.iterator().next().getName());
+ assertEquals("position incorrect", "developer", employees.iterator().next().getPosition());
+ assertEquals("salary incorrect", 2000, employees.iterator().next().getSalary(), 0.1);
+
+ Statement updatableStmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
+ ResultSet updatableResultSet = updatableStmt.executeQuery(selectSql);
+
+ updatableResultSet.moveToInsertRow();
+ updatableResultSet.updateString("name", "mark");
+ updatableResultSet.updateString("position", "analyst");
+ updatableResultSet.updateDouble("salary", 2000);
+ updatableResultSet.insertRow();
+
+ String updatePositionSql = "UPDATE employees SET position=? WHERE emp_id=?";
+ PreparedStatement pstmt = con.prepareStatement(updatePositionSql);
+ pstmt.setString(1, "lead developer");
+ pstmt.setInt(2, 1);
+
+ String updateSalarySql = "UPDATE employees SET salary=? WHERE emp_id=?";
+ PreparedStatement pstmt2 = con.prepareStatement(updateSalarySql);
+ pstmt.setDouble(1, 3000);
+ pstmt.setInt(2, 1);
+
+ boolean autoCommit = con.getAutoCommit();
+
+ try {
+ con.setAutoCommit(false);
+ pstmt.executeUpdate();
+ pstmt2.executeUpdate();
+ con.commit();
+ } catch (SQLException exc) {
+ con.rollback();
+ } finally {
+ con.setAutoCommit(autoCommit);
+ }
+ }
+
+ @Test
+ public void whenCallProcedure_thenCorrect() {
+
+ try {
+ String preparedSql = "{call insertEmployee(?,?,?,?)}";
+ CallableStatement cstmt = con.prepareCall(preparedSql);
+ cstmt.setString(2, "ana");
+ cstmt.setString(3, "tester");
+ cstmt.setDouble(4, 2000);
+ cstmt.registerOutParameter(1, Types.INTEGER);
+ cstmt.execute();
+ int new_id = cstmt.getInt(1);
+ assertTrue(new_id > 0);
+ } catch (SQLException exc) {
+ LOG.error("Procedure incorrect or does not exist!");
+ }
+ }
+
+ @Test
+ public void whenReadMetadata_thenCorrect() throws SQLException {
+
+ DatabaseMetaData dbmd = con.getMetaData();
+ ResultSet tablesResultSet = dbmd.getTables(null, null, "%", null);
+ while (tablesResultSet.next()) {
+ LOG.info(tablesResultSet.getString("TABLE_NAME"));
+ }
+
+ String selectSql = "SELECT * FROM employees";
+ Statement stmt = con.createStatement();
+ ResultSet resultSet = stmt.executeQuery(selectSql);
+ ResultSetMetaData rsmd = resultSet.getMetaData();
+ int nrColumns = rsmd.getColumnCount();
+ assertEquals(nrColumns, 4);
+
+ IntStream.range(1, nrColumns).forEach(i -> {
+ try {
+ LOG.info(rsmd.getColumnName(i));
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+ @After
+ public void closeConnection() throws SQLException {
+
+ Statement updatableStmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
+ ResultSet updatableResultSet = updatableStmt.executeQuery("SELECT * FROM employees");
+
+ while (updatableResultSet.next()) {
+ updatableResultSet.deleteRow();
+ }
+
+ con.close();
+ }
+
+}