Bonjour à tous, je veux afficher tout le contenu de ma table de base de données sur la page html. J'essaie d'extraire un enregistrement de la base de données d'abord et de le stocker dans ArrayList
mais lorsque je retourne une liste de tableaux sur une page html, il affiche uniquement le dernier enregistrement à plusieurs reprises en tant que nombre de ma table de base de données. . Voici le code ci-dessous:
public ArrayList<CustomerDTO> getAllCustomers()
{
ArrayList<CustomerDTO> customers = new ArrayList<CustomerDTO>();
CustomerDTO customer = null;
Connection c;
try {
c = openConnection();
Statement statement = c.createStatement();
String s = "SELECT * FROM customer";
ResultSet rs = statement.executeQuery(s);
int g =0;
while (rs.next()) {
customer.setId(rs.getInt("id"));
customer.setName(rs.getString("name"));
customer.setAddress(rs.getString("address"));
customer.setPhone(rs.getString("phone"));
customer.setEmail(rs.getString("email"));
customer.setBountPoints(rs.getInt("bonuspoint"));
customer.setTotalsale(rs.getInt("totalsale"));
customers.add(customer);
}
rs.close();
} catch (Exception e) {
System.out.println(e);
}
return customers;
}
Essayez avec le code suivant
public static ArrayList<Customer> getAllCustomer() throws ClassNotFoundException, SQLException {
Connection conn=DBConnection.getDBConnection().getConnection();
Statement stm;
stm = conn.createStatement();
String sql = "Select * From Customer";
ResultSet rst;
rst = stm.executeQuery(sql);
ArrayList<Customer> customerList = new ArrayList<>();
while (rst.next()) {
Customer customer = new Customer(rst.getString("id"), rst.getString("name"), rst.getString("address"), rst.getDouble("salary"));
customerList.add(customer);
}
return customerList;
}
c'est ma classe de modèle
public class Customer {
private String id;
private String name;
private String salary;
private String address;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
c'est ma méthode de vue
private void reloadButtonActionPerformed(Java.awt.event.ActionEvent evt) {
try {
ArrayList<Customer> customerList = null;
try {
try {
customerList = CustomerController.getAllCustomer();
} catch (SQLException ex) {
Logger.getLogger(veiwCustomerFrame.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (Exception ex) {
Logger.getLogger(ViewCustomerForm.class.getName()).log(Level.SEVERE, null, ex);
}
DefaultTableModel tableModel = (DefaultTableModel) customerTable.getModel();
tableModel.setRowCount(0);
for (Customer customer : customerList) {
Object rowData[] = {customer.getId(), customer.getName(), customer.getAddress(), customer.getSalary()};
tableModel.addRow(rowData);
}
} catch (Exception ex) {
Logger.getLogger(ViewCustomerForm.class.getName()).log(Level.SEVERE, null, ex);
}
}
Vous devez créer un nouvel objet client à chaque itération, puis ajouter cet objet nouvellement créé dans ArrayList à la fin de votre itération.
Essayez de créer une nouvelle instance de client à chaque fois, par exemple.
while (rs.next()) {
Customer customer = new Customer();
customer.setId(rs.getInt("id"));
customer.setName(rs.getString("name"));
customer.setAddress(rs.getString("address"));
customer.setPhone(rs.getString("phone"));
customer.setEmail(rs.getString("email"));
customer.setBountPoints(rs.getInt("bonuspoint"));
customer.setTotalsale(rs.getInt("totalsale"));
customers.add(customer);
}
essaye ça
import Java.sql.ResultSet;
import Java.util.ArrayList;
import com.rcb.dbconnection.DbConnection;
import com.rcb.model.Docter;
public class DocterService {
public ArrayList<Docter> getAllDocters() {
ArrayList<Docter> docters = new ArrayList<Docter>();
try {
String sql = "SELECT tbl_docters";
ResultSet rs = db.getData(sql);
while (rs.next()) {
Docter docter = new Docter();
docter.setD_id(rs.getInt("d_id"));
docter.setD_FName(rs.getString("d_fname"));
docter.setD_LName(rs.getString("d_lname"));
docters.add(docter);
}
} catch (Exception e) {
System.out.println("getAllDocters()");
e.printStackTrace();
}
return (docters);
}
public static void main(String args[]) {
DocterService ds = new DocterService();
ArrayList<Docter> doctersList = ds.getAllDocters();
String s[] = null;
for (int i = 0; i < doctersList.size(); i++) {
System.out.println(doctersList.get(i).getD_id());
System.out.println(doctersList.get(i).getD_FName());
}
}
}
Vous réutilisez la référence customer
. Java fonctionne par référence pour Obejcts. Pas pour les primitives.
Ce que vous faites est d’ajouter à la liste la même customer
puis de la modifier. Ainsi, définir les mêmes valeurs pour tous les objets. C'est pourquoi tu vois le dernier. Parce que tous sont pareils.
while (rs.next()) {
Customer customer = new Customer();
customer.setId(rs.getInt("id"));
...
while (rs.next()) {
customer.setId(rs.getInt("id"));
customer.setName(rs.getString("name"));
customer.setAddress(rs.getString("address"));
customer.setPhone(rs.getString("phone"));
customer.setEmail(rs.getString("email"));
customer.setBountPoints(rs.getInt("bonuspoint"));
customer.setTotalsale(rs.getInt("totalsale"));
customers.add(customer);
customer = null;
}
Essayez de remplacer votre code de boucle while par le code mentionné ci-dessus. Ici, ce que nous avons fait, c'est après customers.add(customer)
que nous faisons client = null; `
Si votre classe de client a des variables statiques, supprimez-les, votre classe devrait ressembler à ceci.
public class customer {
private int id;
private String name;
private String DOB;
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getDOB() {
return DOB;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setDOB(String dOB) {
this.DOB = dOB;
}
au lieu de quelque chose comme
public class customer {
private static int id;
private static String name;
private static String DOB;
public static int getId() {
return id;
}
public static String getName() {
return name;
}
public static String getDOB() {
return DOB;
}
public static void setId(int id) {
custumer.id = id;
}
public static void setName(String name) {
customer.name = name;
}
public static void setDOB(String dOB) {
customer.DOB = dOB;
}
Instead of
null,
use CustomerDTO customers =
new CustomerDTO () `;
CustomerDTO customer = null;
private static List<Author> getAllAuthors() {
initConnection();
List<Author> authors = new ArrayList<Author>();
Author author = new Author();
try {
stmt = (Statement) conn.createStatement();
String str = "SELECT * FROM author";
rs = (ResultSet) stmt.executeQuery(str);
while (rs.next()) {
int id = rs.getInt("nAuthorId");
String name = rs.getString("cAuthorName");
author.setnAuthorId(id);
author.setcAuthorName(name);
authors.add(author);
System.out.println(author.getnAuthorId() + " - " + author.getcAuthorName());
}
rs.close();
closeConnection();
} catch (Exception e) {
System.out.println(e);
}
return authors;
}
Créer un objet CustomerDTO à chaque fois dans la boucle while
Vérifiez le code ci-dessous
while (rs.next()) {
Customer customer = new Customer();
customer.setId(rs.getInt("id"));
customer.setName(rs.getString("name"));
customer.setAddress(rs.getString("address"));
customer.setPhone(rs.getString("phone"));
customer.setEmail(rs.getString("email"));
customer.setBountPoints(rs.getInt("bonuspoint"));
customer.setTotalsale(rs.getInt("totalsale"));
customers.add(customer);
}
J'essaie d'extraire un enregistrement de la base de données et le stocker dans ArrayList mais quand je retourne la liste de tableau sur la page html, il n'affiche que le dernier enregistrement plusieurs fois en tant que nombre de ma table de base de données
Cette partie a été principalement couverte par toutes les réponses précédentes. Il vous faudra donc créer une nouvelle instance de votre CustomerDTO
au sein de votre boucle while
et l'ajouter à votre ArrayList
.
Il y a encore une chose que je voulais commenter:
Statement
ou vos objets Connection
( vous ne savez pas si vous mettez en pool votre connexion, dans ce cas, vous devrez libérer cette connexion dans le pool )Donc, quand vous considérez ces points, la structure de votre code pourrait ressembler à ceci:
public ArrayList<CustomerDTO> getAllCustomers()
{
ArrayList<CustomerDTO> customers = new ArrayList<CustomerDTO>();
Connection c = null;
Statement statement = null;
ResultSet rs = null;
try {
c = openConnection();
statement = c.createStatement();
String s = "SELECT * FROM customer";
rs = statement.executeQuery(s);
int g =0;
while (rs.next()) {
CustomerDTO customer = new CustomerDTO();
//Code to fill up your DTO
customers.add(customer);
}
} catch (Exception e) {
System.out.println(e);
}finally{
//Code to release your resources
}
return customers;
}