Avatar billede r9 Nybegynder
15. oktober 2001 - 18:28 Der er 11 kommentarer og
1 løsning

connect til mySQL?

Hvordan connecter jeg til en mySQL database i min EntityBean i et J2EE miljø?

I eksemplet connecter jeg til en Cloudscape database og indsætter et ID, fornavn & efternavn.
Derefter får jeg retuneret et efternavn.
Men jeg vil have en mySQL database koblet til istedet.

Eksemplet er en modificeret udgave af savingsaccount fra sun:(her er den fulde kode):

remote interface:

import javax.ejb.EJBObject;
import java.rmi.RemoteException;

public interface SavingsAccount extends EJBObject
{  public String getEfterNavn()
        throws RemoteException;
}



home interface:

import java.util.Collection;
import java.rmi.RemoteException;
import javax.ejb.*;

public interface SavingsAccountHome extends EJBHome
{  public  SavingsAccount create(String id, String forNavn,
        String efterNavn)
        throws RemoteException, CreateException;
}


Entity bønnen:

import java.sql.*;
import javax.sql.*;
import java.util.*;
import javax.ejb.*;
import javax.naming.*;

public class SavingsAccountBean implements EntityBean {

    private String id;
    private String forNavn;
    private String efterNavn;
    private EntityContext context;
    private Connection con;

  private String dbName = \"java:comp/env/jdbc/SavingsAccountDB\";


   

    public String getEfterNavn()
    { return efterNavn;
    }

   
    public String ejbCreate(String id, String forNavn, String efterNavn)
    { try
        {  insertRow(id, forNavn, efterNavn);
        }
        catch (Exception ex)
        { throw new EJBException(\"ejbCreate: \" +
              ex.getMessage());
        }

      this.id = id;
      this.forNavn = forNavn;
      this.efterNavn = efterNavn;
       
      return id;
    }

   

  public void ejbRemove() {

      try {
        deleteRow(id);
      } catch (Exception ex) {
          throw new EJBException(\"ejbRemove: \" +
              ex.getMessage());
      }
  }

  public void setEntityContext(EntityContext context) {

      this.context = context;
      try {
        makeConnection();
      } catch (Exception ex) {
          throw new EJBException(\"Unable to connect to database. \" +
            ex.getMessage());
      }
  }

