应用程序的分层体系结构
阻抗不匹配
ORM 对象关系映射
对象和关系数据库之间映射的元数据(xml)
功能:
- 将对象数据保存到关系数据库的表中
- 将关系数据库表中的数据读入到对象中
优势:
- 提高生产率
- 可维护性
- 更好的性能
- 厂商独立性
Hibernate的特点:
- 优秀成熟的ORM框架
- 强大的对象和关系数据库映射
- 强大的查询功能
hibernate-core-*.Fimal.jar Hibernate核心包
antlr-*.jar Hibernate利用它实现从HQL到SQL的转换
dom4j-*.jar 解析XML配置文件和XML映射文件
hibernate-commons-annotation-*.Fial.jar Hibernate注解包
hibernate-jpa-2.1-api-*.Final.jar JPA2.1的接口库
jandex-*.Final.jar 用来索引Annotation
javaassist-*-GA.Jjar Hibernate 动态字节码实现
jboss-logging-*.GA 日志服务通用库
jboss-logging-annotation-*.*实现带注释的接口具体类
jboss-transaction-api_*_spec-*.FinalJTA规范包
hibernate.cfg.xml
Hibernate核心配置文件
配置连接数据库的各种属性
注册对象关系映射文件
Hibernate应用开发步骤:
设计持久化的实体类
- setter和getter方法
- 公共的无参数构造方法
- 对象标识符(OID)的属性
- 属性是集合类型,则必须定义成接口类型,如list
- 实现Serizabel,可以序列化
配置对象关系映射文件
className.hbm.xml
注册对象关系映射文件
准备好数据库表:根据对象关系映射文件生成DDL,使用SchemaExport类工作
Configuration config=new Configuration().configure(cfg);
SchemaExport se=new SchemaExport(config);
se.create(true,true);
<property name="hibernate.hbm2ddl.auto">create|update</property>
操作过程:
- 创建SessionFactory实例
- 获取Session实例
- 开启事物
- 利用Session实例进行实例化操作
- 提交事务
- 关闭session
Session类主要用来执行实体的持久化操作
save(Object obj)
update(Object obj)
delete(Object obj)
get(ClassName.class,id)
session.load(ClassName.class,id)
实例:
src/hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url" >
jdbc:mysql://localhost:3306/students
</property>
<property name="connection.username">
root
</property>
<property name="connection.password"></property>
<!-- DB schema will be updated if needed -->
<!-- <property name="hbm2ddl.auto">update</property> -->
<mapping resource="enity/Student.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
enity.Student.java
package enity;
import java.io.Serializable;
/**
* Created by lenovo on 2016/3/23.
*/
public class Student implements Serializable {
private static final long servialVersionID=1530127413381718585L;
private int id;
private String name;
private int age;
public Student() {
}
public static long getServialVersionID() {
return servialVersionID;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
<!DOCTYPE hibernate-mapping PUBLIC
"//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="enity.Student" table="student">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<property name="age" column="age"/>
</class>
</hibernate-mapping>
action/HandleDB.java
package action;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
import entity.Student;
/**
* Created by lenovo on 2016/3/23.
*/
public class HandleDB {
@Test
public void createTable(){
Configuration configuration=new Configuration().configure();
SchemaExport schemaExport=new SchemaExport(configuration);
schemaExport.create(true,true);
}
/*
向数据库中添加一条记录
*/
@Test
public void add() {
Configuration configuration=new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
ServiceRegistry registry = builder.build();
SessionFactory factory = configuration.buildSessionFactory(registry);
Session session=factory.openSession();
Transaction transaction=session.beginTransaction();
Student student=new Student();
student.setName("zhang");
student.setAge(21);
try{
session.save(student);
transaction.commit();
}catch (Exception e){
transaction.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Configuration类负责管理Hibernate的配置信息并根据信息启动Hibernate
两种配置方法:
属性文件:Hibernate.properties
XML文件:Hibernate.cfg.xml
SessionFactory实例对应一个数据存储源,SessionFactore的特点:
线程安全
重量级
Session接口,持久化管理器,Session的特点:
线程不安全
轻量级
Session称为Hibernate的一级缓存
Session通过SessionFactore打开
与web层的HttpSession没有任何关系
Transaction接口,Hibernate数据库事务接口,包括JDBC API,JTA
Hibernate进行持久化操作(CRUD)时必须进行事务控制
Query接口包装了一个HQL(Hibernate Query Language)查询语句
Criteria擅长实行动态查询操作