JSP: SQL-dump files uitvoeren op een databank

Trefwoorden: jsp databank sql dump
Als JSP-developer zal je in veel gevallen moeten werken op een server zonder php ondersteuning en bijgevolg ook zonder phpMyAdmin.

het aanmaken van een databank met bijhorende tabellen kan daardoor bijzonder tijdrovend worden.
Wanneer men dan geregeld een update moet uitvoren, wat tijdens de ontwerp fase veel gebeurt, gaat dit een rotkarwei worden.

Daarom gaan we in dit artikeltje uitleggen hoe we een file, waarin alle queries als tekst staan, kunnen uitvoeren op de databank.

Vermits we met Java Server Pages werken is de beste snelste en meest efficiente manier, werken met klassen.

We gaan hiervoor een Databaseklasse aanmaken waarin awe vervolgens methoden kunnen toevoegen die op die databank worden uitgevoerd.
Let op, in deze klasse gaan we geen acties uitvoeren op individuele tabellen, enkel op de databank server als geheel!

het aanmaken van een Databaseklasse doen we als volgt.
in je webdirectory onder /WEB-INF/classes/ (let op hoofdletters) maak je de file "Database.java" aan als een tekst file.

Open deze file in je favoriete editor (Jext,Crimson,Eclipse, of gewoon kladblok).

Vervolgens kopieer je volgende code:
CODE
  1. import java.sql.*;
  2. import java.io.*;
  3. import java.util.*;
  4.  
  5. public class Database
  6. {
  7. }
Hiermee heb je nu officiŽel je klasse aangemaakt.
Het eerste wat we nu tussen de accolades moeten toevoegen, is de constructormethode.
Dit is de eerste functie die wordt aangeroepen als je een nieuw object maakt van deze klasse.
CODE
  1. public Database(String strConn)
  2. {
  3.     this.strConn=strConn;
  4.     open();
  5. }
U merkt hier op dat we this.strConn toewijzen, maar dat deze nergens gedeclareerd staat, vermits deze variabele nodig is op het niveau van de klasse, gaan we deze toevoegen bij de globale variabelen.
Voeg hiervoor volgende code toe tussen de accolades van de klasse, maar nog vůůr de constructor (public Database(String strConn)).
CODE
  1. private String strConn="";
En we voegen meteen ook twee andere variabele toe op dezelfde manier:
CODE
  1. private Connection Conn=null;
  2. private boolean state=true;
Deze gaan we later nog nodig hebben om de conectie te onderhouden.

Eveneens in de constructor wordt er verwezen naar een open() functie. deze dient om een connectie te leggen met de databank server.
We voegen dus toe:
CODE
  1. public void open()
  2.   {
  3.     try {
  4.       //catching correct class
  5.       Class.forName("com.mysql.jdbc.Driver");
  6.       //connecting
  7.       Conn = DriverManager.getConnection(strConn);
  8.       state =true;
  9.     }
  10.     catch (ClassNotFoundException e) {
  11.       state=false;
  12.     }
  13.     catch (SQLException e) {
  14.       state=false;
  15.     }
  16.   }
Noot: Indien u een andere server dan MySQL gebruikt moet u ook een andere driver manager gebruiken.

Als we een sessie openen moeten we deze ook kunnen afsluiten.
We voegen dus een methode toe die een einde maakt aan de verbinding:
CODE
  1.   public void close()
  2.   {
  3.     if( Conn != null)
  4.     {
  5.       try{
  6.         Conn.close();
  7.         state = false
  8.       }
  9.       catch(SQLException e){}
  10.     }
  11.   }
Nu we alle basisfunctionaliteiten hebben kunnen we eindelijk werk maken van een methode om de inhoud van een file uit te voeren op de database server.

