雷林鵬分享:EJB訪問數據庫

  EJB 3.0持久性機制來訪問容器管理的數據庫中的數據庫相關的操作。開發人員訪問數據庫可以直接使用JDBC API調用EJB的業務方法。

  爲了證明在ejb的數據庫訪問,我們要做好以下幾項工作。

  步驟 1. 在數據庫中創建表.

  步驟 2. 創建一個無狀態EJB.

  步驟 3. 更新無狀態的EJB。添加添加記錄並獲得通過實體管理器從數據庫中記錄的方法。

  步驟 4. 一個基於控制檯應用程序客戶端將訪問無狀態EJB的持久化數據庫中的數據。

  創建表

  創建一張表 books 在默認的數據庫 postgres.

  CREATE TABLE books (

  id integer PRIMARY KEY,

  name varchar(50)

  );

  創建模型類

  public class Book implements Serializable{

  private int id;

  private String name;

  public Book(){

  }

  public int getId() {

  return id;

  }

  ...

  }

  創建無狀態EJB

  @Stateless

  public class LibraryPersistentBean implements LibraryPersistentBeanRemote {

  public void addBook(Book book) {

  //persist book using jdbc calls - by manongjc.com

  }

  public List getBooks() {

  //get books using jdbc calls

  }

  ...

  }

  構建EJB模塊後,我們需要一個無狀態的bean,我們將在下一節要創建客戶端來訪問。

  實例應用

  讓我們創建一個測試EJB應用程序來測試EJB的數據庫訪問機制。

  Step描述

  1Create a project with a name EjbComponent under a package com.tutorialspoint.entity as explained in the EJB - Create Application chapter. You can also use the project created in EJB - Create Application chapter as such for this chapter to understand ejb data access concepts.

  2Create Book.java under package com.tutorialspoint.entity and modify it as shown below.

  3Create LibraryPersistentBean.java and LibraryPersistentBeanRemote as explained in the EJB - Create Application chapter and modify them as shown below.

  4Clean and Build the application to make sure business logic is working as per the requirements.

  5Finally, deploy the application in the form of jar file on JBoss Application Server. JBoss Application server will get started automatically if it is not started yet.

  6Now create the ejb client, a console based application in the same way as explained in theEJB - Create Application chapter under topic Create Client to access EJB. Modify it as shown below.

  EJBComponent (EJB Module)

  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 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 books = new ArrayList();

  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 getBooks() {

  Connection con = null;

  String url = "jdbc:postgresql://localhost:5432/postgres";

  String driver = "org.postgresql.driver";

  String userName = "sa";

  String password = "sa";

  List books = new ArrayList();

  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;

  }

  }

  只要你在JBoss部署 EjbComponent項目,注意到jboss的日誌。

  JBoss已經自動爲我們的會話bean創建一個JNDI條目 -LibraryPersistentBean/remote.

  我們將使用這個查詢字符串來獲得遠程類型的業務對象 -com.tutorialspoint.stateless.LibraryPersistentBeanRemote

  JBoss應用服務器的日誌輸出

  ...

  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 (EJB Client)

  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

  這些屬性是用來初始化InitialContext對象的Java命名服務

  InitialContext的對象將被用於查找無狀態會話bean

  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 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做以下任務。

  jndi.properties中加載和初始化的InitialContext對象。

  在testStatefulEjb()方法,JNDI名稱進行查找 - "LibraryStatelessSessionBean/remote"以獲得遠程業務對象(狀態EJB)。

  然後用戶顯示一個庫存儲的用戶界面和他/她被要求輸入選擇。

  如果用戶輸入1,系統要求輸入書籍名稱和可以節省使用無狀態的會話bean addBook()方法。會話Bean堅持這本書中通過EntityManager的調用數據庫。

  如果用戶輸入2,系統檢索書使用狀態會話Bean getBooks()方法和退出。

  然後另一個JNDI名稱進行查找 - "LibraryStatelessSessionBean/remote" 獲得遠程業務對象(狀態EJB)再次列出書籍。

  運行客戶端訪問EJB

  在項目資源管理器中找到EJBTester.java。右鍵點擊上EJBTester類,並選擇run file.

  在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)

  (編輯:雷林鵬 來源:網絡|侵刪)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章