# Zugriff auf Datenbank aus Java über mariadb



## Beginner22 (31. Dez 2021)

Hallo,
ich bin leider absolut festgefahren und weiß nicht mehr weiter.
Im Studium muss ich im Datenbankenmodul über Java auf eine Datenbank zugreifen.

Code für den Zugriff auf ein Datenbank, die sich in einem extra Fenster öffnet und da Bearbeiten (Hinzufügen, Ändern, Löschen) lässt ist vorhanden. Ebenso wie alle Unterklassen.
Meine Aufgabe wäre das Erstellen der nötigen Tabellen in phpmyAdmin und der Zugriff über Java auf die Datenbank.

Theoretisch kann ich noch etlichen Malen der Neuinstallation und dem Zurücksetzen meines Laptops zumindest endlich aus dem Java Programm heraus endlich die Datenbank auf der extra Seite öffnen.
Der Zugriff auf phpmyAdmin läuft einfach nicht.
Eigentlich habe ich alle Schritte in dem Skript genau so verfolgt und alles eingestellt, dass es laufen sollte. Es läuft aber garnicht. Also Fehler definitiv bei mir. Ich weiß aber nicht wo.


Ist hier jemand, der mir dabei helfen könnte ?
Eventuell die Grundeinstellung nochmal erklären könnte ? Ich denke, dass es daran schon scheitert.
Wenn ich die Datei über RUN AS -> Run on Server laufen lasse bekomme ich keine Rückmeldung in der Console, die es theoretisch geben müsste.


Ich arbeite mit : 
Java jdk 17.0.1
Eclipse IDE for Enterprise Java and WEB Developers
Tomcat 10.0 (empfohlen war 8.5 (damit lief garnichts)
mariadb-java-client 2.7.3
mariadb 10.6.5
Xampp

Google hat mir überhaupt garnicht geholfen.


Code Anfang zum Verbinden
[CODE lang="java" title="SQLDatabase Verbindung"]package database;

import java.util.List;
import model.Person;
import model.Projekt;
import model.Projektmitarbeit;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class test
 */
@WebServlet("/SQLDatabase")
public class SQLDatabase extends HttpServlet {

    private Connection con = null;
    private String dbAdresse = "localhost";
    private String dbInstanz = "ea3";
    private static SQLDatabase db;
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public SQLDatabase() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }


    /**
     * main Methode.
     *
     * @param s - not used
     *
     * @throws Exception
     */
    public static void main(String[] s) throws Exception {
        db = new SQLDatabase();
        db.verbinden("Tamina", "2953");
        db.verbindungAnalysieren();

        db.getPersonal("Nr", "0*");
        db.getProjekte("Nr");
        db.verbindungTrennen();
    }

    /**
     * Methode zum Verbinden mit der Datenbank.
     *
     * @param nutzer - Nutzername der Datenbank
     * @param passwort - Passwort des Nutzers
     *
     * @throws ReflectiveOperationException
     */
    public void verbinden(String nutzer, String passwort) throws ReflectiveOperationException {
        try {
            Class.forName("org.mariadb.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mariadb://" + dbAdresse + "/" + dbInstanz, nutzer, passwort);
        } catch (SQLException e) {
            ausnahmeAusgeben(e);

        }
    }

    /**
     * Methode zum Ausgeben der geworfenen Ausnahmen.
     *
     * @param e - SQLAusnahme
     */
    private void ausnahmeAusgeben(SQLException e) {
        while (e != null) {
            System.err.println("Fehlercode: " + e.getErrorCode());
            System.err.println("SQL State: " + e.getSQLState());
            System.err.println(e);
            e = e.getNextException();
        }
    }

    /**
     * Methoden zum Trennen der Verbindung zur Datenbank.
     *
     */
    public void verbindungTrennen() {
        if (con == null) {
            System.out.println("keine Verbindung vorhanden");
            return;
        }
        try {
            con.close();
        } catch (SQLException e) {
            ausnahmeAusgeben(e);
        }
    }


    public void verbindungAnalysieren() {

        if (con == null) {
            System.out.println("keine Verbindung vorhanden");
            return;
        }

        try {
            DatabaseMetaData dbmd = con.getMetaData();
            System.out.println("DB-Name: " + dbmd.getDatabaseProductName()
              + "\nDB-Version: " + dbmd.getDatabaseMajorVersion()
              + "\nDB-Release: " + dbmd.getDriverMinorVersion()
              + "\nTransaktionen erlaubt: " + dbmd.supportsTransactions()
              + "\nbeachtet GroßKlein: " + dbmd.storesMixedCaseIdentifiers()
              + "\nunterstützt UNION: " + dbmd.supportsUnion()
              + "\nmax. Prozedurname: " + dbmd.getMaxProcedureNameLength());
        } catch (SQLException e) {
            ausnahmeAusgeben(e);
        }
    }[/CODE]

Ich schätze ich habe ebenfalls Fehler in den .jsp Dateien, die vorher mitgegeben wurden ? 
Das sind insgesamt aber mehr als 12 Dateien. Vielleicht kann ich die jemanden als Zip Datei zukommen lassen, der dort einmal drüber schaut. 


Liebe Grüße und schonmal einen guten Rutsch !


----------



## Oneixee5 (31. Dez 2021)

Beginner22 hat gesagt.:


> Ich arbeite mit :
> Java jdk 17.0.1
> Eclipse IDE for Enterprise Java and WEB Developers
> Tomcat 10.0 (empfohlen war 8.5 (damit lief garnichts)
> ...


Zunächst kann ich einiges nicht nachvollziehen. Du schreibst, dass du mit XAMPP arbeitest. Ich gehe mal davon aus, dass du Windows verwendest. Die Installation von XAMPP enthält bereits die Installation von MariaDB und phpmyAdmin. Nach der Installation von XAMPP sollte das also schon mal funktionieren. Weiterhin sollte XAMPP 8.1.1 auch einen Tomcat 8.5.73 enthalten. Ich gehe davon aus, dass bei richtiger Installation auch dieser funktioniert. Für die Installation ist auch ein grafischer Installer verfügbar und die einzelnen Komponenten sind nach der Installation als Dienste verfügbar und lassen sich per XAMPP bequem starten und stoppen. Skripte sind hier erst mal noch gar nicht notwendig.
Weiterhin würde ich die Installation erst mal in VirtualBox o.ä. testen um mir nicht unnötig meine Maschine zu versauen. 
Falls du keine Windows-Lizenz für VirtualBox besitzt kannst du auch Linux verwenden. Es würde sich auch anbieten die gesamte Entwicklung in der VM durchzuführen. Der Vorteil ist, dass du eine VM wie ein Notebook einfach weitergeben kannst. Nachteil ist, dass eine VM etwas langsamer als ein echter PC ist.


----------



## Oneixee5 (31. Dez 2021)

Beginner22 hat gesagt.:


> Code Anfang zum Verbinden


Was dann folgt ist unbrauchbar. Die Datenbankverbindung wird im Tomcat eingerichtet: https://tomcat.apache.org/tomcat-8.5-doc/jndi-datasource-examples-howto.html. MySQL und MariaDB sind da etwa gleich zu handhaben. Im Java-Teil also JSP's und Servlets wird diese dann als Datasource verwendet.


----------



## M.L. (31. Dez 2021)

Weiterhin *könnten* die zu neue Java-Version sowie Teile der Verbindung zur DB Probleme bereiten (legacy way), siehe https://mariadb.com/kb/en/about-mariadb-connector-j/#getting-a-new-connection.  Und neben VirtualBox kann man sich "Docker" anschauen.


----------

