JPA 泛型DAO 封裝

來源:互聯網
上載者:User

      對於在Web容器中使用EntityManager對象,這裡需要做一些改進,才能更安全。Servlet是非安全執行緒的,所以需要改變獲得EntityManager對象的方式,這裡使用ThreadLocal類。 
ThreadLocal就是為每一個使用某變數的線程都提供一個該變數值的副本,使每一個線程都可以獨立地改變自己的副本,而不會和其他線程的副本衝突。從線程的角度看,就好像每一個線程都完全擁有一個該變數,這就解決了Servlet非安全執行緒的問題。

      以下EntityManager對象非容器EJB容器託管,手動控制交易處理。可用於JAVA SE環境。如果是EJB容器管理,或者WEB容器,可以直接注入@PersistenceContext,使用JTA、RESOURCE_LOCAL交易管理。

import java.io.Serializable; import java.util.Collection; import java.util.List; /** * * <p>Title: 資料庫操作介面</p> * <p>Description:EasyJWeb Tools中的添刪改查等業務引擎使用該DAO進行資料庫操作 </p> * <p>Copyright: Copyright (c) 2006</p> * <p>Company: EasyJF開源團隊</p> * @author 大峽 * @version 0.1 */ public interface IDAO<T> { /** * 把對象儲存到持久層 * * @param obj * @return 若儲存成功,則返回true,否則返回false * @throws IdExistException */ boolean save(T obj); /** * 更新持久層中的對象 * * @param obj * @return 若修改成功,則返回true,否則返回false */ boolean update(T obj); /** * 刪除持久層中的對象 * * @param obj * @return 若刪除操作成功,則返回true,否則返回false */ boolean del(T obj); /** * 根據類及主鍵載入對象 * * @param clz * @param id * @return 若尋找到指定主索引值的持久對象,則返回該對象,否則返回null */ T get(Class<T> clz, Serializable id); /** * 根據類、欄位名及欄位值載入對象,只載入一條合格對象。 * * @param clz * @param fieldName * @param value * @return 若查詢到指定屬性及值的持久對象,則返回該對象,否則返回null */ T getBy(Class<T> clz, String fieldName, Serializable value); /** * 根據條件查詢對象 * * @param clz 類名 * @param scope 查詢條件 * @return 返回查詢的記錄結果記錄 */ List<T> query(Class<T> clz, String scope); /** * 根據條件、條件參數查詢對象 * * @param clz 類名 * @param scope 查詢條件 * @param paras 查詢參數 * @return 返回查詢的記錄結果集 */ List<T> query(Class<T> clz, String scope, Collection paras); /** * 查詢合格對象,從begin開始取max條記錄 * * @param clz Java類 * @param scope 查詢條件 * @param paras 查詢參數 * @param begin 返回有效結果開始記錄數 * @param max 返回的最多記錄數 * @return 返回查詢的記錄結果集 */ List<T> query(Class<T> clz, String scope, Collection paras, int begin, int max); /** * 執行sql語句,並返回一個對象,如select count(*) from tableName等 * @param sql sql語句 * @return 返回查詢結果,若沒有結果則返回null */ Object uniqueResult(String sql); /** * 根據sql語句及查詢參數執行查詢,並返回一個唯一對象,如select count(*) from tableName where filed=? * @param sql * @param paras * @return 返回單一的查詢結果,若沒有結果則返回null */ Object uniqueResult(String sql,Collection paras); /** * 執行任意sql語句,返回受影響的記錄數 * @param sql sql語句 * @return 返回受影響的記錄數 */ int execute(String sql); /** * 根據sql語句及參數執行資料庫操作,返回受影響的記錄數 * @param sql sql語句 * @param paras 參數 * @return 返回受影響的記錄數 */ int execute(String sql,Collection paras); }

 

***********************************************

***********************************************

import java.io.Serializable; import java.util.Collection; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Query; public class EntityMangerDaoSurport<T> implements IDAO<T> { private static EntityManagerFactory emf; private static ThreadLocal<EntityManager> em; public EntityManager getEntityManager() { EntityManager manager = em.get(); if (manager == null) { manager = emf.createEntityManager(); em.set(manager); } return manager; } public boolean del(Object obj) { getEntityManager().getTransaction().begin(); if (!getEntityManager().contains(obj)) obj = getEntityManager().merge(obj); getEntityManager().remove(obj); getEntityManager().getTransaction().commit(); return true; } public int execute(String sql) { return execute(sql, null); } public int execute(String sql, Collection paras) { Query query = getEntityManager().createNativeQuery(sql); int parameterIndex = 0; if (paras != null && paras.size() > 0) { for (Object obj : paras) { query.setParameter(parameterIndex++, obj); } } return query.executeUpdate(); } public T get(Class<T> clz, Serializable id) { return getEntityManager().find(clz, id); } public T getBy(Class<T> clz, String fieldName, Serializable value) { Query query = getEntityManager().createQuery( "from " + clz + " where fieldName=?"); query.setParameter(0, value); return (T) query.getSingleResult(); } public List query(Class clz, String scope) { return query(clz, scope, null); } public List query(Class clz, String scope, Collection paras) { return query(clz, scope, null, -1, -1); } public List query(Class clz, String scope, Collection paras, int begin, int max) { Query query = getEntityManager().createQuery( "from " + clz + " where " + scope); int parameterIndex = 0; if (paras != null && paras.size() > 0) { for (Object obj : paras) { query.setParameter(parameterIndex++, obj); } } if (begin >= 0 && max > 0) { query.setFirstResult(begin); query.setMaxResults(max); } return query.getResultList(); } public boolean save(Object obj) { getEntityManager().getTransaction().begin(); getEntityManager().persist(obj); getEntityManager().getTransaction().commit(); return true; } public Object uniqueResult(String sql) { return uniqueResult(sql, null); } public Object uniqueResult(String sql, Collection paras) { Query query = getEntityManager().createQuery(sql); int parameterIndex = 0; if (paras != null && paras.size() > 0) { for (Object obj : paras) { query.setParameter(parameterIndex++, obj); } } return query.getSingleResult(); } public boolean update(Object obj) { getEntityManager().getTransaction().begin(); getEntityManager().merge(obj); getEntityManager().getTransaction().commit(); return true; } }

不是每個人都能制定成標準,但是每個人都有追求標準和超越標準的權利。。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.