EJB - Database di accesso

In EJB 3.0, il meccanismo di persistenza viene utilizzato per accedere al database in cui il contenitore gestisce le operazioni relative al database. Gli sviluppatori possono accedere al database utilizzando la chiamata API JDBC direttamente nei metodi aziendali EJB.

Per dimostrare l'accesso al database in EJB, è necessario eseguire le seguenti attività:

  • Step 1 - Crea una tabella nel database.

  • Step 2 - Crea un EJB apolidi che mi faccia affari

  • Step 3- Aggiorna EJB senza stato. Aggiungi metodi per aggiungere record e ottenere record dal database tramite Entity Manager.

  • Step 4 - Un client dell'applicazione basato su console accederà all'EJB senza stato per rendere persistenti i dati nel database.

Crea tabella

Crea una tabella books nel database predefinito postgres.

CREATE TABLE books (
   id     integer PRIMARY KEY,
   name   varchar(50)
);

Crea una classe modello

public class Book implements Serializable{
    
   private int id;
   private String name;

   public Book() {        
   }
   
   public int getId() {
      return id;
   }
   ...
}

Crea EJB senza stato

@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
	
   public void addBook(Book book) {
     //persist book using jdbc calls
   }    

   public List<Book> getBooks() {        
     //get books using jdbc calls
   }
   ...
}

Dopo aver creato il modulo EJB, abbiamo bisogno di un client per accedere al bean senza stato, che creeremo nella prossima sezione.

Applicazione di esempio

Creiamo un'applicazione EJB di prova per testare il meccanismo di accesso al database EJB.

Passo Descrizione
1

Creare un progetto con un nome EjbComponent in un pacchetto com.tutorialspoint.entity come spiegato nel capitolo EJB - Crea applicazione . È anche possibile utilizzare il progetto creato nel capitolo EJB - Crea applicazione come tale per questo capitolo per comprendere i concetti di accesso ai dati EJB.

2

Crea Book.java nel pacchetto com.tutorialspoint.entity e modificalo come mostrato di seguito.

3

Creare LibraryPersistentBean.java e LibraryPersistentBeanRemote come spiegato nel capitolo EJB - Crea applicazione e modificarli come mostrato di seguito.

4

Pulisci e crea l'applicazione per assicurarti che la logica di business funzioni secondo i requisiti.

5

Infine, distribuisci l'applicazione sotto forma di file jar su JBoss Application Server. JBoss Application Server verrà avviato automaticamente se non è ancora stato avviato.

6

Ora crea il client EJB, un'applicazione basata su console nello stesso modo spiegato nel capitolo EJB - Crea applicazione sotto l'argomentoCreate Client to access EJB. Modificalo come mostrato di seguito.

EJBComponent (modulo EJB)

Book.java

package com.tutorialspoint.entity;

import java.io.Serializable;

public class Book implements Serializable{
    
   private int id;
   private String name;

   public Book() {        
   }
   
   public int getId() {
      return id;
   }

   public void setId(int id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }    
}

LibraryPersistentBeanRemote.java

package com.tutorialspoint.stateless;

import com.tutorialspoint.entity.Book;
import java.util.List;
import javax.ejb.Remote;

@Remote
public interface LibraryPersistentBeanRemote {

   void addBook(Book bookName);

   List<Book> getBooks();
    
}

LibraryPersistentBean.java

package com.tutorialspoint.stateless;

import com.tutorialspoint.entity.Book;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;

@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
    
   public LibraryPersistentBean() {
   }

   public void addBook(Book book) {
      Connection con = null;
      String url = "jdbc:postgresql://localhost:5432/postgres";
      String driver = "org.postgresql.driver";

      String userName = "sa";
      String password = "sa";
      List<Book> books = new ArrayList<Book>();
      try {

         Class.forName(driver).newInstance();
         con = DriverManager.getConnection(url , userName, password);

         PreparedStatement st = 
         con.prepareStatement("insert into book(name) values(?)");
         st.setString(1,book.getName());

         int result = st.executeUpdate();                

      } catch (SQLException ex) {
         ex.printStackTrace();
      } catch (InstantiationException ex) {
         ex.printStackTrace();
      } catch (IllegalAccessException ex) {
         ex.printStackTrace();
      } catch (ClassNotFoundException ex) {
         ex.printStackTrace();
      }    
   }    

   public List<Book> getBooks() {
      Connection con = null;
      String url = "jdbc:postgresql://localhost:5432/postgres";
      String driver = "org.postgresql.driver";
   
      String userName = "sa";
      String password = "sa";
      List<Book> books = new ArrayList<Book>();
      try {

         Class.forName(driver).newInstance();
         con = DriverManager.getConnection(url , userName, password);

         Statement st = con.createStatement();
         ResultSet rs = st.executeQuery("select * from book");

         Book book;
         while (rs.next()) {
            book = new Book();
            book.setId(rs.getInt(1));                 
            book.setName(rs.getString(2));
            books.add(book);
         }
      } catch (SQLException ex) {
         ex.printStackTrace();
      } catch (InstantiationException ex) {
         ex.printStackTrace();
      } catch (IllegalAccessException ex) {
         ex.printStackTrace();
      } catch (ClassNotFoundException ex) {
         ex.printStackTrace();
      }
      return books;
   }
}
  • Non appena distribuisci il progetto EjbComponent su JBOSS, osserva il registro di jboss.

  • JBoss ha creato automaticamente una voce JNDI per il nostro bean di sessione - LibraryPersistentBean/remote.

  • Useremo questa stringa di ricerca per ottenere un oggetto business remoto di tipo - com.tutorialspoint.stateless.LibraryPersistentBeanRemote

