2010-01-20 4 views
4

J'utilise Spring JdbcTemplate avec le modèle DAO pour accéder à une base de données. Au lieu de créer les tables de base de données manuellement, je cherche un moyen de générer les tables dans la couche DAO. Je comprends que je peux utiliser le JdbcTemplate pour exécuter des instructions, je cherche seulement le bon endroit pour le faire.Spring JDBC: Comment créer les tables?

Existe-t-il une meilleure pratique pour cela?

+4

Créer des tables par programmation est une odeur. Dans le monde réel (et avec de bons datamodels), vous devez normalement créer des tables une seule fois et les utiliser pour toujours. Êtes-vous ** sûr ** que vous devez le faire? Si ce n'est pas le cas, postez une nouvelle question comment changer le modèle de données afin de ne pas avoir besoin de créer une nouvelle table pour chaque hic. – BalusC

+0

+1 pour BalusC. Si vous souhaitez une manière reproductible et automatisée de créer des tables, créez un DDL ou un autre script pouvant être exécuté lors de la configuration de votre environnement. En d'autres termes, cela ne devrait pas être traité dans le code. – Droo

+0

@BalusC, un endroit logique pour exécuter une installation DDL pourrait être une opération d'installation, qui pourrait être distribuée dans le cadre de votre code - pourquoi ajouter quelque chose d'autre que le DAO actuel pour faire face à cette étape souvent nécessaire? –

Répondre

2

Légèrement offtopic:

Est-il absolument nécessaire que vous devez exécuter les commandes DDL à partir de votre code? En fait, je pense que c'est une bonne idée d'avoir une séparation entre l'administration db et l'utilisation de la base de données. Notre configuration de la sécurité de base de données Oracle ici est en fait configurée pour que les tables soient configurées en utilisant un utilisateur de base de données différent (DB_OWNER), celui qui exécute SELECTs, INSERTs, DELETE est exécuté par DB_USER. Cela empêche la suppression accidentelle de tables ou la modification du schéma et permet également de configurer DB_USER de sorte que seuls les privilèges absolument nécessaires soient accordés, ce qui ajoute une couche de sécurité. Je suppose que cela dépend de la nature de votre service/application, mais pensez à l'avantage de créer les tables dans le code (et si un bug possible dans le code DDL pourrait détruire accidentellement les données de production).

+0

Merci pour ce bon conseil! –

+0

oui, d'accord sur cela, nous avions DB_USER qui ne peut sélectionner et CALL PROCEDURE, donc s'il arrive que les pirates volent en quelque sorte usernam/pass (utilisé par application exposée sur le web par exemple), ils peuvent seulement sélectionner de la base de données. .. ou ils peuvent appeler procédure stockée, qui va gérer les contrôles avant et insérer quelque chose qui va laisser la base de données dans un état cohérent, de sorte que les dommages seraient plus petits –

+0

Supposons que vous faites une nouvelle installation, distribuez-vous une autre application pour exécuter votre DDL ou groupez-vous le DDL et avez-vous une logique d'installation dans votre application? –

0

Utilisez .update() méthodes disponibles dans le (Simple)JdbcOperations, le nombre qu'ils retournent est le nombre de lignes affectées. Ils sont censés être utilisés spécifiquement pour les instructions INSERT et UPDATE.

+0

Il demande comment créer une table, pas comment mettre à jour un –

+0

'.update()' est également prévu pour ceux-là. fondamentalement, toutes les autres méthodes sont pour SELECT, '.update()' est pour tout le reste. – Esko

6

Vous pouvez utiliser le execute(String) method:

public void execute(String sql) throws DataAccessException 

un fournisseur unique exécuter SQL, généralement une instruction DDL.
spécifié par: exécuter dans JdbcOperations interface

Paramètres: SQL - SQL statique pour exécuter

Lancers: DataAccessException - s'il y a un problème

Cependant, comme beny23 mentionne que je serais méfiant d'un besoin réel de le faire par programmation dans une application en direct.

+0

2 mots: tests d'intégration – rsenna

Questions connexes