- Hibernate是什么?
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
对象关系映射简称ORM(Object Relational Mapping),由于我们目前使用的编程语言大都是面向对象的编程,使用的数据库也大多都是关系型数据库,数据得以对象的形式在程序中使用,并且程序中的有些对象(数据对象)得永久保存在数据库中,故就出现了ORM,说得更通俗点:ORM就是将数据库中的数据和程序中的对象进行互相的转换!
如今的ORM框架可以说是很丰富的:
- Hibernate,开源 ORM 框架,广泛使用(使用最广泛)
- iBATIS,开源,由ASF维护,并且有 .NET移植(使用的也较广泛)
- TopLink,由Oracle开发
- Cayenne,Apache,java 开源
- QuickDB ORM,开源 ORM 框架 (GNU LGPL)
- Java Data Objects (JDO)
- Java Persistence API (JPA)
- JPOX,开源 JDO 2 参考实现
- Object Relational Bridge (Apache OJB),一个Java的对象关系映射器
- OpenJPA,Apache,开源,支持 JPA API
上面举例说了那么多ORM,那么ORM和Hibernate是什么关系呢?
一句说:Hibernate是ORM框架的一种实现.
这里我不得不说一下,大家不要觉得框架是一个很神奇的东西,其实我们也一直在做,一直在用,只不过我们所用所做的框架使用的范围不够大(也就是没普遍性),而且没也给它一个官方的名字而已!
ORM我们平时有做吗?
做Java开发的人,也一直在做,也一直在用,最常用的的DAO模式,DAO也是ORM的一种实现!
一个典型的DAO实现有下列几个组件:
1. 一个DAO工厂类;(工厂设计模式)
2. 一个DAO接口;(定义数据库操作)
3. 一个实现DAO接口的具体类;
4. 数据传递对象(有些时候叫做值对象).
Hibernate封装JDBC,持久化内存中的对象,同步到数据库 .
-
关于封装,我得强调两点:
(1).把尽可能多的东西藏起来.对外提供简捷的接口.
(2)把所有的属性藏起来
当然我们,我们如果能够做到单一原则就更好了
2.关于持久化的概念
持久化定义:将程序数据在持久状态和瞬时状态间转换的机制。
这里讲的是Hibernate的话得讲一下中的几种状态:瞬时状态,持久状态,脱管状态
- 瞬时状态(Transient):指一个对象在内存中开辟空间.如 User user=new User();此时user对象就是瞬时状态的.
- 持久状态(Persistent):数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。可以以文件,数据库以及xml等形式.
- 脱管状态(Detached):当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。
这里我想总结一点关于瞬时状态和持久状态:瞬时态就是存在于内存中的,如果电脑关了后,再启动,之前在内存中的对象已经不在了,如果持久状态的 话,保存在磁盘上的数据对象,当需要时还是可以加载到内存中,不会因电脑的启动而受到影响!
Hibernate入门实例
- 首先我们得下载Hibernate的需要的jar包.
- 下载的Hibernate会有很多jar包,一般有22或者23个左右,但到底我们需要的包有哪些呢?
hibernate3.jar: 这个是Hibernate的核心包,所以是必须的jar包.
cglib-2.2.jar: cglig库,Hibernate用它来实现PO字节码的动态生成,非常核心的包,所以也是必须的包
dom4j.jar
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,Hibernate用它来读写配置文件。
commons-collections.jar: Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。
javassist-3.12.0.GA.jar: 这个包也是必须的.
jta-1.1.jar: 当使用JTA规范时,必须加入,JTA全称是 Java Transaction API (java 事务 API),一般情况下也是必须的.
slf4j-api-1.6.1.jar: 这个包是必须的,因为在Hibernate的核心包中多处用到了,比如Configuration.class中用到了.
slf4j-nop-1.6.1.jar: 这个包是slf4j的实现类,所以也是必须的,注意实现类得和slf4j的版本要匹配.
hibernate-jpa-2.0-api-1.0.1.Final.jar: Hibernate使用Annotation(注解)需加,所以说如果不用Annotation的话就不用加的.
(以上的包是Hibernate3.5以上的版本)
3. 数据库脚本
我们使用mysql数据库,创建db_person,创建tb_student表,脚本如下:
1 drop database if exists db_Person; 2 create database db_Person; 3 use db_Person; 4 drop table if exists tb_student; 5 create table tb_student 6 ( id int(4) not null, 7 name varchar(20) not null, 8 age int(4) null, 9 primary key(id) 10 )ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=REDUNDANT;
4. Hibernate的配置:
通常hibernate的配置文件有两种一种是以xml,另外一种是以properties文件来进行配置,同样,Hibernate的配置文件有两种:一种是主配置文件(主要配置数据库相关的和映射文件的位置等),另外一种就是配置映射文件(数据库中的表和程序中的映射)
从上图我们可以看出主配置文件是hibernate.cfg.xml(这个名字最好就采用,因为在Hibernate中的Configuration中的configure()方法默认加载的就是hibernate.cfg.xml,并且一定要放在src目录下,当然如果你想在这些方面创新也是可以的,因为configure()还有一个重载方法configure(String resource) )
1 /** 2 * Use the mappings and properties specified in an application 3 * resource named <tt>hibernate.cfg.xml</tt>. 4 */ 5 public Configuration configure() throws HibernateException { 6 configure( "/hibernate.cfg.xml" ); 7 return this; 8 }
1 <?xml version='1.0' encoding='utf-8'?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 6 <hibernate-configuration> 7 8 <session-factory> 9 10 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 11 <property name="connection.url">jdbc:mysql://localhost:3306/db_Person</property> 12 <property name="connection.username">root</property> 13 <property name="connection.password">password</property> 14 15 <!-- JDBC connection pool (use the built-in) --> 16 <property name="connection.pool_size">1</property> 17 18 <!-- SQL dialect --> 19 <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 20 21 22 <!-- Disable the second-level cache --> 23 <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 24 25 <property name="current_session_context_class">thread</property> 26 27 <!-- Echo all executed SQL to stdout --> 28 <property name="show_sql">true</property> 29 30 31 <mapping resource="com/liuyi/bean/student.hbm.xml"/> 32 <mapping class="com.liuyi.bean.Teacher"/> 33 34 </session-factory> 35 36 </hibernate-configuration>
这里hibernate.cfg.xml是根据hibernate-configuration-3.0.dtd中的规范来定的,其中dtd是Document Type Definition(文档类型定义),关于dtd的规范,我以后会发表博客详细说明.
connection.url:连接数据库的URL
connection.username:数据库登录的用户名
connection.password:用户登录数据库的密码
connection.pool_size:数据库连接池的大小
dialect:数据库所使用的方言(hibernate支持几乎所有数据库的方言)
cache.provider_class:设置二级缓存的启用/禁用
current_session_context_class:为"当前" Session指定一个(自定义的)策略
show_sql:是否在控制台打印sql语句(true/false)
format_sql:在日志或控制台输出更漂亮的sql语句(true/false)
最后我还是觉得我应该把我学习hibernate的一个感觉:Hibernate是我学习java开源框架中,文档和帮助教程做得最好,最全,而且有中文的文档,所以我们在开发中遇到问题第一个首先的查阅官方文档.
hibernate完整实例1.建立数据库
CREATE TABLE usertable (
ID int(6) NOT NULL auto_increment,
username varchar(24) NOT NULL default '',
password varchar(24) NOT NULL default '',
PRIMARY KEY (ID)
)
2.配置文件,
加入myeclipse的hibernate.并在此工程中建立数据连结。建立完成后,在src下自动生成hibernate.cfg.xml
<?xml version='1.0' encoding='GBK'?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 是否将运行期生成的SQL输出到日志以供调试 -->
<property name="show_sql">true</property>
<!-- SQL方言,这里设定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- JDBC驱动程序 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL, "?useUnicode=true&characterEncoding=GBK" 表示使用GBK进行编码 -->
<property name="connection.url">
jdbc:mysql://localhost:3306/HibernateTest?useUnicode=true&characterEncoding=GBK
</property>
<!-- 数据库用户名 -->
<property name="connection.username">root</property>
<!-- 数据库密码 -->
<property name="connection.password">javamxj</property>
<!-- 指定User的映射文件 -->
<mapping resource="javamxj/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3.可持久化类
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
4.映射文件
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="javamxj.hibernate.User" table="UserTable">
<id name="id">
<generator class="assigned" />
</id>
<property name="username" />
<property name="password" />
</class>
</hibernate-mapping>
5.主程序
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class Test {
public static void main(String[] args) {
try {
SessionFactory sf = new Configuration().configure()
.buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setUsername("Blog");
user.setPassword("分享java快乐");
session.save(user);
tx.commit();
session.close();
} catch (HibernateException e) {
e.printStackTrace();
}
}
}