java criterion是什么?JAVA中将类声明为static有什么作用
这篇文章给大家聊聊关于java criterion是什么,以及JAVA中将类声明为static有什么作用对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
Mybatis中example[Criteria]使用
我们这个直接看源码看如何由example映射到sql语句
Stock.java
只有5个属性。
StockMapper.java:
我看只看countByExample接口,看名字就知道是返回给定example参数的结果个数。
再看
StockMapper.xml该方法实现:
很简单给定参数类型StockExample返回Long类型 select count(*) from stock返回满足条件的stock表中数据数量
再看<include refid="Example_Where_Clause"/>
foreach表示循环,分隔符是or(或者)重点在于数据集oredCriteria,我们去给定参数StockExample中寻找oredCriteria
是一个List刚好和上面的集合对应了,看看单个Criteria是什么
再看GeneratedCriteria
我们发现Criteria里面居然还有一个list,我们翻上去看刚好与上面一个foreach里面还有一个foreach对应,那接下来研究Criterion
这就是该类的声明,里面有这些值,这时候应该结合着之前xml第二层foreach属性看了,知道这些值有啥用
一看我们根据when知道有四类情况,noValue,singleValue,betweenValue,listValue,对应着查询中四种情况
1.只是单纯是否非空
2.value=?多少查询
3.两者之间查询
4.在list中查询。
所以我们构建的查询参数就是criterion,看一下上面四种咋构建吧
以下均是lGeneratedCriterial类中方法,addCriterion是把生成的Criterion加到Ctriteria中
1.是否非空:
2.值查询
public Criteria andIdEqualTo(Integer value){
addCriterion("id=", value,"id");
return(Criteria) this;
}
3.两者之间
public Criteria andSaleNotBetween(Integer value1, Integer value2){
addCriterion("sale not between", value1, value2,"sale");
return(Criteria) this;
}
4.list
public Criteria andVersionNotIn(List<Integer> values){
addCriterion("version not in", values,"version");
return(Criteria) this;
}
完结,相信通过上面的源码剖析,大家都知道如何构建查询条件了把。
StockExample.java构造
三个参数
orderByClause:返回结果升降排序,字段+空格+acs/dcs(升序/降序)例子count acs
setOrderByClause方法注入
distinct:true/false返回结果去不去重复,setDistinct注入
oredCriteria:就是查询参数,之前狗讲了啥意思,构造方法
构造Criteria
收工。
hibernate的多条件动态查询
在hibernate中是支持多条件动态查询的这种问题是非常实用的比如说你做一个项目要实现一个复合查询
例如有这么一个界面
那么要实现这个查询对于用户来说他的查询条件可能不健全有可能只填写其中的项那么要实现这个查询我们可以用hibernate的动态条件查询
下面我写一个例子
我有一张表叫user表
package fish testdao;
import java sql Date;
public class User{
int id;
String name;
int age;
Date brithday;
public String getName(){
returnname;
}
public void setName(String name){
this name= name;
}
public int getAge(){
returnage;
}
public void setAge(int age){
this age= age;
}
public Date getBrithday(){
returnbrithday;
}
public void setBrithday(Date brithday){
this brithday= brithday;
}
public int getId(){
returnid;
}
public void setId(int id){
this id= id;
}
}
User hbm xml
<?xmlversion= encoding= UTF?>
<!DOCTYPEhibernate mapping PUBLIC
//Hibernate/HibernateMapping DTD//EN
hiber/hibernate mapping dtd>
<hibernate mapping>
<classname= fish testdao User>
<idname= id type= integer>
<generatorclass= increment></generator>
</id>
<propertyname= name></property>
<propertyname= age></property>
<propertyname= brithday></property>
</class>
</hibernate mapping>
在XXX cgf xml注册一下
然后我们写一个测试类
package fish domain;
import java sql Date;
import java util List;
import hibernate Criteria;
import hibernate Session;
import hibernate Transaction;
import hibernate criterion DetachedCriteria;
import hibernate criterion Restrictions;
import fish testdao User;
import fish util HibernateSessionFactory;
public class Test{
public static void main(String[] args){
// addData();
queryData();
}
//添加数据
public static void addData(){
Session session= HibernateSessionFactory getSession();
Transaction transaction= session beginTransaction();
transaction begin();
for(int i=; i<; i++){
User user= new User();
user setAge(+ i);
user setName(张+ i);
user setBrithday(Date valueOf());
session save(user);
}
mit();
session close();
}
//查询数据
public static void queryData(){
String outName=张;
int outAge=;
Date outDate= null;
Session session= HibernateSessionFactory getSession();
DetachedCriteria dc= DetachedCriteria forClass(User class);
if(outName!=null){
dc add(Restrictions eq( name outName));
}
if(outAge>){
dc add(Restrictions eq( age outAge));
}
if(outDate!=null){
dc add(Restrictions eq( brithday outDate));
}
Criteria c= dc getExecutableCriteria(session);
List<User> list= c list();
for(User i: list){
System out println(i getName()++ i getAge());
}
}
}
看看测试类中的查询方法如果String outName=张;
intoutAge=;
DateoutDate= null;
这三个条件是通过从前台或者是用户输入的那么就实现了多条件的动态查询
我们看看数据库的信息
显然这个里面有一条记录是符合的我们看看输出的结果是什么
张
lishixinzhi/Article/program/Java/ky/201311/28511JAVA中将类声明为static有什么作用
为了理解static这个关键字在class声明中的应用,我们必须先理解class声明,我们可以创建两种classes,外部类(top-level classes)和内部类(inner classes)
外部类(top-level classes)
你可以声明一个外部类作为一个包的成员,每个外部类名和他的文件名相同。
一个外部类已经声明为外部类,所以他不可以声明为static,如果你声明了,那么编译将会出错
内部类(inner classes)
你可以将一个内部类定义在一个外部类里面,根据内部类定义的方式,我们可以分为以下四类:
1、匿名的:
匿名的classes声明和实例化在一起,他没有名字,并且他只可以实例化一次,如:
okButton.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e){
dispose();
}
});
因为匿名类没有正常的类的声明,所以他不能声明为static
2、域类(local)
域类和域变量一样,在声明中,他创建并应用在一个block,一旦你声明一个类在一个block之中,他可以实例化任意次,象域变量,他不可以声明为public, protected, private, static,如:
//some code block.......{
class ListListener implements ItemListener{
List list;
public ListListener(List l){
list= l;
}
public void itemStateChanged(ItemEvent e){
String s= l.getItemSelected();
doSomething(s);
}
}
List list1= new List();
list list2= new List();
list1.addItemListener(new ListListener(list1));
list2.addItemListener(new ListListener(list2));
}
3、成员类(member class):成员类作为一个class的一部分,你可以在class中的任何地方使用成员类,当你想用成员类的变量和方法你可以不需要外在的授权
成员类是唯一的一个你可以声明为static的类,当你声明成员的时间,你仅仅在成员类的所属类中可以引用,如果你想去掉这个约束,你可以声明一个成员类为static类。
当你声明一个static成员类,他就变成了嵌套的外部类,并且可以象正常类一样使用。
4、嵌套的外部类
嵌套的外部类是一个static成员类,一个嵌套的外部类象其他的外部类除了他声明在其他的class或interface之中,嵌套的外部类主要是方便去创建一系列相关的classes(他们没有创建一个新包)
如果你的main class有一些小的有帮助的类,他可以和你的main class一起使用,把他们声明为嵌套的外部类是一个好主意,如:
public class Filter{
Vector criteria= new Vector();
public addCriterion(Criterion c){
criteria.addElement(c);
}
public boolean isTrue(Record rec){
for(Enumeration e=criteria.elements();
e.hasMoreElements();){
if(!((Criterion)e.nextElement()).isTrue(rec))
return false;
}
return true;
}
public static class Criterion{
String colName, colValue;
public Criterion(Stirng name, String val){
colName= name; colValue= val;
}
public boolean isTrue(Record rec){
String data= rec.getData(colName);
if(data.equals(colValue)) return true;
return false;
}
}
}
下面是你使用他:
Filter f= new Filter();
f.addCriterion(new Filter.Criterion("SYMBOL","SUNW"));
f.addCriterion(new Filter.Criterion("SIDE","BUY"));
.....
if(f.isTrue(someRec))//do some thing.....
一个重要的提示: static关键字不能修饰一个类的声明(外部类),但他可以修饰变量和方法的
如果你还想了解更多这方面的信息,记得收藏关注本站。