9
votes

En général, où placer les requêtes SQL dans une application?

Quel est le meilleur endroit pour placer les requêtes SQL dans une application?

Les requêtes peuvent être grandes et nécessitent un formatage.

Ajout de la requête à l'aide de StringBuilder a l'air très encombré.

Les stocker dans des fichiers et les lire à chaque fois quand une demande est faite - ressemble à une mauvaise idée. (Mais je pense que la lecture du fichier peut être placée dans un bloc statique)


1 commentaires

Rangez-les comme des vues et des procédures stockées dans la base de données SQL elle-même.


9 Réponses :


2
votes

Lire sur le PreparedStatement

Dans ce vous ne devez pas stocker toutes les parties variables de la requête comme, insert en valeurs de table_x (?,?,?);

et en utilisant statement.setString (1, "bonjour"); , statement.setInt (2,1); , statement.setDouble (3, 4,555);

et enfin statement.execute (); vous pouvez insérer les valeurs ..

PS:. Mémorisation des chaînes d'instructions préparées dans un fichier de propriétés est recommandé


1 commentaires

Le problème est où placer l'insertion "Insérer dans table_x ...". Surtout quand la requête est, disons, 20 lignes.



1
votes

Ouais, c'est bon à partir. Et un fichier de propriété ne serait pas une mauvaise idée. Mais parfois, nous devons construire des requêtes à la volée, car cet approche stringbuiler est bien.


4 commentaires

@Ansari: Le fichier SQL lorsqu'il est formaté peut aller jusqu'à 20-30 lignes, que je souhaite conserver à des fins de lisibilité. Donc, les mettre dans le fichier de propriété pourrait ne pas aider.


@Hanuathena: Pourquoi pas? Nous pouvons écrire la valeur d'une propriété sur plusieurs lignes. Et je ne pense pas que cela gâcherait la lisibilité. Vous feriez la même chose dans le code, pour éviter tout défilement horizontal, de toute façon.


@Hanuathena: Maintenant Darioo est venu avec l'exemple. J'espère maintenant que vous pouvez voir mon point.


@Ansari: Oui. entendu. Merci :)



1
votes

Vous pouvez les mettre dans un fichier .properties. Utilisation d'Apache Commons pour la configuration, vous pouvez Évitez de lire les fichiers à chaque fois .

Si vous choisissez d'accéder à cet itinéraire, vous pouvez aider la réveillabilité en rompant une requête en plus de lignes à l'aide de barres anti-backslash: xxx


0 commentaires

0
votes

Dans mon scénario, j'ai un DAO spécifique où toutes mes requêtes SQL sont "enregistrées" dans un Bloc final Static CODE>.

Exemple: P>

/* (non-Javadoc)
     * @see net.imatri.dao.JdbcDAO#create(java.lang.Object)
     */
    @Override
    public boolean create(UserEntity user) throws DAOException {
        // TODO Auto-generated method stub
        PreparedStatement ps = null;
        ResultSet generatedKeyResultSet = null;
        boolean created = false;

        String SQL_CREATE = "INSERT INTO USER(FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMAIL_ADDRESS";
        String sqlValues = "(?, ?, ?, ?";

        if (user.getGender() != null) {
            SQL_CREATE += ", GENDER";
            sqlValues += ", ?";
        }

        if (user.getBirthDate() != null) {
            SQL_CREATE += ", DOB";
            sqlValues += ", ?";
        }

        SQL_CREATE += ") VALUES " + sqlValues + ")";

        try {
            ps = getConnection().prepareStatement(SQL_CREATE, Statement.RETURN_GENERATED_KEYS);
            ps.setString(1, user.getFirstName());
            ps.setString(2, user.getMiddleName());
            ps.setString(3, user.getLastName());

            int pos = 4;
            if (user.getGender() != null) {
                ps.setString(pos++, user.getGender().toString());
            }

            ps.setString(pos++, user.getEmailAddress());

            if (user.getBirthDate() != null)
                ps.setDate(pos++, new Date(user.getBirthDate().getTime()));

            ps.executeUpdate();
            generatedKeyResultSet = ps.getGeneratedKeys();
            if (generatedKeyResultSet != null && generatedKeyResultSet.next()) {
                user.setId(generatedKeyResultSet.getLong(1));
            }
            created = true;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            throw new DAOException(e);
        } finally {
            try {
                close(generatedKeyResultSet, ps);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                logger.error("Error closing statement or resultset.", e);
            }
        }

        return created;
    }


