第一步:
定义接口:
public interface icommondao {
list findcollectionbyconditionnopage(string codition,object[] params, map 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 findcollectionbyconditionnopage(string condition, final object[] params, map orderby) { //定义hql语句 string hql = from +entityclass.getsimplename()+ o where 1=1; //定义排序语句 string orderbyhql = this.orderbyhql(orderby); //定义最终的语句 final string finalhql = hql + condition + orderbyhql; //执行语句一 //list list = this.gethibernatetemplate().find(finalhql, params); //执行语句二// sessionfactory sf = this.gethibernatetemplate().getsessionfactory();// session s = sf.getcurrentsession();// query query = s.createquery(finalhql);// list list = query.list(); //执行语句三 list 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;i0){ buffer.append( order by ); for(map.entry 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 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 findcollectionbyconditionnopage(electext electext) { //查询条件 string condition = ; list paramslist = new arraylist(); //判断是否添加查询条件 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 orderby = new linkedhashmap(); orderby.put(o.textdate, asc); orderby.put(o.textname, desc); //查询 list 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 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 = this.getmodel(); @resource(name=ielecsystemddlservice.service_name) private ielecsystemddlservice elecsystemddlservice; public string home(){ list list = elecsystemddlservice.findkeywordwithdistinct(); request.setattribute(list, list); return home; } public string edit(){ //获取数据类型 string keyword = elecsystemddl.getkeyword(); //1:使用数据类型作为查询条件,查询数据字典表,返回list list list = elecsystemddlservice.findsystemddllistbykeyword(keyword); request.setattribute(systemlist, list); return edit; } }
总结:根据什么样的条件查询,是在service层完成的,把所有的条件组织好后,给dao层,dao层再拼接sql或者hql语句,进行真正的查询。web层的action只是传递参数,进行简单的调用service层的方法。