  public void unsetEntityContext() {

      try {
        con.close();
      } catch (SQLException ex) {
          throw new EJBException(\"unsetEntityContext: \" + ex.getMessage());
      }
  }

  public void ejbActivate() {

      id = (String)context.getPrimaryKey();
  }

  public void ejbPassivate() {

      id = null;
  }

  public void ejbLoad() {

      try {
        loadRow();
      } catch (Exception ex) {
          throw new EJBException(\"ejbLoad: \" +
              ex.getMessage());
      }
  }
 
  public void ejbStore() {

      try {
        storeRow();
      } catch (Exception ex) {
          throw new EJBException(\"ejbLoad: \" +
              ex.getMessage());
      }
  }


  public void ejbPostCreate(String id, String forNavn,
      String efetrNavn) { }


/*********************** Database Routines *************************/

  private void makeConnection() throws NamingException, SQLException {

      InitialContext ic = new InitialContext();
      DataSource ds = (DataSource) ic.lookup(dbName);
      con =  ds.getConnection();
  }
 

 




  private void insertRow (String id, String forNavn, String efterNavn)
    throws SQLException
    {  String insertStatement =
                \"insert into Bruger values ( ? , ? , ?  )\";
          PreparedStatement prepStmt =
                con.prepareStatement(insertStatement);

          prepStmt.setString(1, id);
          prepStmt.setString(2, forNavn);
          prepStmt.setString(3, efterNavn);


          prepStmt.executeUpdate();
          prepStmt.close();
  }

  private void deleteRow(String id) throws SQLException {

      String deleteStatement =
            \"delete from Bruger where id = ? \";
      PreparedStatement prepStmt =
            con.prepareStatement(deleteStatement);

      prepStmt.setString(1, id);
      prepStmt.executeUpdate();
      prepStmt.close();
  }

  private boolean selectByPrimaryKey(String primaryKey)
      throws SQLException {

      String selectStatement =
            \"select id \" +
            \"from Bruger where id = ? \";
      PreparedStatement prepStmt =
            con.prepareStatement(selectStatement);
      prepStmt.setString(1, primaryKey);

      ResultSet rs = prepStmt.executeQuery();
      boolean result = rs.next();
      prepStmt.close();
      return result;
  }


 
  private void loadRow() throws SQLException {

      String selectStatement =
            \"select forNavn, efterNavn \" +
            \"from Bruger where id = ? \";
      PreparedStatement prepStmt =
            con.prepareStatement(selectStatement);

      prepStmt.setString(1, this.id);

      ResultSet rs = prepStmt.executeQuery();

      if (rs.next()) {
        this.forNavn = rs.getString(1);
        this.efterNavn = rs.getString(2);
        prepStmt.close();
      }
      else {
        prepStmt.close();
        throw new NoSuchEntityException(\"Row for id \" + id +
            \" not found in database.\");
      }
  }


  private void storeRow() throws SQLException {

      String updateStatement =
            \"update Bruger set forNavn =  ? ,\" +
            \"efterNavn = ?  \" +
            \"where id = ?\";
      PreparedStatement prepStmt =
            con.prepareStatement(updateStatement);

      prepStmt.setString(1, forNavn);
      prepStmt.setString(2, efterNavn);
      prepStmt.setString(3, id);
      int rowCount = prepStmt.executeUpdate();
      prepStmt.close();

      if (rowCount == 0) {
        throw new EJBException(\"Storing row for id \" + id + \" failed.\");
      }
  }

}



Clienten:

import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

public class SavingsAccountClient
{

  public static void main(String[] args) {

      try {
          Context initial = new InitialContext();
          Object objref = initial.lookup(\"java:comp/env/ejb/SimpleSavingsAccount\");

            SavingsAccountHome home =
              (SavingsAccountHome)PortableRemoteObject.narrow(objref,
                                            SavingsAccountHome.class);

          SavingsAccount b = home.create(\"15\", \"per\", \"nielsen\");
          String eNavn = b.getEfterNavn();
          System.out.println(eNavn);
 
      }
      catch (Exception ex) {
          System.err.println(\"Caught an exception.\" );
          ex.printStackTrace();
      }
  }   
}
Avatar billede r9 Nybegynder
15. oktober 2001 - 18:32 #1
indtil nu har jeg oprettet min cloudscape database med en batfil:


java -Dij.connection.CloudscapeDB=jdbc:rmi://localhost:1099/jdbc:cloudscape:CloudscapeDB\\;create=true -Dcloudscape.system.home=%J2EE_HOME%\\cloudscape -classpath %J2EE_HOME%\\lib\\cloudscape\\client.jar;%J2EE_HOME%\\lib\\system\\tools.jar;%J2EE_HOME%\\lib\\system\\cloudscape.jar;%J2EE_HOME%\\lib\\cloudscape\\RmiJdbc.jar;%CLASSPATH% -ms16m -mx32m COM.cloudscape.tools.ij create.sql

_________________________________________________

filen \"create.sql\" ser således ud:

drop table Bruger;

create table Bruger 
(id varchar(3) constraint pk_Bruger primary key, 
forNavn varchar(24), 
efterNavn varchar(24));

exit;
Avatar billede lbhansen Nybegynder
15. oktober 2001 - 18:55 #2
prøv at søg her i java sektionen under mysql, der adskillige eksempler på hvordan man connecter til sådan en fætter. Fx dette http://www.eksperten.dk/spm/119755
Avatar billede r9 Nybegynder
15. oktober 2001 - 19:00 #3
>>>>ibhansen

jeg har søgt, og ikke fundet noget brugbart svar.

der hvor du henviser, bliver bare forklaret hvordan man generelt connecter til mySQL, men det foregår jo på en hel anden på når vi snakker om J2EE miljøet:)
Avatar billede r9 Nybegynder
15. oktober 2001 - 19:06 #4
Problemmet er vel nok mere opsætningen af drivere o.s.v. som jeg skal have hjælp til.

det eneste sted jeg har fundet der forklarer lidt om det er her: http://www.geocrawler.com/archives/3/193/2000/6/0/3901703/

jeg har prøvet som beskrevet, med det virker ikke?
Avatar billede lbhansen Nybegynder
15. oktober 2001 - 20:46 #5
der er nu ikke noget specielt ved J2EE, men hvordan man konfigurerer det kan være lidt anderledes.

Du skal vel egentlig bare sørge for at mm.mysql.jar er i din CLASSPATH, og så ændre de
linjer som bliver forslået i dit eget eksempel(har dog aldrig kigget på j2eesdk, men bruger websphere).

Ellers kan du jo bare bruge den samme approach som nævnt i det link på eksperten jeg gav dig.

Du vil dog nok miste den form for connectionpooling der bliver tilbudt af mange udbydere af datasources.

Avatar billede r9 Nybegynder
16. oktober 2001 - 15:05 #6
hvis man ser på batfilen hvor jeg oprettet min Cloudscape database:

java -Dij.connection.CloudscapeDB=jdbc:rmi://localhost:1099/jdbc:cloudscape:CloudscapeDB\\;create=true -Dcloudscape.system.home=%J2EE_HOME%\\cloudscape -classpath %J2EE_HOME%\\lib\\cloudscape\\client.jar;%J2EE_HOME%\\lib\\system\\tools.jar;%J2EE_HOME%\\lib\\system\\cloudscape.jar;%J2EE_HOME%\\lib\\cloudscape\\RmiJdbc.jar;%CLASSPATH% -ms16m -mx32m COM.cloudscape.tools.ij create.sql

Som det kan ses er det i batfilen hvor jeg laver jdbc-forbindelse til Cloudcape databasen.

problemmet er at jeg ikke ved hvor jeg laver jdbc-forbindelse, hvis jeg vil benytte en mySQL database?
Avatar billede cyberzed Nybegynder
17. oktober 2001 - 04:17 #7
public SQL()
{
    try
    {
    Class.forName(\"org.gjt.mm.mysql.Driver\").newInstance();
    }
    catch(Exception e)
    {
        System.out.println(e.toString());
    }
    try
    {
        con = (org.gjt.mm.mysql.jdbc2.Connection) DriverManager.getConnection(db);
    }
    catch (SQLException e)
    {
        System.out.println(\"SQLException: \" + e.getMessage());
        System.out.println(\"SQLState:    \" + e.getSQLState());
        System.out.println(\"VendorError:  \" + e.getErrorCode());
    }
}

Det er en måde jeg har fået forbindelse på !!
Avatar billede r9 Nybegynder
17. oktober 2001 - 13:51 #8
>>>>cyberzes

kan du ikke smide noget kildekode til et eksempel der virker med j2ee og mySQL??
Avatar billede r9 Nybegynder
17. oktober 2001 - 14:24 #9
med kildekode mener jeg et lille fuldt kørende eksempel:)
Avatar billede lbhansen Nybegynder
17. oktober 2001 - 20:19 #10
hvis erstatter hans kode med koden i din makeConnection, så burde det faktisk virke.
Avatar billede r9 Nybegynder
22. oktober 2001 - 14:38 #11
intet brugbart svar.
det er jdbc opsætning i miljøet der er problemmet!!!
Avatar billede cyberzed Nybegynder
12. november 2001 - 00:46 #12
Hmm r9 hvis du ser det her kan du lige fyre mig en mail på cyberzed@crayon.dk eller ICQ 14307141 hvis du stadig kæmper med den JDBC ting for så kan vi lige finde ud af det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester