关于hbm.xml映射文件
1、<id>元素映射OID
<generator>子元素用来设定标示符生成器。hibernate提供了多种内置的实现:
2、<property>元素映射值类型属性
- name属性:指定持久化类的属性的名字
- type属性:指定Hibernate或Java映射类型;Hibernate映射类型是Java类型与SQL类型的桥梁
- coloumn属性:指定与类的属性映射的表的字段名。
Java类型、Hibernate映射类型以及SQL类型之间的对应关系
3、通过Hibernate API操纵数据库
4、SessionFactory接口
一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。
5、Session接口:是Hibernate应用使用最广泛的接口;Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象;Session有以下特点:1)不是线程安全的,因此在设计软件架构时,应避免多个线程共享同一个Session实例。2)Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建和销毁Session对象。需要注意的是,此处所说的Session不是HttpSession
Session接口提供了操作数据库的各种方法:
- save()方法:把Java对象保存数据库中
- update()方法:更新数据库中的Java对象
- delete()方法:把Java对象从数据库中删除。
- get()方法:从数据库中加载Java对象。
6、用session来执行事务的流程:
Session session = factory.openSession();
Transaction ts;
try{
//开始一个事务
tx = session.beginTransaction();
//执行事务
......
//提交事务
tx.commit();
}
catch(Exception e){
//如果出现异常,就撤销事务
if(null != tx) tx.rollback();
throw e;
}
finally{
//不管事务执行成功与否,最后都关闭Session
session.close();
}
7、OGNL(Object Graph Navigation Language),对象图导航语言
要想在web项目中使用OGNL,需要引入两个包:ognl-3.0.jar和javassist-3.7.ga.jar
OgnlContext类(上下文对象),实现了Map(public class ognl.OgnlContext implements java.util.Map),存在唯一的叫做根的对象(root),可以通过程序设定上下文当中的哪个对象作为根对象。
public class Person
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
public class Dog
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
public class OgnlTest
{
public static void main(String[] args) throws Exception
{
Person person = new Person();
person.setName("zhangsan");
Dog dog = new Dog();
dog.setName("wangcai");
OgnlContext context = new OgnlContext();
context.put("person", person);
context.put("dog",dog);
context.setRoot(person);
Object object = Ognl.parseExpression("name");
System.out.println(object);
Object object2 = Ognl.getValue(object, context,context.getRoot());
System.out.println(object2);
System.out.println("------------------");
Object object3 = Ognl.parseExpression("#person.name");
System.out.println(object3);
Object object4 = Ognl.getValue(object3, context,context.getRoot());
System.out.println(object4);
System.out.println("-------------");
Object object5 = Ognl.parseExpression("#dog.name");
System.out.println(object5);
Object object6 = Ognl.getValue(object5, context,context.getRoot());
System.out.println(object6);
}
}
如果在Person中增加一个属性:
public class Person
{
private String name;
private Dog dog;
public Dog getDog()
{
return dog;
}
public void setDog(Dog dog)
{
this.dog = dog;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
public class OgnlTest
{
public static void main(String[] args) throws Exception
{
Person person = new Person();
person.setName("zhangsan");
Dog dog2 = new Dog();
dog2.setName("hello");
person.setDog(dog2);
Dog dog = new Dog();
dog.setName("wangcai");
OgnlContext context = new OgnlContext();
context.put("person", person);
context.put("dog",dog);
context.setRoot(person);
Object object = Ognl.parseExpression("name");
System.out.println(object);
Object object2 = Ognl.getValue(object, context,context.getRoot());
System.out.println(object2);
System.out.println("------------------");
Object object7 = Ognl.parseExpression("dog.name");
System.out.println(object7);
Object object8 = Ognl.getValue(object7, context,context.getRoot());
System.out.println(object8);
System.out.println("------------------");
Object object3 = Ognl.parseExpression("#person.name");
System.out.println(object3);
Object object4 = Ognl.getValue(object3, context,context.getRoot());
System.out.println(object4);
System.out.println("-------------");
Object object5 = Ognl.parseExpression("#dog.name");
System.out.println(object5);
Object object6 = Ognl.getValue(object5, context,context.getRoot());
System.out.println(object6);
}
}
8、在OGNL中,如果表达式没有使用#号,那么OGNL会从根对象中寻找该属性对应的get方法,如果寻找的不是根对象中的属性,那么则需要以#号开头,告诉OGNL,去寻找你所指定的特定对象中的属性。
9、当使用OGNL调用静态方法的时候,需要按照如下语法编写表达式:
@package.classname@methodname(para)
对于OGNL来说java.lang.Math是其的默认类,如果调用java.lang.Math的静态方法时,无需指定类的名字,如@@min(4,10);
对于OGNL来说,数组与集合是一样的,都是通过下标索引来去访问的。构造集合的时候使用{。。。}形式。
使用OGNL处理来处理映射(Map)的语法格式:
#{‘key1’:‘value1’,‘key2’:‘value2’,’key3’:‘value3’};//这个#跟
对于OGNL来说,数组和集合都是一样的,都是通过下标索引来去访问的。构造集合的时候使用{......}形式。
10、过滤(filtering):返回一个子集合,语法:collection.{? expression}
#persons.{? #this.name.length() > 4}
OGNL针对集合提供了一些伪属性(如size,isEmpty),让我们可以通过属性的方式来调用方法(本质原因在于集合当中的很多方法并不符合JavaBean的命名规则),但我们依然还可以通过调用方法来实现与伪属性相同的目的。
过滤(filtering),获取到集合中的第一个元素,collection.{^ expression}
过滤(filtering),获取到集合中的最后一个元素,collection.{$ expression}
11、在使用过滤操作时,我们通常都会使用#this,该表达式用于代表当前正在迭代的集合中的对象(联想增强的for循环)
12、投影(projection):collection.{expression}
投影与过滤的差别:类比于数据库中的表,过滤是取行的操作,而投影是取列的操作。
综合举例:
import java.util.ArrayList;
import java.util.List;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
public class OgnlTest
{
public static void main(String[] args) throws Exception
{
Person person = new Person();
person.setName("zhangsan");
Dog dog2 = new Dog();
dog2.setName("hello");
person.setDog(dog2);
Dog dog = new Dog();
dog.setName("wangcai");
OgnlContext context = new OgnlContext();
context.put("person", person);
context.put("dog",dog);
context.setRoot(person);
Object object = Ognl.parseExpression("name");
System.out.println(object);
Object object2 = Ognl.getValue(object, context,context.getRoot());
System.out.println(object2);
System.out.println("------------------");
Object object7 = Ognl.parseExpression("dog.name");
System.out.println(object7);
Object object8 = Ognl.getValue(object7, context,context.getRoot());
System.out.println(object8);
System.out.println("------------------");
Object object3 = Ognl.parseExpression("#person.name");
System.out.println(object3);
Object object4 = Ognl.getValue(object3, context,context.getRoot());
System.out.println(object4);
System.out.println("-------------");
Object object5 = Ognl.parseExpression("#dog.name");
System.out.println(object5);
Object object6 = Ognl.getValue(object5, context,context.getRoot());
System.out.println(object6);
System.out.println("-------------");
Object object9 = Ognl.parseExpression("name.toUpperCase()");
System.out.println(object9);
Object object10 = Ognl.getValue(object9, context,context.getRoot());
System.out.println(object10);
Object object11 = Ognl.parseExpression("name.toUpperCase().length()");
System.out.println(object11);
Object object12 = Ognl.getValue(object11, context,context.getRoot());
System.out.println(object12);
System.out.println("-------------");
Object object13 = Ognl.parseExpression("@java.lang.Integer@toBinaryString(10)");
System.out.println(object13);
Object object14 = Ognl.getValue(object13, context,context.getRoot());
System.out.println(object14);
System.out.println("-------------");
Object object15 = Ognl.parseExpression("@@min(4,10)");
System.out.println(object15);
Object object16 = Ognl.getValue(object15, context,context.getRoot());
System.out.println(object16);
Object object17 = Ognl.parseExpression("@@E");
Object object18 = Ognl.parseExpression("@@PI");
//通过new方式生成对象
Object object19 = Ognl.parseExpression("new java.util.LinkedList()");
System.out.println(object19);
Object object20 = Ognl.getValue(object19, context,context.getRoot());
System.out.println(object20);
//通过花括号的方式生成对象
Object object21 = Ognl.getValue("{'aa','bb','cc','dd'}", context,context.getRoot());
System.out.println(object21);
//OGNL集合和数组都可以通过下标访问
Object object22 = Ognl.getValue("{'aa','bb','cc','dd'}[3]", context,context.getRoot());
System.out.println(object22);
dog.setFriends(new String[]{"aa","bb","cc"});
Object object23 = Ognl.getValue("#dog.friends[1]", context,context.getRoot());
System.out.println(object23);
System.out.println("-----------");
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("hello world");
context.put("list", list);
System.out.println(Ognl.getValue("#list[0]", context,context.getRoot()));
//OGNL访问map
System.out.println(Ognl.getValue("#{'key1':'value1','key2':'value2','key3':'value3'}", context,context.getRoot()));
//访问map的一个具体的value,传一个key值
System.out.println(Ognl.getValue("#{'key1':'value1','key2':'value2','key3':'value3'}['key3']", context,context.getRoot()));
List<Person> persons = new ArrayList<Person>();
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
p1.setName("zhangsan");
p2.setName("lisi");
p3.setName("wangwu");
persons.add(p1);
persons.add(p2);
persons.add(p3);
context.put("persons", persons);
//过滤(filtering),collection.{? expression}
//#this代表当前的对象,类似增强的for循环
System.out.println(Ognl.getValue("#persons.{? #this.name.length() > 4}", context,context.getRoot()));
//过滤(filtering),获取到集合中的第一个元素,collection.{^ expression},虽然是第一个元素,但结果依然是一个集合
System.out.println(Ognl.getValue("#persons.{^ #this.name.length() > 4}", context,context.getRoot()));
//过滤(filtering),获取到集合中的最后一个元素,collection.{$ expression},
System.out.println(Ognl.getValue("#persons.{$ #this.name.length() > 4}", context,context.getRoot()));
//获取最后一个元素的name属性值
System.out.println(Ognl.getValue("#persons.{$ #this.name.length() > 4}[0].name", context,context.getRoot()));
//投影(projection),collection.{expression}
System.out.println(Ognl.getValue("#persons.{name}", context,context.getRoot()));
System.out.println(Ognl.getValue("#persons.{#this.name.length() <= 5 ? 'hello world' : #this.name}", context,context.getRoot()));
}
}
13、struts2中OGNL的使用
在Struts2中有一个称之为值栈的概念(ValueStack)
struts2值栈提供了[N]语法和TOP关键字
在struts2中,根对象就是ValueStack。在Struts2的任何流程当中,ValueStack中的最顶层对象一定是Action对象。
所以如果页面中有<s:property value="username" />这个username一定是Action中的username。