Eerst en vooral het gedeelte met variabelen:
CODE
  1.   public void sqlFromFile(String urlFile)
  2.   {
  3.     String strContent = "";
  4.     String strQuery = "";
  5.     boolean blContinue = true;
  6.     StringTokenizer sttQuery = null;
  7.     Statement sql=null;
De parameter urlFile bevat een string die het absolute pad naar de sql file voorstelt (bv. "c:\blaat\webs\sql\create.sql").
In de variabele strContent zal de volledige inhoud van de file worden gelezen.
In strQuery wordt elke afzonderlijke query tijdelijk opgeslagen.
De stringtokenizer sttQuery is een java object dat een lange tekenreeks kan opsplitsen in een enumeration van kleinere tekenreeksen die worden gelimiteerd door bepaalde tekens.
In het geval van een sql file is het ';' teken een uitstekende scheiding.

We gaan nu de inhoud van de file lezen.
CODE
  1.    if(Conn!=null)
  2.     {
  3.       try       {
  4.         FileReader fr = new FileReader(urlFile);
  5.         BufferedReader brStream = new BufferedReader(fr);
  6.      
  7.         while (brStream.ready() ) {
  8.           strContent += brStream.readLine();
  9.         }
  10.         brStream.close();
  11.         fr.close();     
  12.       }
  13.       catch (IOException io)
  14.       {
  15.         blContinue = false;
  16.       }
  17.       catch (Exception e) {
  18.         blContinue = false;
  19.       }
De eerste if-clausule is louter ter voorkoming dat we gaan proberen om acties uit te voeren terwijl er nog geen connectie met de databank is.
Vervolgens wordt er geprobeerd om de inhoud van de file naar een buffer te schrijven en deze dan vervolgens in een string te plakken zolang er nog tekens in staan.
strContent bevat nu de volledige inhoud van de file (als er niets misliep).

We gaan nu de inhoud scheiden in aparte queries op basis van het puntkommateken:
CODE
  1.       sttQuery = new StringTokenizer(strContent,";",false);
En dan wordt elke query afzonderlijk uitgevoerd:
CODE
  1.       while(sttQuery.hasMoreTokens())
  2.       {
  3.         strQuery=sttQuery.nextToken();
  4.          
  5.         try {
  6.           sql=Conn.createStatement();
  7.           sql.execute(strQuery);
  8.           sql.close();
  9.         }
  10.         catch(SQLException e) {  }
  11.       }
  12.     }
  13.   }
Onze klasse is nu klaar.
Nu rest ons enkel nog het compileren en het gebruiken.
Het compileren wordt hier niet behandeld daar hier al meer dan genoeg documentatie over te vinden is.
Om de klasse te gebruiken in uw JSP's doet u het volgende:
CODE
  1. Database Conn = new Database("jdbc:mysql://localhost/?user=***&password=***");
  2. Database.sqlFromFile("absolute pad naar uw file");
  3. Database.close();
Uw SQL file kan er bijvoorbeeld alsvolgt uitzien:
CODE
  1. create database if not exists tomme;
  2. use tomme;
  3.  
  4. create table if not exists tblAccount (
  5.         strAccountName varchar(15) primary key,
  6.         strAccountPassword text not null,
  7.         dtmAccountBirthdate datetime
  8. ) TYPE=MyISAM;
  9.  
  10. create table if not exists tblAccountInfo (
  11.         intAccountInfoId int primary key auto_increment,
  12.         strAccountInfoAccountId varchar(15),
  13.         strAccountInfoAccountField varchar(200),
  14.         strAccountInfoContent text
  15. ) TYPE=MyISAM;
Dit artikel werd geschreven door Tom op zaterdag 25 september 2004 om 16:58 en werd sindsdien 3872 keer gelezen.

  • Pagina
  • 1 van 1

Geen reacties gevonden
Er werden nog geen reacties bij dit artikel geplaatst.
  • Indien je denkt iets te kunnen toevoegen aan het artikel, kan je zelf een reactie schrijven via de koppeling Plaats een reactie bij dit artikel hieronder.
  • Indien je andere commentaar (iets wat niet meteen functioneel bijdraagt aan het artikel zelf) hebt, kan je een bedankje formuleren via de koppeling Plaats een bedankje bij dit artikel hieronder.