samedi 3 avril 2010

MySQL & Java

Dans le cadre de mes apprentissages fanfrelesques, j'ai dû installer un serveur MySQL, créer un utilisateur, créer une base de données, créer une table, la formatter, la remplir de données, puis extraire ces données en me connectant à la base depuis un programme Java. Yup, c'était fastidieux.


Créer la base de données

CREATE DATABASE IF NOT EXISTS db_test;
USE db_test;



Créer la table members

CREATE TABLE members
(
userID MEDIUMINT NOT NULL AUTO_INCREMENT,
username VARCHAR(12) NOT NULL UNIQUE,
password CHAR(40) NOT NULL,
creationdate DATE,
email VARCHAR(25),
CONSTRAINT db_test_pk PRIMARY KEY (userID)
);



Remplir la table

INSERT INTO members
(username, password, creationdate, email)
VALUES
("seigneur", SHA1("motdepasse"), CURRENT_DATE,
"seigneur101@gmail.com");

INSERT INTO members
(username, password, creationdate, email)
VALUES
("ezox00", SHA1("bananemolle"), CURRENT_DATE, "donk@gmail.com");



Table

SELECT * FROM members;






Accéder à la base de données depuis Java

Okay, ça c'est vraiment de la marde. Il faut utiliser un pilote JDBC (Java Database Connectivity) créé par MySQL. J'ai dû télécharger ça sur le site de MySQL et le mettre dans le CLASSPATH de mon projet (je vous épargne les détails). Avec un code qui ressemble à ce qui suit, je me connecte à la base de données db_test:

Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost/db_test", "seigneur", "mdp");


À partir de là, je peux me créer plein d'objets me permettant d'extraire des données, d'en rajouter, de les modifier, etc. Le tout se fait avec un mélange de Java et de SQL. Par exemple, j'ai créé un truc pour se connecter à un compte en utilisant le nom d'utilisateur et le mot de passe crypté dans la table. J'extrais le nom d'utilisateur, le e-mail et la date de création du compte, puis je les affiche à l'écran (simplement pour les besoins de la cause).

La requête est la suivante:

"SELECT username, email, creationdate FROM members
WHERE username = ? AND password = SHA1(?)"


Les '?' signifient que je vais fournir ces valeurs plus tard (i.e. lors de l'appel de la requête, après que les champs aient été remplis). La fonction SHA1() sert à crypter le mot de passe. Techniquement, les mots de passes sont cryptés dans la table et ne peuvent pas être décryptés, alors je fais l'opération inverse: je crypte le mot de passe fourni et je vérifie que le code de cryptage est bel et bien le même.

Si la requête me retourne un résultat, il sera unique car j'ai spécifié que chaque nom d'utilisateur doit être unique dans la table (username VARCHAR(12) NOT NULL UNIQUE). J'utilise ce résultat pour remplir les étiquettes de la fenêtre (e-mail & compagnie). Sinon, j'imprime un message qui dit que la combinaison username / password est incorrecte.

Au passage, je soulignerai que j'ai appris à me servir des JPasswordField de Java. :)





Aucun commentaire: