Utilisation de [[https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi|DBCP2]], {{ lang:java:jdbc:commons-dbcp2-2.1.1-bin.tar.gz |Archive}}, [[http://dev.mysql.com/downloads/connector/j|JDBC]], {{ lang:java:jdbc:mysql-connector-java-5.1.40.tar.gz |Archive}}, [[http://commons.apache.org/proper/commons-pool/download_pool.cgi|Apache Pool]], {{ lang:java:jdbc:commons-pool2-2.4.2-bin.tar.gz |Archive}} et [[http://commons.apache.org/proper/commons-logging/download_logging.cgi|Apache Logging]], {{ lang:java:jdbc:commons-logging-1.2-bin.tar.gz |Archive}} ([[ide:eclipse:projet#installation_d_une_librairie|installation]]).
=====Méthode 1 : BasicDataSource et executeQuery=====
Cette méthode utilise ''executeQuery'' qui ne protège pas contre les risques d'injection. ''prepareStatement'' de la méthode 2 est préférable si la requête contient des données saisies par l'utilisateur.
package org.llgc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.dbcp2.BasicDataSource;
public class SQL1
{
public static void main (String[] args)
{
try (BasicDataSource bds = new BasicDataSource ())
{
bds.setDriverClassName ("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/elearning";
bds.setUrl (url);
bds.setUsername ("root");
bds.setPassword ("aui");
try (Connection cn = bds.getConnection (); Statement st = cn.createStatement ())
{
ResultSet rs = st.executeQuery ("SELECT * FROM civilite");
ResultSetMetaData rsmd = rs.getMetaData ();
int NbCol = rsmd.getColumnCount ();
for (int i = 1; i <= NbCol; i++)
{
System.out.print (rsmd.getColumnName (i) + "\t");
}
System.out.println ();
while (rs.next ())
{
for (int i = 1; i <= NbCol; i++)
{
System.out.print (rs.getString (i) + "\t");
}
System.out.println ();
}
}
}
catch (SQLException e)
{
e.printStackTrace ();
return;
}
}
}
Les indices dans les fonctions SQL commencent généralement à 1.
=====Méthode 2 : DriverManager et prepareStatement=====
Protection contre les risques d'injection par l'utilisation de la méthode ''prepareStatement''.
''DriverManager'' n'a besoin que de la librairie ''JBDC'' (''Connector/J'').
''DriverManager'' ne doit être utilisé qu'en test et pas en production [[https://stackoverflow.com/questions/15198319/why-do-we-use-a-datasource-instead-of-a-drivermanager|Why do we use a DataSource instead of a DriverManager?]] {{ :lang:java:jdbc:java_-_why_do_we_use_a_datasource_instead_of_a_drivermanager_-_stack_overflow_2020-04-26_9_56_44_pm_.html |Archive du 04/03/2013 le 26/04/2020}}.
package org.llgc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class SQL2
{
public static void main (String[] args)
{
try
{
Class.forName ("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException e)
{
e.printStackTrace ();
return;
}
String url = "jdbc:mysql://localhost/elearning";
try (Connection cn = DriverManager.getConnection (url, "root", "aui");
PreparedStatement pstmt = cn
.prepareStatement ("INSERT INTO civilite (LibelleCourt, LibelleLong) Values (?, ?)");)
{
pstmt.setString (1, "Pr");
pstmt.setString (2, "Président");
// Compilation au niveau serveur
pstmt.executeUpdate ();
pstmt.clearParameters ();
pstmt.setString (1, "Ch");
pstmt.setString (2, "Chien");
// Méthode en cache au niveau serveur
pstmt.executeUpdate ();
}
catch (SQLException e)
{
e.printStackTrace();
return;
}
}
}
=====Méthode 3 : Un vrai modèle MVC orienté objet=====
package modeles;
public class Film {
private String titre;
private Integer annee;
public Film() {
}
public void setTitre(String leTitre) {
titre = leTitre;
}
public void setAnnee(Integer lAnnee) {
annee = lAnnee;
}
public String getTitre() {
return titre;
}
public Integer getAnnee() {
return annee;
}
}
package modeles;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestsJdbc {
private static final Integer port = 3306;
/**
* Pour communiquer avec MySQL
*/
private Connection connexion;
/**
* Constructeur sans connexion
*/
public TestsJdbc() throws ClassNotFoundException {
/* On commence par "charger" le pilote MySQL */
Class.forName("com.mysql.jdbc.Driver");
}
public void connect(String server, String bd, String u, String p) throws SQLException {
String url = "jdbc:mysql://" + server + ":" + port + "/" + bd;
connexion = DriverManager.getConnection(url, u, p);
}
public List chercheFilms() throws SQLException {
List resultat = new ArrayList();
Statement statement = connexion.createStatement();
ResultSet films = statement.executeQuery("SELECT * FROM Film");
while (films.next()) {
Film film = new Film();
film.setTitre(films.getString("titre"));
film.setAnnee(films.getInt("annee"));
resultat.add(film);
}
// Et on renvoie
return resultat;
}
}
package controleurs;
import java.io.IOException;
import java.sql.ResultSet;
import java.util.List;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import modeles.Film;
import modeles.TestsJdbc;
/**
* Servlet implementation class Jdbc
*/
@WebServlet("/jdbc")
public class Jdbc extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1353888533525324020L;
private static final String SERVER = "localhost", BD = "webscope", LOGIN = "orm", PASSWORD = "orm",
VUES = "/vues/jdbc/";
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// On devrait récupérer l'action requise par l'utilisateur
String action = request.getParameter("action");
// Notre objet modèle: accès à MySQL
TestsJdbc jdbc;
// La vue par défaut
String maVue = VUES + "index.jsp";
try {
jdbc = new TestsJdbc();
if (action == null) {
// Rien à faire
} else if (action.equals("requete")) {
jdbc.connect(SERVER, BD, LOGIN, PASSWORD);
List resultat = jdbc.chercheFilmsC();
request.setAttribute("films", resultat);
maVue = "/vues/jdbc/films.jsp";
}
} catch (Exception e) {
maVue = VUES + "exception.jsp";
request.setAttribute("message", e.getMessage());
}
// On transmet à la vue
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(maVue);
dispatcher.forward(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
Liste des films
Liste des films
Accueil
=====Via ressource coté serveur Tomcat=====
Dans le but de ne pas mettre en dur dans le code applicatif l'utilisateur et le mot de passe ni la création d'une connexion à la base de données pour chaque utilisateur (mais une seule mutualisée entre tous les clients). La donnée sera alors stockée coté serveur Tomcat.
Pour cela, il est nécessaire d'avoir un projet [[ide:eclipse:projet|Web Dynamic]].
Les fichiers de configuration coté serveur :
...
...
...
...
Coté client :
package com.llgc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class Principale {
public static void f() {
Context initCtx;
try {
initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
// Look up our data source
DataSource ds = (DataSource) envCtx.lookup("jdbc/UFRIMA");
try (Connection conn = ds.getConnection(); Statement st = conn.createStatement()) {
ResultSet rs = st.executeQuery("SELECT * FROM civilite");
while (rs.next()) {
System.out.print(rs.getString("LibelleLong") + "\n");
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (NamingException e) {
e.printStackTrace();
}
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.llgc.Principale"%>
Insert title here
<% Principale.f(); %>
=====Mémo=====
====Drivers====
Liste des drivers disponibles les plus courants.
sun.jdbc.odbc.JdbcOdbcDriver
com.mysql.jdbc.Driver
oracle.jdbc.driver.OracleDriver
com.microsoft.jdbc.sqlserver.SQLServerDriver
====execute*====
''executeQuery'' : pour les requêtes qui retournent un ''ResultSet'',
''executeUpdate'' : pour les requêtes ''INSERT'', ''UPDATE'', ''DELETE'', ''CREATE TABLE'' et ''DROP TABLE'',
''execute'' : pour les procédures stockées.