天天看點

jee6 學習筆記 3 - an EJB3.1 DAO

DAO interface.

package com.jxee.ejb;

import javax.ejb.Local;
import com.jxee.model.User;

/**
 * although it's not required, it's good practice to define a DAO interface.
 * annotation @Local marks this as an EJB local interface.
 */
@Local
public interface UserDAO {
  public User findUserByName(String username);
}
           

DAO implemented as an EJB3.1 Stateless bean

package com.jxee.ejb;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.log4j.Logger;
import com.jxee.model.User;

/** 
 * annotation @Stateless marks a POJO as a stateless EJB and thus it
 * would have all the services available, like transaction management etc.
 */
@Stateless
public class UserDAOImp implements UserDAO {

  private static final Logger log = Logger.getLogger(UserDAOImp.class);

  // inject the persistence unit to have access to database
  @PersistenceContext(unitName="punit.projee6")
  private EntityManager em;

  // @EJB AnotherEJB toInjectOtherEJB;

  /**
   * method throws runtime exception like "NoResultException" and
   * "NonUniqueResultException" etc, which you dont need to handle.
   * but you might want to handle it, such as "NoResultException".
   */
  public User findUserByName(String username) {
    log.debug("finding user for name: " + username);
    String sql = "select u from User u where u.username = :username";
    Query query = em.createQuery(sql);
    query.setParameter("username", username);
    return (User)query.getSingleResult(); // may throw runtime exceptions
  }
}
           

小姐一下(本文不得不承認,windows中文輸入很邪惡 :twisted: ):

1。 從EJB3.0開始,開發EJB已經非常友善了。不需要處理lifecycle,不需要進行讨厭的xml配置,利用annotation很容易。做個譬喻:都是洋芋,但ejb2是帶泥的洋芋,而ejb3則不帶泥了,洗巴的幹幹淨淨,多好。EJBs阿POJOs,測試起來也比較容易了吧。。。如果你測試上瘾的話, 哈哈。。。 :lol:

2。 DI 很友善,死腦筋(spring)還有什麼優勢?真是三十年河東,又三十年河西。

3。 JPA在ORM架子上又抽象了一下,提供标準的API,這多舒坦啊,别再折騰XML了!

下一篇 CRUD 一下: jee6 學習筆記 4 - CRUD