|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
其实产生见解的过程就是训练自己发现问题,分析问题的能力。根据以上的认识我想谈下传统的学习与通过视频独立学习的优缺点:静态|视图|组合查询
Reflection是Java程序开辟言语的特性之一,它同意运转中的程序对本身举行会见,并能间接操纵程序的外部属性。
Hibernate是一个面向Java情况的对象/干系数据库映照工具,基础上,每一个表大概视图在hibernate内里都能够对应一个类,在此处,我们经由过程充实的使用这个类,来完成静态组合查询。
起首我们一同来看看这个函数的源代码:
/***组合查询*@paramobject包括查询前提的对象*@paramfirstResult第一个前往的地位(从0入手下手)*@parammaxResults最年夜前往数*@paramorderField排序的字段*@paramisAbs是不是正序分列*@return*@throwsHibernateException*/publicListqueryList(Objectobject,intfirstResult,intmaxResults,StringorderField,booleanisAsc)throwsHibernateException,IllegalArgumentException,IllegalAccessException,InvocationTargetException{Listlist=null;Classc=object.getClass();Methodmethod[]=c.getMethods();try{Sessionsession=currentSession();Criteriacriteria=session.createCriteria(object.getClass());for(inti=0;i<method.length;i++){Stringname=method[i].getName();if(name.indexOf("getMin")==0){//年夜于StringfieldName=name.substring(6,7).toLowerCase()+name.substring(7);ObjectretObj=method[i].invoke(object,null);if(retObj!=null&&!retObj.equals(""))criteria.add(Expression.ge(fieldName,retObj));continue;}if(name.indexOf("getMax")==0){//小于StringfieldName=name.substring(6,7).toLowerCase()+name.substring(7);ObjectretObj=method[i].invoke(object,null);if(retObj!=null&&!retObj.equals(""))criteria.add(Expression.le(fieldName,retObj));continue;}if(name.indexOf("get")!=0||name.indexOf("getClass")==0)//假如不是必要的办法,跳出continue;StringfieldName=name.substring(3,4).toLowerCase()+name.substring(4);StringreturnType=method[i].getReturnType().toString();ObjectretObj=method[i].invoke(object,null);if(retObj!=null){//假如为null,没有赋值,跳出if(returnType.indexOf("String")!=-1){if(retObj.equals(""))//假如为""的String字段,跳出continue;criteria.add(Expression.like(fieldName,"%"+retObj+"%"));//对String的字段,利用like含混查询}elsecriteria.add(Expression.like(fieldName,retObj));}}if(isAsc)criteria.addOrder(Order.asc(orderField));//升序elsecriteria.addOrder(Order.desc(orderField));//降序criteria.setFirstResult(firstResult);criteria.setMaxResults(maxResults);list=criteria.list();}finally{closeSession();}
returnlist;}
假定干系数据库内里有一个物理表,其布局以下:
STAFF(员工表)
列名
范例
Null
申明
Id(pk)
VARCHAR2(20)
NOTNULL
员工工号
name
VARCHAR2(20)
NOTNULL
员工姓名
Dept
INTEGER
NULL
员工所属部门(p3)
Password
VARCHAR2(20)
NOTNULL
暗码
Post
INTEGER
NULL
员工所属职位(p14)
Priv
VARCHAR2(40)
NOTNULL
权限字
Birthday
VARCHAR2(20)
NULL
诞辰
Active
VARCHAR2(1)
NOTNULL
Y:激活N:未激活
使用工具,天生其相干的hibernate类Staff,其外部包含以下字段:
privatejava.lang.Stringid;privatejava.lang.Stringname;privatejava.lang.Longdept;privatejava.lang.Stringpassword;privatejava.lang.Longpost;privatejava.lang.Stringpriv;privatejava.lang.Stringbirthday;privatejava.lang.Stringactive;
上面,我们就能够使用下面的queryList来举行查询了
例子1:
前台必要一个包括一切职员的List,
那末相干代码以下:
Staffstaff=newStaff();
Listlist=queryList(staff,0,1000,id,true);
例子2:
查询一切姓名内里包括“丁”的职员
那末相干代码以下:
Staffstaff=newStaff();
staff.setName=”丁”;
Listlist=queryList(staff,0,1000,id,true);
例子3:
查询一切姓名包括“丁”,而且处于激活形态的职员
那末相干代码以下:
Staffstaff=newStaff();
staff.setName=”丁”;
staff.setActive=”Y”;
Listlist=queryList(staff,0,1000,id,true);
例子4:
查询一切姓名包括“丁”,而且处于激活形态的职员,同时请求前往的list依照诞辰举行排序
那末相干代码以下:
Staffstaff=newStaff();
staff.setName=”丁”;
staff.setActive=”Y”;
Listlist=queryList(staff,0,1000,birthday,true,);
对Staff举行一下加工,就能够完成年夜于,小于的功效,好比我们想完成查询生于1981-09-16今后的人,那末能够在Staff类内里增添以下代码:
privatejava.lang.StringminBirthday;
privatejava.lang.StringmaxBirthday;
publicjava.lang.StringgetMinBirthday(){
returnminBirthday;
}
publicvoidsetMinBirthday(java.lang.StringminBirthday){
this.minBirthday=minBirthday;
}
publicjava.lang.StringgetMaxBirthday(){
returnmaxBirthday;
}
publicvoidsetMaxBirthday(java.lang.StringmaxBirthday){
this.maxBirthday=maxBirthday;
}
例子5:
查询诞辰在1978年以后,1981年之前的激活形态职员,请求姓名包括“丁”,依照诞辰降序分列
Staffstaff=newStaff();
staff.setName=”丁”;
staff.setActive=”Y”;
staff.setMinBirthday(“1978”);
staff.setMaxBirthday(“1981”);
Listlist=queryList(staff,0,1000,birthday,false);
至此,应当说先容的差未几了,也许有人要问,”单表查询,能够云云,那末联表查询怎样办?“实在很复杂,在数据库内里创建一个视图就能够了。但愿这点履历对人人有效。
微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包...... |
|