zoukankan      html  css  js  c++  java
  • 数据库访问层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暂时到这里吧,祝我顺利哈。

      

     

      

      

  • 相关阅读:
    Codeforces Round #325 (Div. 2) F:(meet in the middle)
    Educational Codeforces Round 3:E (MST+树链剖分+RMQ)
    Educational Codeforces Round 3:D. Gadgets for dollars and pounds(二分答案+贪心)
    CodeForce 484B:(最大余数)
    CodeForce 540C:(DFS)
    HDU 1010:(DFS)
    Poj1741-Tree(树分治)
    uva10245-The Closest Pair Problem(平面上的点分治)
    hdu1561-The more, The Better(树形dp)
    hdu2196-Computer(树形dp)
  • 原文地址:https://www.cnblogs.com/scherrer/p/2941337.html
Copyright © 2011-2022 走看看