Database verbinding met Java 2

Deel 2 van de 2 over hoe je een database verbinding met Java maakt. Het wordt gedaan met een basic Microsoft Access database om de programmeer techniek te leren.

Tabel klasse

De tabel klasse is een klasse dat de database tabel in Java als een object vertegenwoordigd. In het voorbeeld gebruiken we een klanten database waarbij een klant een id,naam,product en kosten heeft. Er zijn standaard setters en getters gemaakt om ermee te werken.

package database;

/**
 * De interne representatie van de Klanten.
 * @author Jan Broos
 */
public class Klant
{
    /**
     * Interne attributen van de database
     */
    private int klantID;
    private String klantNaam;
    private String productNaam;
	private int kosten;

	/**
    * Klant constructor, stelt de interne attributen van het object in.
    * @param _klantID
    * @param _klantNaam
    * @param _productNaam
    * @param _kosten
    */
     public Klant (int _klantID, String _klantNaam, String _productNaam, int _kosten)
    {
        this.klantID = _klantID;
        this.klantNaam = _klantNaam;
        this.productNaam = _productNaam;
        this.kosten = _kosten;
    }

     /**
      * Geeft de klant ID.
      * @return klantID
      */
    public int getKlantID() {
        return klantID;
    }

    /**
     * Set de klant ID.
     * @param _klantID
     */
    public void setKlantID(int _klantID) {
        this.klantID = _klantID;
    }

    /**
     * Geeft de klantnaam.
     * @return klantNaam
     */
    public String getKlantNaam() {
        return klantNaam;
    }

    /**
     * Set de klantnaam.
     * @param _klantNaam
     */
    public void setKlantNaam(String _klantNaam) {
        this.klantNaam = _klantNaam;
    }

    /**
     * Geeft de klant directory.
     * @return klantDir
     */
    public String getProductNaam() {
        return productNaam;
    }

    /**
     * Set de klant directory.
     * @param _klantDir
     */
    public void setProductNaam(String _productNaam) {
        this.productNaam = _productNaam;
    }    

    /**
     * Geeft de program directory
     * @return programDir
     */
    public int getKosten() {
		return kosten;
	}

    /**
     * Set de program directory
     * @param programDir
     */
	public void setKosten(int _kosten) {
		this.kosten = _kosten;
	}
}

De tabel – database klasse

Hier vindt de echte koppeling plaats. Hier wordt het bovenstaande java object in de database tabel vertaald en andersom.

package database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 * De communicatie tussen het klantobject en de database.
 *
 * @author Jan Broos
 */
public class KlantDB implements DBInterface {
	private PreparedStatement selectAlleKlanten = null;
	private PreparedStatement insertKlant = null;
	private int klantID;
	private String klantNaam;
	private String productNaam;
	private int kosten;
	private ArrayList alleKlanten;
	private int count;

	/**
	 * Constructor die de PreparedStatements initialiseert en de tabel inleest.
	 *
	 * @param connection - de connectie met de database.
	 */
	public KlantDB(Connection connection) {
		alleKlanten = new ArrayList();
		try {
			selectAlleKlanten = connection.prepareStatement("SELECT * FROM "
					+ DatabaseTabellen.Tabel1);

			insertKlant = connection.prepareStatement("INSERT INTO "
					+ DatabaseTabellen.Tabel1 + " (" + KlantVeldnamen.KlantID
					+ "," + KlantVeldnamen.KlantNaam + ","
					+ KlantVeldnamen.ProductNaam + "," + KlantVeldnamen.Kosten
					+ ")" + "VALUES ( ?, ?, ?, ?)");
			haalAlleKlanten();
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
	}

	/**
	 * Haalt de klanten uit de database.
	 *
	 * @pre selectAlleKlanten is geinitialiseerd
	 * @post alleKlanten bevat de ingelezen klanten
	 */
	public void haalAlleKlanten() {
		ResultSet queryResult = null;
		alleKlanten.clear();
		try {
			queryResult = selectAlleKlanten.executeQuery();

			while (queryResult.next()) {
				alleKlanten.add(new Klant(
						queryResult.getInt(KlantVeldnamen.KlantID.toString()),
						queryResult.getString(KlantVeldnamen.KlantNaam.toString()),
						queryResult.getString(KlantVeldnamen.ProductNaam.toString()),
						queryResult.getInt(KlantVeldnamen.Kosten.toString())));
			}
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		} finally {
			try {
				queryResult.close();
			} catch (SQLException sqlException) {
				sqlException.printStackTrace();
			}
		}
	}

	/**
	 * Geeft de arrayList alleKlanten
	 *
	 * @return alleKlanten in de vorm van een ArrayList < Klant >
	 */
	public ArrayList alleKlanten() {
		return alleKlanten;
	}

	/**
	 * Voegt een nieuwe customer toe aan de database
	 *
	 * @pre het klant object is geinitialiseerd
	 * @post de hele database is opnieuw ingelezen
	 * @param klant - het klantobject.
	 */
	public void nieuweKlant(Klant klant) {
		klantID = klant.getKlantID();
		klantNaam = klant.getKlantNaam();
		productNaam = klant.getProductNaam();
		kosten = klant.getKosten();
		count = alleKlanten.size();
		try {
			insertKlant.setInt(1, klant.getKlantID());
			insertKlant.setString(2, klant.getKlantNaam());
			insertKlant.setString(3, klant.getProductNaam());
			insertKlant.setInt(4, klant.getKosten());
			insertKlant.executeUpdate();
			count++;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		haalAlleKlanten();
	}

	/**
	 * Geeft het aantal records van de database terug.
	 *
	 * @return grootte - de grootte van de arraylist van de database.
	 */
	public int getSize() {
		return alleKlanten.size();
	}
}

Afronding

Om deze klasses te gebruiken kun je een andere klasse aanmaken die met de main database klasse werkt. Het kan altijd zijn dat de code onvolledig is, in dat geval zie ik graag een reactie of email.
Regel 120 kan worden negeert bij het laatste deel code, dit is auto-html aanvulling.