0 commentaires

0
votes

J'avais l'habitude de les mettre dans un fichier de propriétés spécial qui est emballé dans mon pot. Ensuite, j'ai extrait-le en utilisant Propriétés.load (getclass (). GetResourceastream ("requêtes.properties")) et une déclaration préparée utilisée.

Mais des années passées depuis que j'ai utilisé cette technique la dernière fois et je pense maintenant qu'il n'est pas recommandé, sauf si vous avez une raison grave de le faire.

Je pense que l'utilisation de la JPA est une solution "droite" pour les grands projets. Si vous développez un outil de mappage d'utilisation de projet plus petit comme Ibatis qui vous permet d'écrire des requêtes comme annotations.


0 commentaires

18
votes

Gardez la requête SQL dans un fichier de ressource que vous lisez à une constante de la classe de classe: xxx pré>

de cette façon, vous pouvez utiliser votre éditeur préféré pour éditer le SQL, mais vous obtenez toujours la requête dans une constante en Java. p>

Si vous le faites beaucoup, extrayez le code sur une méthode d'assistance: p> xxx pré>

et utilisez-le dans votre Blocs statiques: P>

private static final String PERSON_QUERY;
private static final String ADDRESS_QUERY;
private static final String AGE_QUERY;

static{
    PERSON_QUERY = Helper.loadResourceToString("queries/personQuery.sql");
    ADDRESS_QUERY = Helper.loadResourceToString("queries/addressQuery.sql");
    AGE_QUERY = Helper.loadResourceToString("queries/ageQuery.sql");
}


2 commentaires

Si vous utilisez déjà IOUTILS, il est beaucoup plus facile de remplacer la plupart de votre code avec FileUtils.readFiletostring (nouveau fichier (chemin));


@akapelko Si c'est dans un fichier, vous êtes correct. Mais mon code fonctionne pour les fichiers et les entrées JAR.



1
votes

requêtes statiques - celles qui ne dépendent que sur les paramètres de liaison - sont parfaitement adaptées à des classes * dao , qui abstraites ont accès à DB - vous ne gérez que dao API comme LOADUREER (INT IDERID) ou Sauvegher (utilisateur utilisateur) . De cette façon, la manière dont les requêtes sont stockées dans la DAO n'est pas une grande question, faites comme vous le souhaitez.
Je n'utilise généralement pas de requêtes dynamiques, je ne peux donc pas donner de bons conseils à leur sujet.


0 commentaires

2
votes

Je me pencherai personnellement vers la mise en place de ces requêtes dans un fichier XML; Les propriétés des propriétés sont un cauchemar pour des requêtes complexes (ne pas oublier le \ après chaque ligne de requête). Et pendant que vous y êtes, pourquoi pas simplement utiliser un simple framework dao comme ibatis (maintenant mybatis) qui est un plaisir à utiliser pour des projets simples et complexes. : -)


0 commentaires

0
votes

Une chose que vous voudrez peut-être examiner est stockée des procédures ou des vues stockées. Je ne suis pas sûr de quel type de base de données vous utilisez, mais dans MS SQL et MySQL, les deux sont une option. Ils offrent non seulement un endroit pour stocker vos longues requêtes, mais comme vous passez des variables plutôt que de simplement exécuter une requête, cela protège également la redoutée Dun Dun Dunnnnnnnnnnnnnnnnnn. Maintenant, je ne sais pas non plus à quel point votre demande est complexe, mais en général, j'ai tendance à utiliser une solution dans laquelle mes requêtes sont stockées sur la base de la base de données, plutôt que dans une application quelque part.

Un peu de lecture: (Wiki Articles Oui, mais il y a de bonnes références en bas.) http://fr.wikipedia.org/wiki/stortored_procedure http://en.wikipedia.org/wiki/view_ (base de données)


0 commentaires