Przykład aplikacji Java zapisującej do bazy danych MariaDB

Opis aplikacji

Moja autorska aplikacja JavaWriteMariadbExample to prosty przykład zapisu do bazy danych MariaDB z aplikacji w języku Java. Bazuje na  bazie danych i tabeli przygotowanej wg. wpisu na stronie https://itadmin.vblog.ovh/proxmox-instalacja-i-konfiguracja-mariadb-na-ubuntu-22-04/ dlatego warto wcześniej je przygotować zanim uruchomimy aplikację. Aplikacja wykorzystuje zmienne środowiskowe ustawione w systemie operacyjnym lub zdefiniowane jako parametry dla obrazu Docker bądź w configmapie dla projektu aplikacji w OpenShift.

Kod źródłowy aplikacji

nazwa pliku java musi być dokładnie taka sama jak nazwy klasy public czyli w tym przypadku JavaWriteMariadbExample.java

W wybranym katalogu np. /home/dockeruser/java/javawritemariadbexample/ umieszczamy 3 pliki:

  • JavaWriteMariadbExample.java
  • Manifest.txt
  • mariadb-java-client-3.1.2.jar
import java.util.*;
import java.net.InetAddress;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.sql.*;

public class JavaWriteMariadbExample {

    public static void main(String[] args) {

        try {
                System.out.println("--------------- Application settings ---------------");

                // check the environment variables needed for the application
                String cf_mariadb_server = System.getenv("CF_MARIADB_SERVER");
                if (cf_mariadb_server == null) {
                        System.err.println("CF_MARIADB_SERVER environment variable is not defined ! Exiting.");
                        System.exit(0);
                } else {
                        System.out.println("CF_MARIADB_SERVER:" + cf_mariadb_server);
                }
                // check the environment variables needed for the application
                String cf_mariadb_database = System.getenv("CF_MARIADB_DATABASE");
                if (cf_mariadb_database == null) {
                        System.err.println("CF_MARIADB_DATABASE environment variable is not defined ! Exiting.");
                        System.exit(0);
                } else {
                        System.out.println("CF_MARIADB_DATABASE:" + cf_mariadb_database);
                }
                // check the environment variables needed for the application
                String cf_mariadb_user = System.getenv("CF_MARIADB_USER");
                if (cf_mariadb_user == null) {
                        System.err.println("CF_MARIADB_USER environment variable is not defined ! Exiting.");
                        System.exit(0);
                } else {
                        System.out.println("CF_MARIADB_USER:" + cf_mariadb_user);
                }
                // check the environment variables needed for the application
                String cf_mariadb_pass = System.getenv("CF_MARIADB_PASS");
                if (cf_mariadb_pass == null) {
                        System.err.println("CF_MARIADB_PASS environment variable is not defined ! Exiting.");
                        System.exit(0);
                } else {
                        System.out.println("CF_MARIADB_PASS:" + cf_mariadb_pass);
                }
                // check the environment variables needed for the application
                String cf_insert_interval = System.getenv("CF_INSERT_INTERVAL");
                if (cf_insert_interval == null) {
                        cf_insert_interval = "30";
                        System.err.println("CF_INSERT_INTERVAL environment variable is not defined ! set cf_insert_interval for " + cf_insert_interval + " seconds");
                } else {
                        System.out.println("CF_INSERT_INTERVAL:" + cf_insert_interval);
                }

                // Database address and credentials
                String DB_URL = "jdbc:mariadb://" + cf_mariadb_server + ":3306/" + cf_mariadb_database;
                String USER = cf_mariadb_user;
                String PASS = cf_mariadb_pass;

                // Get network settings
                String SystemName = InetAddress.getLocalHost().getHostName();
                System.out.println("Hostname: " + SystemName);
                InetAddress iAddress = InetAddress.getLocalHost();
                String currentIp = iAddress.getHostAddress();
                System.out.println("Current IP address : " + currentIp);

                int counter = 1;
                int oper_stat = 0;
                int operation_status;

                do {
                        // generate operation status 0/1
                        if (oper_stat % 2 == 0) {
                                operation_status = 1;
                        } else {
                                operation_status = 0;
                        }
                        oper_stat = oper_stat + 1;

                        // generate random number from 10000 to 99999
                        int min = 10000; // Minimum value
                        int max = 99999; // Maximum value
                        Random random = new Random();
                        int randomNumber = random.nextInt(max - min + 1) + min;

                        // generate random description
                        String[] descriptions = {"Java to wysokopoziomowy język programowania", "Java jest najczęściej używana w backendowych systemach aplikacji internetowych", "Java to język programowania i platforma do tworzenia oprogramowania komputerowego wprowadzona przez firme Sun Microsystems"};
                        int min_array = 0;
                        int max_array = descriptions.length;
                        Random randomArray = new Random();
                        int randomIndex = randomArray.nextInt(descriptions.length);

                        System.out.println("-------------------- " + counter + " -------------------------");

                        // Establish the database connection
                        Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);

                        LocalDateTime now = LocalDateTime.now();
                        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                        String formatDateTime = now.format(format);
                        System.out.println("Current datetime:" + formatDateTime);

                        // Create the SQL query
                        String sql = "INSERT INTO clipboard (app_date,hostname,description,rand_number,operation_status) VALUES (?, ?, ?, ?, ?)";

                        // Create a PreparedStatement object to execute the query
                        PreparedStatement statement = conn.prepareStatement(sql);

                        // Set the values for the parameters
                        statement.setString(1, formatDateTime);
                        statement.setString(2, SystemName);
                        statement.setString(3, descriptions[randomIndex]);
                        statement.setInt(4, randomNumber);
                        statement.setInt(5, operation_status);

                        // Execute the query
                        int rowsInserted = statement.executeUpdate();

                        if (rowsInserted > 0) {
                                System.out.println("description:" + descriptions[randomIndex]);
                                System.out.println("rand_number:" + randomNumber);
                                System.out.println("operation_status:" + operation_status);
                                System.out.println("A new row has been inserted successfully.");
                        }

                        // Close the resources
                        statement.close();
                        conn.close();

                        // set a delay in wrting to the database
                        int insert_interval = Integer.parseInt(cf_insert_interval);
                        Thread.sleep(insert_interval*1000);

                        counter = counter + 1;

                } while (true);

        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Manifest-Version: 1.0
Main-Class: JavaWriteMariadbExample
Class-Path: mariadb-java-client-3.1.2.jar

3-ci plik mariadb-java-client-3.1.2.jar pobieramy np. ze strony https://dbschema.com/drivers/mariadb-jdbc-driver.html

Przygotowanie aplikacji do uruchomienia

Zanim uruchomimy aplikację w konsoli należy ustawić odpowiednie zmienne środowiskowe w systemie Linux.

export CF_MARIADB_DATABASE=docker_dba
export CF_MARIADB_SERVER=192.168.30.40
export CF_MARIADB_USER=docker_usr
export CF_MARIADB_PASS=Hdbryu3te72,
export CF_INSERT_INTERVAL=15
# kompilacja aplikacji
cd /home/dockeruser/java/jawawritemariadbexample/
javac -cp ./mariadb-java-client-3.1.2.jar JavaWriteMariadbExample.java

# próbne uruchomienie
java -cp ./mariadb-java-client-3.1.2.jar JavaWriteMariadbExample.java
--------------- Application settings ---------------
CF_MARIADB_SERVER:192.168.30.40
CF_MARIADB_DATABASE:docker_dba
CF_MARIADB_USER:docker_usr
CF_MARIADB_PASS:Hdbryu3te72,
CF_INSERT_INTERVAL environment variable is not defined ! set cf_insert_interval for 30 seconds
Hostname: docker.netapps.ovh
Current IP address : 127.0.1.1
-------------------- 1 -------------------------
Current datetime:2023-06-29 16:58:14
description:Java to wysokopoziomowy język programowania
rand_number:32367
operation_status:1
A new row has been inserted successfully.

# CTRL +C przerywamy działanie programu

Przygotowanie aplikacji do dystrybucji

# przygotowanie pakietu dystrybucyjnego czyli jednego pliku jar zawierającego wszystkie potrzebne klasy
jar cfmv JavaWriteMariadbExampleApp.jar Manifest.txt JavaWriteMariadbExample.class

# uruchomienie aplikacji z pakietu dystrybucyjnego
java -jar JavaWriteMariadbExampleApp.jar