Output del registro di JBoss Application Server

...
16:30:01,401 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
   LibraryPersistentBean/remote - EJB3.x Default Remote Business Interface
   LibraryPersistentBean/remote-com.tutorialspoint.stateless.LibraryPersistentBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO  [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=LibraryPersistentBeanRemote,service=EJB3
16:30:02,723 INFO  [EJBContainer] STARTED EJB: com.tutorialspoint.stateless.LibraryPersistentBeanRemote ejbName: LibraryPersistentBean
16:30:02,731 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

   LibraryPersistentBean/remote - EJB3.x Default Remote Business Interface
   LibraryPersistentBean/remote-com.tutorialspoint.stateless.LibraryPersistentBeanRemote - EJB3.x Remote Business Interface
...

EJBTester (client EJB)

jndi.properties

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
  • Queste proprietà vengono utilizzate per inizializzare l'oggetto InitialContext del servizio di denominazione java.

  • L'oggetto InitialContext verrà utilizzato per cercare il bean di sessione senza stato.

EJBTester.java

package com.tutorialspoint.test;
   
import com.tutorialspoint.stateless.LibraryPersistentBeanRemote;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class EJBTester {

   BufferedReader brConsoleReader = null; 
   Properties props;
   InitialContext ctx;
   {
      props = new Properties();
      try {
         props.load(new FileInputStream("jndi.properties"));
      } catch (IOException ex) {
         ex.printStackTrace();
      }
      try {
         ctx = new InitialContext(props);            
      } catch (NamingException ex) {
         ex.printStackTrace();
      }
      brConsoleReader = 
      new BufferedReader(new InputStreamReader(System.in));
   }
   
   public static void main(String[] args) {

      EJBTester ejbTester = new EJBTester();

      ejbTester.testEntityEjb();
   }
   
   private void showGUI() {
      System.out.println("**********************");
      System.out.println("Welcome to Book Store");
      System.out.println("**********************");
      System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice: ");
   }
   
   private void testEntityEjb() {

      try {
         int choice = 1; 

         LibraryPersistentBeanRemote libraryBean =
         LibraryPersistentBeanRemote)
         ctx.lookup("LibraryPersistentBean/remote");

         while (choice != 2) {
            String bookName;
            showGUI();
            String strChoice = brConsoleReader.readLine();
            choice = Integer.parseInt(strChoice);
            if (choice == 1) {
               System.out.print("Enter book name: ");
               bookName = brConsoleReader.readLine();
               Book book = new Book();
               book.setName(bookName);
               libraryBean.addBook(book);          
            } else if (choice == 2) {
               break;
            }
         }

         List<Book> booksList = libraryBean.getBooks();

         System.out.println("Book(s) entered so far: " + booksList.size());
         int i = 0;
         for (Book book:booksList) {
            System.out.println((i+1)+". " + book.getName());
            i++;
         }           
      } catch (Exception e) {
         System.out.println(e.getMessage());
         e.printStackTrace();
      }finally {
         try {
            if(brConsoleReader !=null) {
               brConsoleReader.close();
            }
         } catch (IOException ex) {
            System.out.println(ex.getMessage());
         }
      }
   }
}

EJBTester esegue le seguenti attività:

  • Carica le proprietà da jndi.properties e inizializza l'oggetto InitialContext.

  • Nel metodo testStatefulEjb (), la ricerca jndi viene eseguita con il nome - "LibraryStatelessSessionBean / remote" per ottenere l'oggetto business remoto (EJB stateful).

  • Quindi all'utente viene mostrata l'interfaccia utente di un negozio della libreria e gli viene chiesto di inserire una scelta.

  • Se l'utente immette 1, il sistema richiede il nome del libro e salva il libro utilizzando il metodo addBook () del bean di sessione senza stato. Il bean di sessione mantiene il libro nel database tramite la chiamata EntityManager.

  • Se l'utente immette 2, il sistema recupera i libri utilizzando il metodo getBooks () del bean di sessione senza stato ed esce.

  • Quindi viene eseguita un'altra ricerca jndi con il nome - "LibraryStatelessSessionBean / remote" per ottenere nuovamente l'oggetto business remoto (EJB stateful) e l'elenco dei libri è fatto.

Eseguire il client per accedere a EJB

Individua EJBTester.java in Esplora progetti. Fare clic con il tasto destro sulla classe EJBTester e selezionarerun file.

Verificare il seguente output nella console Netbeans.

run:
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 1
Enter book name: Learn Java
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 2
Book(s) entered so far: 1
1. learn java
BUILD SUCCESSFUL (total time: 15 seconds)