SSH電力項目三 - Dao層、service層查詢實現(HQL)


底層方法封裝:模糊查詢,姓張的人

查詢思路:select * from elec_text o           #Dao層 

        where o.textName like '%張%'     #Service層

      and o.textRemark like '%張%'  #Service層   

        order by o.textDate ASC, o.textName DESC ;  #Service層

為了在業務層對稱,采用如下寫法:

    select * from elec_text o where 1=1  #Dao層

    and o.textName like '%張%'       #Service層

    and o.textRemark like '%張%'        #Service層

    order by o.textDate ASC, textName DESC  #Service層

 

TestService.java

package junit;
public class TestService { @Test public void save(){ ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); IElecTextService elecTextService = (IElecTextService) ac.getBean(IElecTextService.SERVICE_NAME); ElecText e = new ElecText(); e.setTextName("abbbc"); e.setTextDate(new Date()); e.setTextRemark("deeef"); elecTextService.saveElecText(e); }
// @Test
public void findCollectionByConditionNopage(){ ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); IElecTextService elecTextService = (IElecTextService) ac.getBean(IElecTextService.SERVICE_NAME); ElecText elecText = new ElecText(); elecText.setTextName("張"); elecText.setTextRemark("張"); List<ElecText> list = elecTextService.findCollectionByConditionNopage(elecText); if(list != null && list.size() > 0){ for(ElecText text:list){ System.out.println(text.getTextName() + "+"+ text.getTextRemark()); } } } }

ElecTextService.java  接口:

package com.itheima.elec.service;public interface IElecTextService {

    public static final String SERVICE_NAME="com.itheima.elec.service.impl.ElecTextServiceImpl";
    void saveElecText(ElecText elecText);
    List<ElecText> findCollectionByConditionNopage(ElecText elecText);
}

 

ElecTextServiceImpl.java 接口

package com.itheima.elec.service.impl;
//事務控制:spring的聲明事務處理,在service層添加@Transactional
@Service(IElecTextService.SERVICE_NAME)
@Transactional(readOnly=true)
public class ElecTextServiceImpl implements IElecTextService {

    @Resource(name=IElecTextDao.SERVICE_NAME)
    IElecTextDao elecTextDao;
    
    @Transactional(readOnly=false)
    public void saveElecText(ElecText elecText) {
        // TODO Auto-generated method stub
            elecTextDao.save(elecText);
    }

    @Override
    public List<ElecText> findCollectionByConditionNopage(ElecText elecText) {
        //查詢條件
        String condition = "";
        //查詢條件對應的參數
        List<Object> paramsList = new ArrayList<Object>();
//        if(elecText.getTextName() != null && !elecText.getTextName().equals("")){
//                condition += " and o.textName like ?";
//        }
        if(StringUtils.isNotBlank(elecText.getTextName())){
            condition += "  and o.textName like  ?";
            paramsList.add("%" + elecText.getTextName() + "%");
        }
        
        if(StringUtils.isNotBlank(elecText.getTextRemark())){
            condition += "  and o.textRemark like  ?";
            paramsList.add("%" + elecText.getTextRemark() + "%");
        }
        //傳遞可變參數
        Object [] params = paramsList.toArray();
        //排序
        Map<String, String> orderby = new LinkedHashMap<String,String>();
                orderby.put("o.textDate", "asc");
                orderby.put("o.textName", "desc");
      //查詢
      List<ElecText> list = elecTextDao.findCollectionByConditionNoPage(condition,params,orderby);
      return list;
    }

}

 

ICommonDao.java

package com.itheima.elec.dao;public interface ICommonDao<T> {

    void save(T entity);
    void update(T entity);
    T findObjectById(Serializable id);
    void deleteObjectByIds(Serializable... ids);
    void deleteObjectByCollection(List<T> list);
    List<T> findCollectionByConditionNoPage(String condition, Object[] params, Map<String, String> orderby    );
}

 

ICommonDaoImpl.java

