天天看點

資料庫通路層Dao業務邏輯小記錄(二)

我比較喜歡海藍色,海藍天藍,心情海藍,希望我堅持下來,以前沒有即時的記錄,過去這麼久了,才拼命的去回憶,思路會有斷痕,有褶皺。

在具體實作由Dao層定義的接口時,我采用的是JPA規範,JPA全稱叫Java持久化API,百度百科說JPA通過JDK 5.0注解或XML描述對象-關系表的映射關系,并将運作期的實體對象持久化到資料庫中。了解它,需要實踐它。

1.同樣在base包下建立抽象類DaoSupport.class,并實作接口Dao。由于是使用了JPA規範,是以加入注解Transicational,作用是為類中的方法加入事物。

View Code

/**
    預設:方法被加入事物,傳播行為:Propagation.REQUIRED
*/
@Transactional
public abstract class DaoSupport implements DAO {
}      

2.注入實體管理其,EntityManager對象,通過注解PersistenceContext

View Code

// 注入EntityManager
    @PersistenceContext
    protected EntityManager em;      

3.實作具體的方法時,可直接使用EntityManager 提供的内置方法,也可以通過sql語句來實作,這裡使用前者。

4.簡要記錄:儲存對象-->persist(含有很好了解,使對象持久化的存儲),删除資料,通過id找到具體對象,在remove。設計到,remove,和getReference方法。

更新對象(資料)--> merger,可了解為使對象狀态由遊離狀态合并(merge)為持久化狀态。由于DaoSupport是抽象類,是以子類隻需要繼承該類,便可以直接調用這些方法,不需要再重寫。

View Code

/**
     * 執行過程 AOP程式設計,方法入口:em被注入值(執行個體化),打開事物,事物操作,關閉操作
     */
    @Override
    public void save(Object entity) {
        em.persist(entity);
        
    }

    @Override
    public void update(Object entity) {

        em.merge(entity);
    }

    @Override
    public <T> void delete(Class<T> entityclazz, Object... entityids) {

        for (Object id : entityids) {
            em.remove(em.getReference(entityclazz, id));
        }
    }      

View Code

@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
    @Override
    public <T> T search(Class<T> entityclazz, Object entityid) {

        return em.find(entityclazz, entityid);
}      

5.往往實作分頁查詢都是要複雜一些,由于接口中定義的分頁查詢都是方法的重載,是以就好辦了,不用去寫每個方法,實作最複雜的一個吧。

6.通過反射擷取實體名

View Code

/***
     * 反射擷取實體名
     * 
     * @param entityClass
     * @return
     */
    protected <T> String getEntityName(Class<T> entityClass) {
        String entityName = entityClass.getSimpleName();
        Entity entity = entityClass.getAnnotation(Entity.class);
        System.out.println(entity.name());
        if (entity.name() != null && !"".equals(entity.name())) {
            entityName = entity.name();
        }

        System.out.println("實體名 : " + entityName);
        return entityName;
    }      

7.拼湊order by 語句

View Code

/**
     * 根據一些鍵值,拼湊order by 語句
     * 例如:order by id(key) desc(value)
     * @param orderby
     * @return
     */
    protected String buildOrderby(LinkedHashMap<String, String> orderby) {

        if (orderby != null && orderby.size() > 0) {
            StringBuffer sql = new StringBuffer("");
            sql.append(" order by ");

            // 拼湊order by 語句
            for (String key : orderby.keySet()) {
                sql.append("o.").append(key).append(" ")
                        .append(orderby.get(key)).append(",");
            }

            sql.deleteCharAt(sql.length() - 1);

            return sql.toString();
        }

        return "";
    }      

8.動态設定參數

View Code

/**
     * 為查詢添加參數,?1,?2,
     * 
     * @param query
     * @param params
     */
    public  void setParamters(Query query, Object[] params) {

        if (params != null && params.length > 0) {
            for (int i = 0; i < params.length; ++i) {
                query.setParameter(i + 1, params[i]);
            }
        }
    }      

9.具體實作

View Code

@SuppressWarnings("unchecked")
    @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
    public <T> QueryResult<T> getScrollData(Class<T> entityclass,
            int startIndex, int maxCount, String whereJpql, Object[] params,
            LinkedHashMap<String, String> orderby) {

        QueryResult<T> qr = new QueryResult<T>();
        String entityName = getEntityName(entityclass);
        String sql = "select o from " + entityName + " o "
                + (whereJpql == null ? "" : "where " + whereJpql)
                + buildOrderby(orderby);
        String sql2 = "select count(o) from " + entityName + " o "
                + (whereJpql == null ? "" : "where " + whereJpql);
        Query query = em.createQuery(sql);
        setParamters(query, params);
        
        if(startIndex != -1 && maxCount != -1) {
            query.setFirstResult(startIndex);
            query.setMaxResults(maxCount);
        }
        
        qr.setResults(query.getResultList());
        query = em.createQuery(sql2);
        setParamters(query, params);
        qr.setCount((Long) query.getSingleResult());

        return qr;
    }      

10.重載方法調用

View Code

@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
    @Override
    public <T> QueryResult<T> getScrollData(Class<T> entityclass,
            int startIndex, int maxCount) {
        return getScrollData(entityclass, startIndex, maxCount, null, null, null);
    }

    @Override
    public <T> QueryResult<T> getScrollData(Class<T> entityclass,
            int startIndex, int maxCount, String whereJpql, Object[] params) {
        return getScrollData(entityclass, startIndex, maxCount, whereJpql, params, null);
    }

    @Override
    public <T> QueryResult<T> getScrollData(Class<T> entityclass,
            int startIndex, int maxCount, LinkedHashMap<String, String> orderby) {
        return getScrollData(entityclass, startIndex, maxCount, null,null, orderby);
    }

    @Override
    public <T> QueryResult<T> getScrollData(Class<T> entityclass) {
        return getScrollData(entityclass, -1, -1);
    }      

11.由于是面向AOP程式設計,通常是采用面向接口操作。步驟:定義接口,該接口繼承Dao,定義實作類繼承DaoSupport,并實作該接口。該實作類基本上可以滿足常用業務了。

View Code

public interface StyleService extends DAO{

}

@Service("productStyleService")
@Transactional
public class StyleServiceBean extends DaoSupport implements StyleService{

}      

這次note暫時到這裡吧,祝我順利哈。