zoukankan      html  css  js  c++  java
  • 实现按条件查询

    第一步:

    定义接口:

    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*/
    	@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 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层的方法。


    
  • 相关阅读:
    3、面向对象
    今日记事
    javascript 学习javascript高级程序设计
    数据库操作语言分类
    project遇到问题了。
    CentOS设置程序开机自启动的方法
    ECMAScript 基础 [完]
    CentOS 网络设置修改
    Spring Boot项目Circular view path问题解决
    数据库设计
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7255806.html
Copyright © 2011-2022 走看看