SSH開發各層的抽取

一.抽取dao層

一.定義通用接口

public interface BaseDao<T> {
	public void save(T t);
	public void update(T t);
	public void delete(T t);
	public T findById(Serializable id);
	public List<T> findAll();
	public Integer findCount(DetachedCriteria detachedCriteria);
	public List<T> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize);
}

二.定義實現類

方式一:在實現類的構造方法中傳入一個Class

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
	
	private Class clazz;
	/*在父類中提供了有參數的構造方法,在子類的構造中,調用父類的有參數的構造*/
	public BaseDaoImpl(Class clazz){
		this.clazz = clazz;
	}

	@Override
	public void save(T t) {
		this.getHibernateTemplate().save(t);
	}

	@Override
	public void update(T t) {
		this.getHibernateTemplate().update(t);
	}

	@Override
	public void delete(T t) {
		this.getHibernateTemplate().delete(t);
	}

	@Override
	public T findById(Serializable id) {
		return (T) this.getHibernateTemplate().get(clazz, id);
	}

	@Override
	public List<T> findAll() {
		return (List<T>) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
	}

	@Override
	public Integer findCount(DetachedCriteria detachedCriteria) {
		detachedCriteria.setProjection(Projections.rowCount());
		List<Long> list  = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
		if(list.size()>0){
			return list.get(0).intValue();
		}
		return null;
	}

	@Override
	public List<T> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize) {
		detachedCriteria.setProjection(null);
		return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria, begin, pageSize);
	}

}

這樣抽取完成以後,那麼在編寫dao的時候如果裏面都是一些crud的操作,在dao中只需要提供構造方法即可

  • 在客戶的dao的實現類中
    • public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
      	public CustomerDaoImpl(){
      		super(Customer.class);
      	}
      }

       

  • 在聯繫人的dao的實現類中
    • public class LinkManDaoImpl extends BaseDaoImpl<LinkMan> implements LinkManDao {
      	public LinkManDaoImpl(){
      		super(LinkMan.class);
      	}
      }

       

注意:子類接口也要繼承父類接口

public interface CustomerDao extends BaseDao<Customer>{

}
public interface LinkManDao extends BaseDao<LinkMan>{

}

方式二:通過泛型的反射抽取通用的dao

定義實現類

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
	
	private Class clazz;
	
	public BaseDaoImpl(){
		//反射:第一步獲得class
		Class clazz = this.getClass();
		Type type = clazz.getGenericSuperclass();
		//得到這個type就是一個參數化的類型,將type強換成參數化類型
		ParameterizedType pType = (ParameterizedType)type;
		//通過參數化類型獲得實際類型:得到一個實際類型參數的數組
		Type[] types = pType.getActualTypeArguments();
		//只獲得第一個實際類型參數
		this.clazz = (Class) types[0];
	}

	@Override
	public void save(T t) {
		this.getHibernateTemplate().save(t);
	}

	@Override
	public void update(T t) {
		this.getHibernateTemplate().update(t);
	}

	@Override
	public void delete(T t) {
		this.getHibernateTemplate().delete(t);
	}

	@Override
	public T findById(Serializable id) {
		return (T) this.getHibernateTemplate().get(clazz, id);
	}

	@Override
	public List<T> findAll() {
		return (List<T>) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
	}

	@Override
	public Integer findCount(DetachedCriteria detachedCriteria) {
		detachedCriteria.setProjection(Projections.rowCount());
		List<Long> list  = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
		if(list.size()>0){
			return list.get(0).intValue();
		}
		return null;
	}

	@Override
	public List<T> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize) {
		detachedCriteria.setProjection(null);
		return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria, begin, pageSize);
	}

}

這樣一來使用時只需定義子類繼承父類即可

public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {

}
public class LinkManDaoImpl extends BaseDaoImpl<LinkMan> implements LinkManDao {

}

子類接口的定義同上!

二.抽取Biz層

2.1 定義通用接口和實現類

