zoukankan      html  css  js  c++  java
  • 我的通用dao理解

    首先声明我的资料大我来自javaeye,先谢谢各位.
    但因本人理解能力不足,现把我对通用DAO的引用贴出,望大家指点.
    1.BaseDAO 接口
    public interface BaseDAO<T, ID extends Serializable> {
    public void save(T entity);
    public void delete(T entity);
    public T findById(Class<T> entityClass, ID id);
    }
    2.BaseDAO 的实现
    public class BaseHibernateDAO<T, ID extends Serializable> extends HibernateDaoSupport implements BaseDAO<T,ID> {  
          private static final Logger logger = Logger.getLogger(BaseHibernateDAO.class);  
        public void save(T entity) {          
            try {  
                getHibernateTemplate().save(entity);  
            } catch (RuntimeException e) {  
                logger.error("保存实体异常", e);  
                throw e;  
            }  
        }  

        public void delete(T entity) {  
            try {  
                getHibernateTemplate().delete(entity);  
            } catch (RuntimeException e) {  
                logger.error("删除实体异常", e);  
                throw e;  
            }  
        }  

        public void saveOrUpdate(T entity) {  
            try {  
                getHibernateTemplate().saveOrUpdate(entity);  
            } catch (RuntimeException e) {  
                logger.error("更新或保存实体异常", e);  
                throw e;  
            }  
        }  

        @SuppressWarnings("unchecked")  
        public T findById(Class<T> entityClass, ID id) {  
            try {  
                return (T) getHibernateTemplate().get(entityClass, id);  
            } catch (RuntimeException e) {  
                logger.error("查找指定ID实体异常,ID:" + id, e);  
                throw e;  
            }  
        }  
    3.一个实体DAO接口extends BaseDAO
    public interface ProductDAO extends BaseDAO<Product,Integer>{
    //如添加
    public void productInsert(Product entity);
             public void findById(Product entityClass, Integer id)
            //如除crud外Product自己的业务的方法
              public void myProductDelete(class clz,Serializable pk);
    ......
    }
    4.实体DAO的实现
    public class ProductDAOImpl extends BaseHibernateDAO<Product,Integer> implements
    ProductDAO {
           public void productInsert(Product entity) {
    save(entity);
           }
        public void findById(Class<T> entityClass, ID id) {
    findById(entityClass,id);
           }
            public void myProductDelete(class clz,Serializable pk){
               Object object = this.getHibernateTemplate().get(clazz, pk);
    this.getHibernateTemplate().delete(object);     
    }
    ........
    }
    5.service层 实体接口
    public interface ProductService {
    // 添加
    public void productInsert(Product entity) throws ProductException;
             public void save(Product entity) throws ProductException;
    public void delete(Product entity) throws ProductException;
    public Product findById(Product entityClass, Integer) throws ProductException;
    }
    6.service层 实体service实现
    public class ProductServiceImpl implements ProductService {
    private ProductDAO productDAOImpl;

    public void delete(int id) throws ProductException {
    try{
    productDAOImpl.Delete(productDAOImpl.findproductByPrimaryKey(id));
    }catch(Exception e ){
    e.printStackTrace();
    throw new ProductException(this.getClass().getName()+"Product Delete 删除失败");
    }
    }

    public void save(Product product) throws ProductException {
    try{
    productDAOImpl.save(product);
    }catch(Exception e){
    e.printStackTrace();
    throw new ProductException(this.getClass().getName()+"Product Insert 添加失败");
    }
    .......
    }


    请大家帮我看看我这个通用baseDAO的设计是否合理?
    具体如:
    1.dao的设计有没错?
    2.T Class<T>等泛型,反射有没错?
    3.service层的传值有没错?
    4.这样的异常处理合理吗?
    5.就这样的写法是否存在不合理的的写法,而我又不知道的?

    下面我又接着写了action异常处理,大家看看是否合理
    请先看配置:
    1.struts-config.xml配置
    <global-exceptions>
       <exception key="error" type="com.kkk.exceptions.ChipInException" path="/commons/messages.jsp"/>
    </global-exceptions>
    2.action中的代码
    public ActionForward saveChip(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {

    if(ename==null||ename.equals("")){
    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("ename.null"));
    saveMessages(request, messages);
        throw new ChipInException("名字为空");
    }
    try{
    xxxServiceImpl.insert(product);
    }catch(Exception e ){
    e.printStackTrace();
    throw new ChipInException("保存失败");
    }

    }
    3.资源文件中的配置
    error=some errors here
    ename.null=please select one name first!!!  
    4.显示异常页面
    <%-- Error Messages --%>
    <logic:messagesPresent>
    <div class="error">
    <html:messages id="error">
    ${error}<br/>
    </html:messages>
    </div>
    </logic:messagesPresent>

    <%-- Success Messages --%>
    <logic:messagesPresent message="true">
    <div class="message" id="message">
    <html:messages id="message" message="true">
    ${message}<br/>
    </html:messages>
    </div>

    <script type="text/javascript">

    new Effect.Highlight('message');
    window.setTimeout("Effect.DropOut('message')", 1000);

    </script>
    </logic:messagesPresent>


    我的问题是

    我这里的异常处理及转向合理吗?配置文件的配置有没错?
    key="error"是不是说明会读取资源文件中的error的值到messages.jsp页面显示?
    还是说显示我action中的messages存的ename.null的资源文件值信息?
    其实具体应该如何来进行这个异常处理在这几个文件中的配置?这里的异常显示页面message.jsp会不会和<global forwards>的有重合?
    我要让"名字为空"这几个字在message.jsp页面中显示有办法吗?

    Effect未定义是不是少了包支持?
  • 相关阅读:
    AC日记——红色的幻想乡 洛谷 P3801
    AC日记——Power收集 洛谷 P3800
    AC日记——妖梦拼木棒 洛谷 P3799
    AC日记——妖梦斩木棒 洛谷 P3797
    AC日记——小魔女帕琪 洛谷 P3802
    AC日记——双栈排序 洛谷 P1155
    AC日记——明明的烦恼 bzoj 1005
    AC日记——[HNOI2014]世界树 bzoj 3572
    AC日记——魔法森林 洛谷 P2387
    AC日记——【模板】点分治(聪聪可可) 洛谷 P2634
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400839.html
Copyright © 2011-2022 走看看