processing & sql



Do współpracy z relacyjnymi bazami danych w Javie służy wbudowany interfejs programowania aplikacji - JDBC (Java DataBase Connectivity). W celu nawiązania połączenia z bazą, użytkownik musi zadbać o odpowiedni sterownik JDBC do swojej bazy danych. Więcej informacji o jdbc można znaleźć tutaj.

Niezależnie od rodzaju bazy danych, z jaką chcemy się połączyć, zawsze sprowadza się to do następujących kroków:
1.załadowania odpowiednich sterowników
2.nawiązania połączenia do bazy danych
3.wysłania zapytania
4.przetworzenia odpowiedzi

W przypadku SQL Servera najnowszy driver jdbc można pobrać tutaj.

W pierwszym kroku musimy załadować odpowiednią klasę tak, aby była ona dostępna podczas próby nawiązania połączenia.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();

W tym momencie jesteśmy już gotowi do nawiązania połączenia:
String url = "jdbc:sqlserver://localhost;databaseName=dbName;user=userName;password=pass;";
Connection connection = DriverManager.getConnection(url);

O tym jak odpowiednio zbudować parametr url w połączeniu z SQL Server, można poczytać tutaj.

Przed przystąpieniem do tworzenia aplikacji w processing'u dobrze jest sprawdzić sobie połączenie np w Microsoft SQL Server Management Studio Express.

Uczulam na ten moment, bo początkowo nie potrafiłem skonfigurować odpowiednio połączenia. Okazało się, że serwer był ustawiony tylko w Windows Authentication mode, a powinien być w SQL Server and Windows Authentication mode.
Jeżeli wszystko jest ok, możemy przejść dalej do tworzenia naszej aplikacji. Przypominam jeszcze o tym, że odpowiedni driver jdbc, należy umieścić w podkatalogu projektu o nazwie code.

Aplikacja w Processing - program główny:
import java.sql.ResultSet;

void setup()
{
    size( 400, 400 );
    int x = 15;
    int y = 25;
    fill(0);
    PFont metaBold;
    metaBold = loadFont("Georgia-Bold-20.vlw");
    textFont(metaBold,20); 
    
    Database db = new Database("localhost","MyTests","test2","test123");
    ResultSet rs = db.query("SELECT Name FROM Locations");
    try {
      while (rs.next( )) {
        String descr = rs.getString(1);
        text(descr,x,y);
        y = y + 25;
        println(descr);
      }
    } catch (SQLException e) {
        e.printStackTrace( );
    }
}

Klasa realizująca połączenie z bazą danych:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

class Database {
  Connection conn;
  String host;
  String user;
  String pass;
  String dbname;
  int port = 1433; //standardowy port SQL 
  
  public Database(String host, String dbname, String user, String pass) {
    this.host = host;
    this.user = user;
    this.pass = pass;
    this.dbname = dbname;
    conn = connect( );
  }

  public Connection connect( ) {
    try {
      //dla połączenia z MySql
      //Class.forName("com.mysql.jdbc.Driver").newInstance();
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
    } catch (ClassNotFoundException e) {
        e.printStackTrace( );
    } catch (InstantiationException e) {
        e.printStackTrace( );
    } catch (IllegalAccessException e) {
        e.printStackTrace( );
    }
    try {
     String url = "jdbc:sqlserver://"+host+";databaseName="+dbname+";user="+user+";password="+pass+";";
     return DriverManager.getConnection(url);
      
    } catch (SQLException e) {
        e.printStackTrace( );
        return null;
    }
  }

  public ResultSet query(String query) {
    try {
      Statement st = conn.createStatement( );
      ResultSet rs = st.executeQuery(query);
      return rs;
    } catch (SQLException e) {
        e.printStackTrace( );
        return null;
    }
  }
}

A oto rezultat:

Komentarze