2010-01-20 11 views
4

Je travaille dans une application qui utilise des servlets et mysql.Utilisation d'une classe java pour créer une base de données

Je voudrais créer un fichier .jar capable de créer la base de données que l'application utilisera. Cela ne sera fait qu'une seule fois, afin de créer le db.

Je n'ai pas de problème à obtenir l'accès à une base de données, faire quelque chose comme ceci:

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
Connection conexion = (Connection)DriverManager.getConnection("jdbc:mysql://localhost/test","admin","admin"); 
if (!conexion.isClosed()) 
{ 
    Statement st = (Statement) conexion.createStatement(); 
    ResultSet rs = st.executeQuery("select * from table_name"); 
} 
conexion.close(); 

Ceci est ok, mais ce que je dois faire est de créer une nouvelle base de données (et ses tables) d'une classe Java, est-ce possible?

Merci

J'essaie ceci:

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
Connection conexion = (Connection)DriverManager.getConnection("jdbc:mysql://localhost/mysql","admin","admin"); 

Statement st = (Statement) conexion.createStatement();  
st.executeUpdate("CREATE DATABASE hrapp"); 

mais j'obtiens l'erreur suivante:

Exception dans le thread "principal" com.mysql.jdbc.exceptions.jdbc4 .MySQLSyntaxErrorException: Accès refusé pour l'utilisateur 'admin' @ 'localhost' à la base de données 'hrapp' à sun.reflect.NativeConstructorAccessorImpl.newInstance0 (méthode native) à sun.reflect.NativeConstructorAccessorImpl.newInstance (Unknown S Ource) à sun.reflect.DelegatingConstructorAccessorImpl.newInstance (Source inconnue) à java.lang.reflect.Constructor.newInstance (Source inconnue) à com.mysql.jdbc.Util.handleNewInstance (Util.java:406) à com.mysql.jdbc.Util.getInstance (Util.java:381) à com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1030) à com.mysql.jdbc.SQLError.createSQLException (SQLError.java: 956) à com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3491) à com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3423) à com.mysql.jdbc.MysqlIO.sendCommand (MysqlIO.java:1936) à com.mysql.jdbc.MysqlIO.sqlQueryDirect (MysqlIO.java:2060) à com.mysql.j dbc.ConnectionImpl.execSQL (ConnectionImpl.java:2536) à com.mysql.jdbc.StatementImpl.executeUpdate (StatementImpl.java:1564) à com.mysql.jdbc.StatementImpl.executeUpdate (StatementImpl.java:1485) à BaseDatosSetup.BaseDatosSetup.main (BaseDatosSetup.java:18)

Je l'ai résolu en accordant l'action create à l'utilisateur. Je ne sais pas pourquoi, je le faisais en tant qu'administrateur.

+0

Si vous pouvez programmer un SELECT, pourquoi ne pouvez-vous pas programmer CREATE TABLE/INSERT/LOAD? – gary

+0

Je ne sais pas, si je fais une connexion à l'une de mes bases de données, puis j'utilise: ResultSet rs = st.executeQuery ("select * from audiolist2"); Cela fonctionne. – dedalo

Répondre

2

W3CSchools.com - SQL CREATE DATABASE Statement. Cependant, vous n'utiliserez pas executeQuery. Utilisez plutôt executeUpdate.

Here est un exemple simple.

Comme mentionné par d'autres utilisateurs, vous ne souhaitez probablement pas créer de bases de données à partir de votre code. Ce n'est pas une bonne pratique.

+0

J'ai essayé, mais j'ai eu une erreur. J'ai ajouté l'information à ma question. Merci – dedalo

3

Tout d'abord, ce problème n'est pas spécifique à une servlet. Vous rencontreriez exactement le même problème/question en essayant/essayant ainsi dans n'importe quelle autre classe de Java;)

Deuxièmement, créer des bases de données/tables odentiellement par programme honnêtement. Dans le monde réel, avec des modèles de données bien conçus, vous créez normalement les bases de données/tables seulement une fois lors de l'installation/configuration de l'application en question et ensuite l'utilisez pour toujours pendant la durée de vie de l'application. Vous ne devriez pas avoir besoin de créer un nouveau DB/table pour chaque hoquet. Sauf si vous avez l'intention de développer (réinventer) un gestionnaire de base de données sur le Web bien sûr. En ce qui concerne votre question, cela dépend en fait du pilote JDBC utilisé, mais la plupart d'entre eux permettent seulement d'exécuter CREATE ou d'autres instructions DDL en utilisant Statement#executeUpdate(). Si ce n'est pas le cas, vous devez rechercher un autre pilote JDBC ou une version qui le permet. Vous devez également tenir compte du fait que l'utilisateur de la base de données en question a des droits suffisants, cela doit être configuré au niveau de la base de données.

+0

re. créer des bases de données/tables en dehors du code, une autre raison pour laquelle je pourrais en avoir besoin est peut-être dans une sorte de suite de tests où la configuration et le démontage nécessitent la création/suppression de données de base de données/table/test. –

+0

Encore alors, on ne mentionnerait pas explicitement d'utiliser une servlet pour cela;) – BalusC

+0

Je ne savais pas à quoi je pensais quand j'ai écrit la question. Il est édité maintenant. Toutes mes excuses pour la confusion :) – dedalo

0

Pourquoi voulez-vous faire cela?

Je pense que ce que vous auriez à faire est d'exécuter certaines commandes Runtime pour interfacer directement avec le système d'exploitation pour accomplir cet exploit. Cependant, je recommanderais pas de le faire de cette façon.

Questions connexes