package com.itheima.elec.dao.impl;public class CommonDaoImpl<T>  extends HibernateDaoSupport implements ICommonDao<T> {

    //泛型轉化
    Class entityClass = TUtils.getActualType(this.getClass());
    /**
     * 如何來實現這個save方法:通過HibernateDaoSupport 來實現,需要注入sessionFactory
     */
    @Resource
    public void setDi(SessionFactory sessionFactory){
        this.setSessionFactory(sessionFactory);
    }
    @Override
    public void save(T entity) {
        this.getHibernateTemplate().save(entity);
    }

    public void update(T entity){
        this.getHibernateTemplate().update(entity);
    }
    @Override
    public T findObjectById(Serializable id) {
//        Class entityClass = TUtils.getActualType(this.getClass());
        return (T) this.getHibernateTemplate().get(entityClass, id);   //entityClass 此處需要類型
    }
    @Override
    public void deleteObjectByIds(Serializable... ids) {
        if(ids != null && ids.length > 0){
            for(Serializable id:ids){
                Object entity = this.findObjectById(id);
                this.getHibernateTemplate().delete(entity);
            }
        }
//        this.getHibernateTemplate().delete(entity);
    }
    @Override
    public void deleteObjectByCollection(List<T> list) {
            this.getHibernateTemplate().deleteAll(list);
    }
    @Override
    /**
    這里1=1的目的是方便在Service層拼裝sql或者hql語句,連接統一使用and
     * SELECT o FROM ElecText o WHERE 1=1             #Dao層填寫
            AND o.textName LIKE '%張%'                  #Service拼裝
            AND o.textRemark LIKE '%張%'                #Service拼裝
            ORDER BY o.textDate ASC,o.textName desc   #Service拼裝
     */
    public List<T> findCollectionByConditionNoPage(String condition, Object[] params, Map<String, String> orderby) {
        //hql語句
        String hql = "from " + entityClass.getSimpleName() + "  o where 1 = 1"; //將Map集合中存放的字段排序,組織成ORDER BY o.textDate ASC, o.textName Desc
        String orderByCondition = this.orderByHql(orderby); //添加查詢條件
        String finalHql = hql + condition + orderByCondition; //查詢,執行sql語句
        //方法一:
        List<T> list = this.getHibernateTemplate().find(finalHql, params);

/*

//方案三

List<T> list = (List<T>) this.getHibernateTemplate().execute(new HibernateCallback() {

 
         

@Override
public Object doInHibernate(Session session) throws HibernateException, SQLException {
//回調session
Query query = session.createQuery(finalHql);
if(params!=null && params.length > 0){ //params報錯,將傳遞的參數強轉為final 類型
for(int i=0;i<params.length;i++){
query.setParameter(i, params[i]);
}
}
return query.list();
}
});

*/
        
        return list;
    }
    private String orderByHql(Map<String, String> orderby) {
        StringBuffer buffer = new StringBuffer("");
        if(orderby != null && orderby.size() > 0){
           buffer.append(" ORDER BY "); //這個地方一定要加空格,否則拼接字符串會報錯 for(Map.Entry<String, String> map:orderby.entrySet()){
                buffer.append(map.getKey() + " " + map.getValue() + ",");
            }
            //刪除最后一個逗號
            buffer.deleteCharAt(buffer.length() - 1);
        }
        return buffer.toString();
    }
}

方案三: 

 1 @Override
 2     public List<T> findCollectionByConditionNoPage(String condition, final Object[] params, Map<String, String> orderby) {
 3         //hql語句   面向對象
 4         String hql="from "+ entityClass.getSimpleName() +" o where 1=1";
 5         //添加查詢條件
 6         //將map集合中存放的字段排序組織成字符串 order by o.textDate asc, o.textName desc
 7         String orderbyCondition = this.orderbyHql(orderby);
 8         final String finalHql = hql + condition + orderbyCondition;
 9         //方案一:使用模板調用
10 //        List<T> list = this.getHibernateTemplate().find(finalHql, params);
11 //        return list;
12         
13         //方案三:
14         List<T> list = this.getHibernateTemplate().execute(new HibernateCallback() {
15 
16             @Override
17             public Object doInHibernate(Session session) throws HibernateException, SQLException {
18                 Query query = session.createQuery(finalHql);
19                 if(params != null && params.length > 0){
20                     for (int i = 0; i < params.length; i++) {
21                         query.setParameter(i, params[i]);
22                     }
23                 }
24                 return query.list();
25             }
26             
27         });
28         return list;
29     }

 

 

2017.1.11  11:58

第一次回顧 2017.5.14 kangjie

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM