[junit][MySQL] JDBC encapsulation
Bonjour,
Pour tester une connexion à une base de donnees, j'ai ecrit un code où l'objet 'Connection' est déclaré private dans une classe 'JdbcModel'
encapsulante. Cette classe definit une méthode 'searchEmpTBC' (Employee basique) où un objet ResultSet est déclaré.
Question: cette méthode est elle une bonne façon de faire? Elle compile mais j'ai du corriger plusieurs erreur de la variable 'Connection' qui ne pouvait pas être definie comme static à l'extérieur de la classe.
A suivre
Voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package com.javatpoint.models;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
import java.sql.*;
import com.javatpoint.models.Emp;
public class JdbcModel { // extends HttpServlet { // in the future
// Jdbc connection parameters
private static final Integer port=3306;
private String server;
private String db;
private String login;
private String password;
public JdbcModel(String server, String db, String login, String password) {
super();
// this.port = port;
this.server = server;
this.db = db;
this.login = login;
this.password = password;
}
public int getPort() { // to demonstrate a very simple junit test
return (int) port;
}
private Connection connection;
// procedure that connect to the DB
public void connect() throws SQLException
{
String url="jdbc:mysql://"+server+":"+port+"/"+db; // the database address
connection = DriverManager.getConnection(url, login, password);
}
// procedure that perform a stmt.executeQuery search for a particular name but w/o presentation work
// which is bad practice
public List<Emp> searchEmpTBC(String empname) throws SQLException
{..}
} // end class
Merci d'avance |
vers une interface contrat
Bonjour et merci pour le retour, je suis preneur.
Si je vous suis bien il existe une interface contrat avec un pattern Configuration de BDD (architecture au choix)
et l'appel de ses méthodes sur l'objet Connection JDBC permet d'actualiser la connection en fonction du choix retenu.
Code:
1 2 3 4 5 6
|
public ExecuteFichiersSQL(File folderSQL, IDatabaseConfiguration configuration) {
this.folderSQL = folderSQL;
this.configuration = configuration;
mapExecution = new TreeMap<>();
} |
Et plus interessant, le dernier code montre que l'on peut separer le code sql pur JDBC du programme (executeSQLFile).
De mon coté j'ai repris votre suggestion d'interface contrat et ai écris sur l'encapsulation d'une classe Employee.java et sa version persistante via JDBC (create (le code ci-dessous, update, delete), la différence avec mon dernier programme est qu'il y a une dépendance avec la classe Employee
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
public class EmployeeManager {
Connection connection;
public EmployeeManager() {}
public void openConnection() {
ConfigurationPostgresql cfp = new ConfigurationPostgresql("localhost", "root", "xxx", "8080", "eltechdb", "");
connection = DriverManager.getConnection(cfp.getJDBCUrl(), cfp.getUser(), cfp.getPassword());
}
// create N rows in the database with Employee Object
public void saveEmployee(List<Emp> emps) {
String req = "INSERT INTO tblEmployees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES=(emp_no=:emp_no, birth_date=:birth_date, first_name=:first_name, last_name=:last_name, gender=:gender, hire_date=:hire_date);";
PreparedStatement prestmt = connection.prepareStatement(req);
while (emps.hasNext()) {
try {
theEmp = (Emp) emps.next();
prestmt.setString("emp_no", theEmp.getId());
prestmt.setString("first_name", theEmp.getFirstName());
prestmt.setString("last_name", theEmp.getLastName());
prestmt.setString("birth_date", theEmp.getBirthDate());
prestmt.setString("gender", theEmp.getGender());
prestmt.setString("hire_date", theEmp.getHireDate());
prestmt.executeUpdate();
}
catch (SQLException ex) {
System.out.println("error save Employee");
}
prestmt.close();
}
}
} |
Merci encore pour le lien vers votre projet. Ca m'aidera pour mieux separer logique et acces dao, meme si je ne suis pas sur