作为第一篇关于Hibernate的总结博文,简要说一下Hibernate的基本结构:
“Hibernate,是一个开放源代码的对象关系映射框架(ORM),它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate的目标主要是用于与数据持久化相关的编程任务,能够使开发人员从原来枯燥的SQL语句的编写中解放出来,解放出来的精力可以让开发人员投入到业务逻辑的实现上。Hibernate可以帮助用户消除或者包装那些针对特定厂商的SQL代码,并且帮用户把结果集从表格式的表示形式转换成一系列的对象。”
从下图可以看出,Hibernate处于中间部位,把Application传过来的Persistent持久化对象通过Hibernate核心配置文件和基本映射文件,持久化处理到数据库Database中。
Hibernate框架如下图:其中Persistence Layer属于Hibernate范畴。
下面是一个应用Hibernate生成表结构及INSERT一条记录的实例:
1. 搭建Hibernate实验环境 需要引入Hibernate下的核心包hibernate3.jar 、依赖包即 \lib 文件夹下的所有jar文件 、mysql驱动包 、Hibernate核心配置文件 hibernate.cfg.xml 。
2.在IDE中根据设计的User实体类,编写映射文件User.hbm.xml
-------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.jzg.hibernate.User">
<id name="id" column="t_user_id"><!-- 属性列的重命名 user_id -->
<generator class="uuid"></generator><!-- 主键生成策略 -->
</id>
<property name="name"></property>
<property name="password"></property>
<property name="createTime"></property>
<property name="expireTime"></property>
</class>
</hibernate-mapping>
3.在Hibernate核心配置文件hibernate.cfg.xml中添加User实体类映射文件信息。
------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>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">jzg</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.show_sql">true</property>
<!—在这里指定相应实体映射文件,此为路径 文件-->
<mapping resource="com/jzg/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
注意映射文件的存放位置:
4.事先通过mysql command line 生成database。
5. 在配置好基本文件后,编写ExportDBUtil类,执行生成表结构。
------ExportDBUtil.class
public class ExportDBUtil {
public static void main(String[] args){
//默认读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
}
-----print执行结果
drop table if exists User
11:03:56,732 WARN JDBCExceptionReporter:48 - SQL Warning: 1051, SQLState: 42S02
11:03:56,732 WARN JDBCExceptionReporter:49 - Unknown table 'user'
create table User (t_user_id varchar(255) not null, name varchar(255), password varchar(255), createTime datetime, expireTime datetime, primary key (t_user_id))
11:03:56,812 WARN JDBCExceptionReporter:48 - SQL Warning: 1051, SQLState: 42S02
11:03:56,812 WARN JDBCExceptionReporter:49 - Unknown table 'user'
6. 通过Hibernate中的Session对象 执行save()方法继而将实例持久化存入数据库,save()方法封装了我们以前要写的INSERT 语句。这里也基本能看出Hibernate把数据库操作等进行对象化封装,简单易操作,只要整理好需要持久化的对象,其他的和数据库操作的东西交给Hibernate去做吧。
------Client.class
public class Client {
public static void main(String[] args) {
//用Hibernate读取数据表,需要借助配置文件
//读取配置文件
Configuration cfg = new Configuration().configure();
//建立SessionFactory,然后就可以访问mysql了
SessionFactory factory = cfg.buildSessionFactory();
//取得session,session是一种用于管理数据库操作的对象。
Session session = null;
try{
//打开session
session = factory.openSession();
//开启事务
session.beginTransaction();
User user = new User();
user.setName("zhangsan");
user.setPassword("123456");
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
session.close();
}
}
}
}
}
附:NHibernate一个Hibernate胞弟一样的存在。
NHibernate:一个基于Java Hibernate的.NET平台下对象/关系数据库映射工具. 功能性和Hibernate是一样一样滴,但目前不如Hibernate应用范围广。
框架图: