我比較喜歡海藍色,海藍天藍,心情海藍,希望我堅持下來,以前沒有即時的記錄,過去這麼久了,才拼命的去回憶,思路會有斷痕,有褶皺。
在具體實作由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暫時到這裡吧,祝我順利哈。