public interface IBaseBiz<T> {
	
	/**
	 * 通過編號查詢對象
	 * @param uuid
	 * @return
	 */
	T get(Long uuid);
	
	/**
	 * 更新
	 */
	void update(T t);
	
	/**
	 * 刪除
	 */
	void delete(Long uuid);
	
	/**
	 * 新增
	 * @param t
	 */
	void add(T t);
	
	/**
	 * 查詢所有部門
	 * @return
	 */
	List<T> getList();
	
	/**
	 * 條件查詢部門信息
	 * @param t1
	 * @return
	 */
	List<T> getList(T t1,T t2,Object param,int firstResult, int maxResults);
	/**
	 * 獲取記錄總數
	 * @param t1
	 * @param t2
	 * @param param
	 * @return
	 */
	long getCount(T t1,T t2,Object param);
}
public class BaseBiz<T> implements IBaseBiz<T> {

	//dao層注入
	private IBaseDao<T> baseDao;
	
	public IBaseDao<T> getBaseDao() {
		return baseDao;
	}
	public void setBaseDao(IBaseDao<T> baseDao) {
		this.baseDao = baseDao;
	}
	/**
	 * 獲取所有部門
	 */
	public List<T> getList() {
		return baseDao.getList();
	}
	/**
	 * 條件查詢部門信息
	 */
	public List<T> getList(T t1,T t2,Object param,int firstResult, int maxResults) {
		return baseDao.getList(t1,t2,param,firstResult, maxResults);
	}
	/**
	 * 查詢總記錄數
	 */
	public long getCount(T t1,T t2,Object param) {
		return baseDao.getCount(t1,t2,param);
	}
	
	/**
	 * 新增部門
	 */
	public void add(T t) {
		baseDao.add(t);
	}
	
	/**
	 * 刪除
	 */
	public void delete(Long uuid){
		baseDao.delete(uuid);
	}
	/**
	 * 通過編號查詢對象
	 * @param uuid
	 * @return
	 */
	public T get(Long uuid){
		return baseDao.get(uuid);
	}
	
	/**
	 * 更新
	 */
	public void update(T t){
		baseDao.update(t);
	}

}

2.2 使用案例

public interface IDepBiz extends IBaseBiz<Dep> {

}
public class DepBiz extends BaseBiz<Dep> implements IDepBiz {

	//數據訪問注入
	private IDepDao depDao;

	public IDepDao getDepDao() {
		return depDao;
	}

	public void setDepDao(IDepDao depDao) {
		this.depDao = depDao;
		super.setBaseDao(depDao);
	}

}

三.抽取Action

3.1 抽取通用action

public class BaseAction<T> {
	
	private T t1;
	private T t2;
	private Object param;
	public T getT2() {
		return t2;
	}
	public void setT2(T t2) {
		this.t2 = t2;
	}
	public Object getParam() {
		return param;
	}
	public void setParam(Object param) {
		this.param = param;
	}
	public T getT1() {
		return t1;
	}
	public void setT1(T t1) {
		this.t1 = t1;
	}
	//分頁參數
	private int page;//頁碼
	private int rows;//每頁的記錄數
	
	public int getPage() {
		return page;
	}
	public void setPage(int page) {
		this.page = page;
	}
	public int getRows() {
		return rows;
	}
	public void setRows(int rows) {
		this.rows = rows;
	}	
	//注入Biz
	private IBaseBiz<T> baseBiz;
	
	public IBaseBiz<T> getBaseBiz() {
		return baseBiz;
	}
	public void setBaseBiz(IBaseBiz<T> baseBiz) {
		this.baseBiz = baseBiz;
	}

	/**
	 * 條件查詢部門信息
	 */
	public void listByPage(){
			int firstResult = (page -1) * rows;
			List<T> list = baseBiz.getList(t1,t2,param,firstResult,rows);
			long total = baseBiz.getCount(t1,t2,param);
			Map<String, Object> mapData = new HashMap<String, Object>();
			mapData.put("total", total);
			mapData.put("rows", list);
			String listString = JSON.toJSONString(mapData);
			write(listString);
			
	}
	
