参考数书籍:轻量级Java EE企业应用实战(第4版)
Hibernate是轻量级Java EE应用的持久化层解决方案。它不仅管理Java类到数据库表的映射,还提供了数据查询和获取数据的方法,可以大幅度缩短处理数据持久化的时间。Hibernate充当了面向对象的程序设计语言和关系数据库之间的桥梁,允许程序开发者采用面向对象的方式来操作数据库。
ORM和Hibernate:ORM(Object Relation Mapping)-对象关系数据库映射。ORM完成面向对象的编程语言到关系数据库的映射。
开源O/R映射框架:
因为有了Hibernate的支持,使得Java EE 应用的OOA,OOD,OOP一体化。
优点:1、开源和免费的License.
2、轻量级封装,生产力提高,容易调试。
3、使开发更加对象化(阻抗不匹配)
4、可移植性。
5、 没有侵入型,支持透明持久化
缺点:1、封装的太彻底,使用数据库特性语句,很难调优。
2、对大批量数据更新存在问题。
3、系统中存在大量的统计查询功能
下面通过一个实例来学习Hibernate:
创建一个Java项目
创建一个UserLibraries,加入依赖包:HIBERNATE_HOME/lib/*.jar
HIBERNATE_HOME/hibernate3.jar
加入数据库驱动(MySql驱动)
提供hibernate.cfg.xml文件,完成基本设置
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 指定连接数据库所用的驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,其中test_hibernate是本应用连接的数据库名,我这里和我的项目名称一样 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test_hibernate</property>
<!-- 指定连接数据库的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="hibernate.connection.password">root</property>
<!-- 指定数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<property name="hibernate.show_sql">true</property>
<!--将SQL脚本进行格式化后再输出 -->
<property name="hibernate.format_sql">true</property>
<!-- 罗列所有持久化类的类名 -->
<mapping resource="com/lf/zym/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
建立实体类User.java
package com.lf.zym.hibernate;
import java.util.Date;
/*
* User实体类
*/
public class User {
//ID
private String id;
//用户名
private String name;
//密码
private String password;
//创建日期
private Date createTime;
//失效日期
private Date expireTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getExpireTime() {
return expireTime;
}
public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
提供User.hbm.xml文件,完成实体类的映射
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lf.zym.hibernate.User">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"></property>
<property name="password"></property>
<property name="createTime"></property>
<property name="expireTime"></property>
</class>
</hibernate-mapping>
将User.hbm.xml文件加入到hibernate.cfg.cml文件中:上边的代码中已经加入到了文件中。
编写工具类ExportDB.java,将hbm生成ddl.也就是hmb2ddl
package com.lf.zym.hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/*
* 将hbm导出生成ddl
*/
public class ExportDb {
public static void main(String[] args){
//默认读取hibernate.cfg.xml文件
Configuration cfg=new Configuration().configure();
SchemaExport export=new SchemaExport(cfg);
export.create(true, true);
}
}
建立客户端类Client,添加用户数据到MySql:
package com.lf.zym.hibernate;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
//读取hibernate.cfg.xml文件
Configuration cfg=new Configuration().configure();
//建立SessionFactory
SessionFactory factory=cfg.buildSessionFactory();
//取得session
Session session=null;
try{
session=factory.openSession();
//开启事务
session.beginTransaction();
User user=new User();
user.setName("张三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//保存user对象
session.save(user);
//提交事务
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally{
if(session!=null){
if(session.isOpen()){
//关闭
session.close();
}
}
}
}
}
当Java程序以面向对象的方式来操作持久化对象时,Hibernate负责将这种操作转换为底层SQL操作。所有,当程序运行结束后,可以看到Hibernate数据库中增加了一个User表。