package javacodebook.jdbc.prepared;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class PreparedStatements {

    public static void main(String[] args) {
        try {
            Class.forName("org.postgresql.Driver");
            Connection con =
                DriverManager.getConnection(
                    "jdbc:postgresql:test",
                    "postgres",
                    "postgres");

            // Initialisieren eines PreparedStatements -
            // man beachte das Fragezeichen hinter LIKE
            PreparedStatement statement =
                con.prepareStatement(
                    "SELECT firstname, lastname, salary "
                        + "FROM employees WHERE "
                        + "firstname LIKE ?");

            // Der JDBC-Treiber kümmert sich um Details wie
            // Hochkommata etc.
            statement.setString(1, "%a%");
            ResultSet result = statement.executeQuery();
            while (result.next()) {
                System.out.println(result.getString(1));
            }

            // Nochmal ein PreparedStatement mit mehreren
            // Parametern
            statement =
                con.prepareStatement(
                    "SELECT firstname, lastname "
                        + "FROM employees WHERE "
                        + "salary > ? AND firstname LIKE ?");
            statement.setString(2, "%r%");
            statement.setInt(1, 1000);
            result = statement.executeQuery();
            while (result.next()) {
                System.out.println(result.getString(1));
            }

            // Das Auswerten der Parameter eines PreparedStatement
            // ist eine gerne vernachlässigte Funktionalität - 
            // bspw. bei Postgres bis dato noch nicht implementiert
            try {

                ParameterMetaData data =
                    statement.getParameterMetaData();
                for (int i = 0;
                    i < data.getParameterCount();
                    i++) {
                    System.out.println("Parameter No. " + i + ":");
                    System.out.println(
                        "Class:" + data.getParameterClassName(i));
                    System.out.println(
                        "Nullable (0-no,1-yes,2-maybe):"
                            + data.isNullable(i));
                    System.out.println(
                        "Type:" + data.getParameterTypeName(i));
                }

            } catch (Throwable e) {
                System.out.println(
                    "PreparedStatement.getParameterMetaData() "
                        + "not supported by"
                        + " this JDBC implementation");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
