générique DAO en java
Je suis en train de développer générique DAO en java. J'ai essayé ce qui suit. Est-ce
une bonne façon de mettre en œuvre générique DAO? Je ne veux pas utiliser la mise en veille prolongée. Je suis en train de faire elle aussi générique que possible, de sorte que je n'ai pas à répéter le même code plusieurs fois.
public abstract class AbstractDAO<T> {
protected ResultSet findbyId(String tablename, Integer id){
ResultSet rs= null;
try {
//the following lines are not working
pStmt = cn.prepareStatement("SELECT * FROM "+ tablename+ "WHERE id = ?");
pStmt.setInt(1, id);
rs = pStmt.executeQuery();
} catch (SQLException ex) {
System.out.println("ERROR in findbyid " +ex.getMessage() +ex.getCause());
ex.printStackTrace();
}finally{
return rs;
}
}
}
Maintenant j'ai:
public class UserDAO extends AbstractDAO<User>{
public List<User> findbyid(int id){
Resultset rs =findbyid("USERS",id) //"USERS" is table name in DB
List<Users> users = convertToList(rs);
return users;
}
private List<User> convertToList(ResultSet rs) {
List<User> userList= new ArrayList();
User user= new User();;
try {
while (rs.next()) {
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setFname(rs.getString("fname"));
user.setLname(rs.getString("lname"));
user.setUsertype(rs.getInt("usertype"));
user.setPasswd(rs.getString("passwd"));
userList.add(user);
}
} catch (SQLException ex) {
Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
}
return userList;
}
}
quel est le problème?
plz voir la ligne suivante: / / lins à ne pas travailler;
Pourquoi ne voulez-vous pas utiliser la mise en veille prolongée (ou d'autres ORM)?
Je peux comprendre ne pas vouloir utiliser Hibernate 🙂
Méfiez-vous que vous avez d'appeler
plz voir la ligne suivante: / / lins à ne pas travailler;
Pourquoi ne voulez-vous pas utiliser la mise en veille prolongée (ou d'autres ORM)?
Je peux comprendre ne pas vouloir utiliser Hibernate 🙂
Méfiez-vous que vous avez d'appeler
close()
sur JDBC objets tels que des ResultSet
lorsque vous avez terminé avec eux. Où allez-vous appeler close()
sur votre ResultSet
?
OriginalL'auteur akshay | 2010-05-17
Vous devez vous connecter pour publier un commentaire.
Si vous pouvez vivre avec le Printemps, je vais vous suggérer les améliorations suivantes:
Indépendant de l'aide de Printemps, je vous recommande les éléments suivants:
Une amélioration de la AbstractDao avec le Printemps:
Comme vous le voyez, pas de gestion de l'exception ou de piratage avec la primitive SQL classes. Ce modèles ferme le jeu de résultats pour vous, que je ne peux pas voir dans votre code.
Et la UserDao:
Mise à jour:
Lorsque vous connaissez l'id et l'id correspond à une seule ligne dans la base de données, vous devriez envisager un retour un objet générique, au lieu d'une collection.
Cela rend votre code plus lisible, puisque vous n'avez pas besoin de récupérer l'utilisateur à partir d'une liste, mais seulement:
OriginalL'auteur Espen
Mon conseil:
Exemple
OriginalL'auteur Adamski
C'est ok, mais changer la méthode de
à
Objet utilisateur doit être créé à l'intérieur de la boucle while.
Ce code est une fuite de ressources si une SQLException est levée. Vous devez vous assurer que le jeu de résultats, l'état de Connexion et sont fermés. Manière la plus simple est d'utiliser un framework comme Spring JDBC plutôt que brut JDBC.
Qu'est-ce que l'erreur r u?
Est-ce dû à cela? (manque un espace avant) Changer le ci-dessous un "SELECT * from "+ tablename+ "where id = ?" à "SELECT * from "+ tablename+ " where id = ?"
OriginalL'auteur Ravindra Gullapalli
Ne pas réinventer la roue, vous pouvez déjà trouver de bons projets faisant cela, exemple générique-dao projet sur google.
EDIT: répondu trop vite sans doute, le projet google est JPA, mais néanmoins, vous pouvez utiliser certains des concepts à l'intérieur.
OriginalL'auteur Matthieu BROUILLARD
Vous avez besoin pour ajouter un espace avant votre clause "where"
voir ci-dessous:
à
OriginalL'auteur Robert
Si j'ai bien compris l'énoncé du problème, vous essayez de mettre en œuvre une sorte de couche d'isolation entre vos services et une plaine de la base de données exposées par le biais d'une interface JDBC. La couche d'isolation pourrait servir de mapper des données de votre POJO domaine des objets de SQL ensembles de données. C'est précisément la tâche de iBATIS bibliothèque, je vous recommande de méditer sur la place de la mise en œuvre de l'homebrew GenericDAO classe.
OriginalL'auteur Dmitri
Même si tout le monde suggère Printemps et son API ici, il utilise les métadonnées et c'est une mauvaise combinaison de code. Donc, n'utilisez pas de générique de DAO ou de Printemps à tous.
Code générique est lourd et ne multipliez votre charge.
OriginalL'auteur srikanth N