Struts2框架使得基于MVC架构的Web项目的开发变得快捷而稳健,然而,struts2框架和三层架构面对软件需求量越来越大的时
候,往往束手无策,程序员仍然需要在数据访问层编写大量重复性的代码。为了提高数据访问层的编码效率,诞生了当今较流行的
ORM(object relationship mapping对象-关系型数据映射)工具——Hibernate框架。ORM的思想就是将关系数据库中表中的记录映
射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。ORM采用元数据(描述数据的数据)来描述
对象-关系映射细节,元数据通常采用XML格式,且存放在专门的对象-关系映射文件中。
Hibernate框架有以下的优点:
1、Hibernate是JDBC的轻量级的对象封装,封装了通过JDBC访问数据库的操作,不必再去写面向过程的SQL语句。
2、Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的
Java程序,以及App Server没有任何关系,也不存在兼容性问题。
3、内存消耗少,可以获得较快的运行速度。
4、开发效率高,Eclipse等主流Java集成开发环境对Hiberna都有很好的支持。
5、分布式,安全简称,集群,负载均衡的支持。
6、具有扩展性,API扩展,当本身功能不够用时,可以自己编码进行扩展。
提到Hibernate不得不提到的就是JPA(Java Persistence API),JPA是Sun官方提出的Java持久化规范。它为Java开发员
提供了一种对象/关系映射工具来管理Java应用中的关系数据。而Hibernate是它的一种实现。除了Hibernate,还
EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实现而不必改动太多代
码。
//**********************************************************
Hibernate中,其综合了JPA的注解功能,并在其基础上进行了扩展。因此先在此把JPA的注解做一个记录:
1、@Entity(name="xxx")
必须,name为可选,标识这个POJO为一个JPA实体类,表明江北Hibernate持久化的Java对象。
使用XML文件的方法配置的话:
<hibernate-mapping package="">
<class name="xxx">
</class>
</hibernate-mapping>
2、@Table(name="")
必须,name为可选。映射成一张表,引导将数据固有化进入特定的数据库的表中。如果不定义@Table则默认的table
名和类名相同。不写参数默认表名跟类名相同。
使用XML文件的方法配置的话:
<hibernate-mapping package="">
<class name="xxx" table="xxx">
</class>
</hibernate-mapping>
3、@Id
必须,设置主键。一个实体类只能有一个主键,放置于getXxx()方法前。
使用XML文件的方法配置的话:
<hibernate-mapping package="">
<class name="xxx" table="xxx">
<!-- 其中name属性对应实体类的属性 -->
<id name="xxx"></id>
</class>
</hibernate-mapping>
4、@GeneratedValue(strategy="")
设置标识符的生成策略,常与@Id一起使用。
5、@Column
描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用。如果缺省,则默认
数据库表中字段名和属性名一致,否则可用name来设置。
name:表示数据库表中该字段的名称,默认情形属性名称一致
nullable:表示该字段是否允许为null,默认为true
unique:表示该字段是否是唯一标识,默认为false
length:表示该字段的大小,仅对String类型的字段有效
insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true
updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true.对于一经创建就不可以更改
的字段,该属性非常有用,如对于birthday字段。
columnDefinition: 表示该字段在数据库中的实际类型。通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是 DATE,TIME还是TIMESTAMP。此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或 TEXT字段类型,该属性非常有用。
如果用XML文件的方法配置的话:
<hibernate-mapping package="">
<class name="xxx" table="xxx">
<id name="xxx">
<column name="xxx" />
</id>
</class>
</hibernate-mapping>
6、@Transient
表示该属性并非一个到数据库表的字段的映射,ORM框架将自动忽略该属性,如果不标注,则会自动将它视@Basic。
如果用XML文件的方法设置的话:直接不写这个property即可。
7、@Basic
表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxx()方法,即默认为@Basic
fetch:表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER。
optional:表示该属性是否允许位NUll,默认为true。
如果用XML文件的方法设置的话:利用property标签。同样有name属性以及内部的column标签。
<hibernate-mapping package="">
<class name="xxx" table="xxx">
<id name="xxx"></id>
<property name="xxx" />
</class>
</hibernate-mapping>
8、@Temporal
和时间有关,设置了持久化时间数据的精度问题。有三个基本参数TIMESTAMP(默认),DATE,TIME。
如果用XML文件的方法设置的话:
<hibernate-mapping package="">
<class name="xxx" table="xxx">
<id name="xxx"></id>
<property name="date" type="time|date|timestamp"/>
</class>
</hibernate-mapping>
顺便说一下,标签体中的type属性,表示的是该属性的java类型,大部分时间是不用去更改的。
...后续有学习到的注解再补上。
现在Hibernate4及以上版本获得了很高的普及,因此本次学习都针对Hibernate4以后的版本进行学习。Hibernate的搭建可以通
过Xml来搭建,也可以利用annotation来搭建从而简化过程。在Hibernate4之前,如果要使用annotation来进行搭建需要添加其他的
jar包,但是在Hibernate4及以后本身的required包就包含了对annotation的支持,因此以后也长期采用annotation的方法来搭建,所
以在此只介绍annotation的方法。【采用MyEclipse作为开发平台】
static {
Configuration cfg = new Configuration(); //创建Configuration实例,以读取并解析配置文件(hibernate.cfg.xml),
cfg.configure(); //一个Configuration实例代表hibernate所有的Java类到Sql数据库映射的集合。
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
Session s = HibernateSessionFactory.getSession();//用缓存中含有Configuration配置信息的SessionFactory提供连接
Transaction tran = s.beginTransaction(); //开始一个事务
s.save(this.manager);
tran.commit(); <span style="white-space:pre"> </span>//提交事务
s.close(); //关闭session
errormessage = "添加成功。";
return SUCCESS;
}
上面代码片段是截取我的一个Web项目的action片段。和Hibernate4环境搭建有关的语句已经注释。
之后,在相关Dao类里面,做@标记。
package cn.wqy.dao;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="manager_backup")
public class Manager {
private int manager_id;
private String manager_name;
private String manager_password;
@Id
public int getManager_id() {
return manager_id;
}
public void setManager_id(int manager_id) {
this.manager_id = manager_id;
}
public String getManager_name() {
return manager_name;
}
public void setManager_name(String manager_name) {
this.manager_name = manager_name;
}
public String getManager_password() {
return manager_password;
}
public void setManager_password(String manager_password) {
this.manager_password = manager_password;
}
}
之后需要添加Hibernate.cfg.xml,做配置文件。
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<!-- 指定数据库使用的SQL方言 -->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- 指定数据库的相关基本信息 -->
<property name="connection.url">
jdbc:mysql://localhost:3306/student_management?useUnicode=true&characterEncoding=UTF8
</property>
<property name="connection.username">root</property>
<property name="connection.password">wangqy</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">MySQL</property>
<!-- 指定运行时是否在控制台输出SQL语句 -->
<property name="show_sql">true</property>
<!-- 指定运行时是否对打印出的SQL的语句进行格式化(多行打印) -->
<property name="format_sql">true</property>
<!-- 指定当表不存在时自动建表 -->
<property name="hbm2ddl.auto">update</property>
<mapping class="cn.wqy.dao.Manager" />
</session-factory>
</hibernate-configuration>
里面包含了关于Hibernate的一些配置,包括数据库连接的信息等等。
Ps:如果采用XML的方式进行配置,则还需要配置映射文件,里面添加了对表和Java持久化类的映射关系的说明。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate_mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="持久化类全名" table="数据库表名" >
<id name="id">
<generator class="native"/>
<column name="字段名" />
</id>
<property name="Java持久化类属性名" type="date" not-null="true" update="false">
<column name="字段名" />
</property>
...
</class>
</hibernate-mapping