第一步:
定義介面:
public interface ICommonDao<T> {
List<T> findCollectionByConditionNoPage(String codition,Object[] params, Map<String, String> orderby);
}
第二步:
實現介面的類:
Class entityClass = TUtils.getTClass(this.getClass());public class TUtils {/**泛型轉換,目的擷取子類傳遞父類的真實類型,也就是T所對應的類型*/public static Class getTClass(Class entity) {ParameterizedType type = (ParameterizedType)entity.getGenericSuperclass();Class entityClass = (Class) type.getActualTypeArguments()[0];return entityClass;}}
/**指定查詢條件查詢對應的結果,返回List(不分頁)*//** * 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,final Object[] params, Map<String, String> orderby) {//定義hql語句String hql = "FROM "+entityClass.getSimpleName()+" o WHERE 1=1";//定義排序語句String orderbyHql = this.orderbyHql(orderby);//定義最終的語句final String finalHql = hql + condition + orderbyHql;//執行語句一//List<T> list = this.getHibernateTemplate().find(finalHql, params);//執行語句二//SessionFactory sf = this.getHibernateTemplate().getSessionFactory();//Session s = sf.getCurrentSession();//Query query = s.createQuery(finalHql);//List<T> list = query.list();//執行語句三List<T> list = this.getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {Query query = session.createQuery(finalHql);if(params!=null && params.length>0){for(int i=0;i<params.length;i++){query.setParameter(i, params[i]);}}return query.list();}});return list;}/**組織排序的語句*//*ORDER BY o.textDate ASC,o.textName DESC*/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();}
下面是根據不同的業務來編寫不同的代碼。
第三步:
service介面:
public interface IElecTextService {public static final String SERVICE_NAME = "com.itheima.elec.service.impl.ElecTextServiceImpl";List<ElecText> findCollectionByConditionNoPage(ElecText elecText);}
第四步:
service實現
/**指定查詢條件查詢對應的結果,返回List*//** * 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<ElecText> findCollectionByConditionNoPage(ElecText elecText) {//查詢條件String condition = "";List<Object> paramsList = new ArrayList<Object>();//判斷是否添加查詢條件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();//排序語句(hql語句和sql語句的排序是有順序的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;}
第五步:
/**類比Action,調用Service,指定查詢條件查詢對應的結果,返回List*/@Testpublic 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 elecText2:list){System.out.println(elecText2.getTextName()+" "+elecText2.getTextDate()+" "+elecText2.getTextRemark());}}}
真正的action:
package com.itheima.elec.web.action;import java.util.List;import javax.annotation.Resource;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import com.itheima.elec.domain.ElecSystemDDL;import com.itheima.elec.service.IElecSystemDDLService;@SuppressWarnings("serial")@Controller("elecSystemDDLAction")@Scope(value="prototype")public class ElecSystemDDLAction extends BaseAction<ElecSystemDDL>{ElecSystemDDL elecSystemDDL = this.getModel();@Resource(name=IElecSystemDDLService.SERVICE_NAME)private IElecSystemDDLService elecSystemDDLService;public String home(){List<ElecSystemDDL> list = elecSystemDDLService.findKeywordWithDistinct();request.setAttribute("list", list);return "home";}public String edit(){//擷取資料類型String keyword = elecSystemDDL.getKeyword();//1:使用資料類型作為查詢條件,查詢資料字典表,返回List<ElecSystemDDL>List<ElecSystemDDL> list = elecSystemDDLService.findSystemDDLListByKeyword(keyword);request.setAttribute("systemList", list);return "edit";}}
總結:根據什麼樣的條件查詢,是在service層完成的,把所有的條件組織好後,給dao層,dao層再拼接SQL或者hql語句,進行真正的查詢。web層的action只是傳遞參數,進行簡單的調用service層的方法。