Insérer et récupérer une image à partir d’une base de données MySQL – Java
Dans ce tutoriel nous allons découvrir comment insérer et récupérer une image à partir d’une table de base de données MySQL à l’aide de Java. La plupart du temps, les images sont stockées dans des répertoires et stockent le chemin des images dans des tables de base de données. mais dans certains scénarios, nous devons insérer les images dans des tables de base de données au format binaire.
Pré-requis :
- Téléchargez et installez JDK sur votre système.
- Téléchargez et installez le serveur MySql.
- Téléchargez le connecteur(mysql-connector-java-5.1.49.zip) ou les pilotes MySQL pour utiliser MySQL avec Java.
La première chose à faire est de mettre en place notre base de données.
Créer une base de données appelée « test ». Dans la base de données « test », ajoutez une table appelée « image ». La table image prendra les trois champs suivants.
- id
- size
- image
Vous pouvez créer ceci en utilisant un client MySQL comme PHPMyAdmin.
Ou vous pouvez le créer sur l’invite de commande MySQL en utilisant le script SQL suivant :
CREATE TABLE `image` ( `id` varchar(45) DEFAULT NULL, `size` int(11) DEFAULT NULL, `image` longblob );
Dans MySQL, lorsque nous utilisons le type blob pour stocker les données, il ne supporte que 5 ko comme capacité d’image. cela dépend du SGBD. selon certains SGBD, le type d’objet blob prend en charge une grande capacité.
Insérer l’image dans la base de données:
import java.sql.*; import java.io.*; public class InsertImg { public static void main(String[] args) { //URL de connexion String url = "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false"; //L'utilisateur String user = "root"; //Mot de passe String password = ""; try{ //créer la chaîne de connexion à la base de données Connection con = DriverManager.getConnection(url, user, password); //objet pour créer la requête Statement st = con.createStatement(); //l'image à insérer File file = new File("test.png"); FileInputStream input = new FileInputStream(file); //creation de la requête PreparedStatement ps = con.prepareStatement("insert into Image values(?,?,?)"); //id ps.setString(1,"img001"); //size ps.setInt(2,99); //image ps.setBinaryStream(3,(InputStream)input,(int)file.length()); //exécution de la requête ps.executeUpdate(); System.out.println("Image insérée avec succès!"); //fermer le preparedStatement ps.close(); //fermer la connexion con.close(); }catch (Exception e){ System.out.println(e.getMessage()); } } }
Compiler et exécuter le programme:
Vous pouvez exécuter le code ci-dessus en ligne de commande(CMD):
> javac InsertImg.java > java -cp .;lib/mysql-connector-java-5.1.49.jar InsertImg
Télécharger le fichier mysql-connector-java-5.1.49.jar et mettez-le dans le dossier lib de votre projet.
Résultat sur PHPmyAdmin:
Récupérer l’image à partir de la base de données:
import java.sql.*; import java.io.*; public class SelectImg { public static void main(String[] args) { //URL de connexion String url = "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false"; //L'utilisateur String user = "root"; //Mot de passe String password = ""; try{ //créer la chaîne de connexion à la base de données Connection con = DriverManager.getConnection(url, user, password); //objet pour créer la requête Statement st = con.createStatement(); //exécution de la requête ResultSet rs = st.executeQuery("SELECT image FROM Image"); int i = 0; while (rs.next()) { InputStream input = rs.getBinaryStream(1); //créer l'image dans le répertoir courant OutputStream output = new FileOutputStream(new File("test"+i+".jpg")); i++; int b = 0; while ((b = input.read()) > -1) { output.write(b); } //fermer le OutputStream output.close(); //fermer le InputStream input.close(); } //fermer la connexion con.close(); }catch (Exception e){ System.out.println(e.getMessage()); } } }
Compiler et exécuter le programme:
> javac SelectImg.java > java -cp .;lib/mysql-connector-java-5.1.49.jar SelectImg
Afficher l’image stockée dans la base de données dans un JFrame:
import java.awt.*; import java.sql.*; import javax.swing.*; public class ShowMyImage extends JFrame { public ShowMyImage() { super("Afficher une image à partir d’une BD MySQL"); setSize(300, 300); //récupérer la connexion Connection con = getConnection(); try { //creation et exécution de la requête PreparedStatement statement = con.prepareStatement("SELECT image FROM Image WHERE id = 'img001'"); ResultSet res = statement.executeQuery(); //récupérer l'image sous forme d'octet byte[] image = null; while (res.next()) { image = res.getBytes("image"); } //créer l'image Image img = Toolkit.getDefaultToolkit().createImage(image); ImageIcon icone = new ImageIcon(img); JLabel l = new JLabel(); l.setIcon(icone); add(l); } catch (SQLException e) { e.printStackTrace(); } setVisible(true); } public Connection getConnection() { String url = "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false"; //L'utilisateur String user = "root"; //Mot de passe String password = ""; //initialiser la connexion Connection con = null; try { //créer la chaîne de connexion à la base de données con = DriverManager.getConnection(url, user, password); } catch (Exception e) { System.out.println("Erreur de connexion: "+ e); } return con; } public static void main(String[] args) { new ShowMyImage(); } }
Compiler et exécuter le programme:
> javac ShowMyImage.java > java -cp .;lib/mysql-connector-java-5.1.49.jar ShowMyImage
Sortie: