关于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。