	/**
	 * 查詢所有部門信息
	 */
	public void list(){
		try {
			List<T> list = baseBiz.getList();
			String listString = JSON.toJSONString(list);
			HttpServletResponse response = ServletActionContext.getResponse();
			response.setContentType("text/html;charset=utf-8");
			response.getWriter().write(listString);
		} catch (IOException e) {
			e.printStackTrace();
		};
	}
	
	/**
	 * 轉換json數據並返回到頁面
	 * @param jsonString
	 */
	public void write(String jsonString){
		try {
			//響應對象
			HttpServletResponse response = ServletActionContext.getResponse();
			//設置編碼
			response.setContentType("text/html;charset=utf-8"); 
			//輸出給頁面
			response.getWriter().write(jsonString);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**新增。。。修改*/
	private T t;
	public T getT() {
		return t;
	}
	public void setT(T t) {
		this.t = t;
	}
	/**
	 * 增加一個部門
	 */
	public void add(){
		//{"success":true,"message":""}
		//返回前端的JSON數據
		System.out.println(t);
		try {
			baseBiz.add(t);
			ajaxReturn(true, "新增成功");
		} catch (Exception e) {
			e.printStackTrace();
			ajaxReturn(false, "新增失敗");
		}
	}
	private long id;
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	/**
	 * 刪除
	 * @param jsonString
	 */
	public void delete(){
		
		try {
			baseBiz.delete(id);
			ajaxReturn(true, "刪除成功");
		} catch (Exception e) {
			e.printStackTrace();
			ajaxReturn(false, "刪除失敗");
		}
	}
	
	/**
	 * 通過編輯查詢對象
	 */
	public void get(){
		T t = baseBiz.get(id);
		String jsonString = JSON.toJSONString(t);
		System.out.println("轉換前:" + jsonString);
		//{"name":"管理員組","tele":"000011","uuid":1}
		String jsonStringAfter = mapData(jsonString, "t");
		System.out.println("轉換後:" + jsonStringAfter);
		write(jsonStringAfter);
	}
	
	/**
	 * 修改原json中的key名稱與頁面name值相同
	 * //{"name":"管理員組","tele":"000011","uuid":1} 
	 * @param jsonString JSON數據字符串
	 * @param prefix 要加上的前綴
	 * @return  {"t.name":"管理員組","t.tele":"000011","t.uuid":1} 
	 */
	public String mapData(String jsonString, String prefix){
		Map<String, Object> map = JSON.parseObject(jsonString);
		
		//存儲key加上前綴後的值
		Map<String, Object> dataMap = new HashMap<String, Object>();
		//給每key值加上前綴
		for(String key : map.keySet()){
			dataMap.put(prefix + "." + key, map.get(key));
		}
		return JSON.toJSONString(dataMap);
	}
	/**
	 * 修改
	 */
	public void update(){
		try {
			baseBiz.update(t);
			ajaxReturn(true, "修改成功");
		} catch (Exception e) {
			e.printStackTrace();
			ajaxReturn(false, "修改失敗");
		}
	}
	
	/**
	 * 返回操作結果
	 * @param success
	 * @param message
	 */
	public void ajaxReturn(boolean success, String message){
		//返回前端的JSON數據
		Map<String, Object> rtn = new HashMap<String, Object>();
		rtn.put("success",success);
		rtn.put("message",message);
		write(JSON.toJSONString(rtn));
	}
}

3.2 使用案例

public class DepAction extends BaseAction<Dep> {
	
	//注入Biz
	private IDepBiz depBiz;
	
	public IDepBiz getDepBiz() {
		return depBiz;
	}
	public void setDepBiz(IDepBiz depBiz) {
		this.depBiz = depBiz;
		super.setBaseBiz(this.depBiz);
	}
	
}

 

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