环境: hibernate-distribution-3.3.2.GA-dist , jdk1.7
一. 简介
1.1Hibernate框架
Hibernate是数据持久化工具,是一个开放源代码的对象关系映射框架。Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供面向对象的数据访问API。
Gavin King是Hibemate的创始人,EJB 3.0专家委员会成员,JBoss核心成员之一,也是Hibern tein Action 一书的作者。
2001年,Gavin King使用EJB的Entity bean l.l时,觉得开发效率太低,试图寻找更好的方案。
经过两年多的努力,在2003年,Gavin King和他的开发团队推出了Hibernate。
Gavin King成为全世界Java EE数据库解决方案的领导者,Hibernate成为全世界最流行的开源对象关系映射框架。
1.2 什么是ORM
ORM(Object/Relational Mapping)即对象/关系映射,是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据,如图所示。
在实际开发中,程序员使用面向对象的技术操作数据,而当存储数据时,使用的却是关系型数据库,这样造成了很多不便。ORM在对象模型和关系数据库的表之间建立了一座桥梁,有了ORM,程序员就不需要再使用SQL话句操作数据库中的表,使用API直接操作JavaBean对象就可以实现数据的存储、查询、更改和删除等操作。Hibernate就是采用ORM对象关系映射技术的持久化开发框架。
1.3 Hibernate框架的优缺点及其适用场合
(1) H1bernate功能强大,是Java应用与关系数据库之间的桥梁,较之JDBC方式操作数据库,代码量大大减少,提高了持久化代码的开发速度,降低了维护成本。
(2) Hibernate支持许多面向对象的特性,如组合、继承、多态等,使得开发人员不必在面向业务领域的对象模型和面向数据库的关系数据模型之间来回切换,方便开发人员进行领域驱动的面向对象的设计与开发。
(3)可移植性好。系统不会绑定在某个特定的关系型数据库上,对于系统更换数据库,通常只需要修改Hibernate配置文件即可正常运行。
(4) Hibernate框架开源免费,可以在需要时研究源代码,改写源代码,进行功能的定制,具有可扩展性。
Hibernate适用于大中型项目。
Hibernate框架的缺点
(1)不适合以数据为中心大量使用存储过程的应用。
(2)大规模的批量插入、修改和删除不适合用Hibemate。
Hibernate不适用于小型项目;也不适用于关系模型设计不合理、不规范的系统。
二. 入门案例
1. 在mysql中建表并插入数据
CREATE TABLE users
(
userId INT PRIMARY KEY AUTO_INCREMENT,
userName VARCHAR(20) NOT NULL,
PASSWORD VARCHAR(20) NOT NULL,
email VARCHAR(20)
);
INSERT INTO users(userName,PASSWORD,email) VALUES('jack','123','jack@qq.com');
INSERT INTO users(userName,PASSWORD,email) VALUES('mike','123','mike@qq.com');
INSERT INTO users(userName,PASSWORD,email) VALUES('麻子','123','mazi@qq.com');
2. 建立hibernate工程并导入相应jar包
3. 建立核心配置文件
在src目录下new一个xml文件,如图所示
dtd文档类型定义可以在jar包里面找到,如下图所示:
当我们把session-factory标签敲出来之后(按快捷键),我们就可以用界面操作的方式添加相关属性,如图:
结果如下:
<?xml version="1.0" encoding="UTF-8"?>
<!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="connection.url">jdbc:mysql://localhost:3306/companydb</property>
<property name="myeclipse.connection.profile">mysql</property>
<property name="connection.username">root</property>
<property name="connection.password">sasa</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
其中的几个常用参数的作用如下。
(l) connection.url:表示数据库URL。jdbc:mysql://localhost:3306/companydb
,是MySQL数据库的URL。
(2) connection.usemame:表示数据库用户名。
(3) connection.password:表示数据库用户密码。
(4) connection.driver class:表示数据库驱动。oracje.jdbc.driver.OracleDriver是Oracle数据库的驱动类。
(5) dialect:用于配置Hibernate使用的数据库类型。Hibe:mate支持几乎所有的主流数据库,包括Oracle. DB2. MS SQL Server和MySQL等。org.hibemate.dialect.Oracle11gDialect指定当前数据库类型是Oracle。
(6) current_session_context_class:指定currentSession()方法所得到的Session由谁来跟踪管理。thread指Session由当前线程来跟踪管理。
(7) show_sql:参数为true,则程序运行时在控制台输出SQL语句。
(8) format_sql:参数为true,则程序运行时在控制台输出格式化后的SQL语句。
package com.obtk.entitys;
import java.io.Serializable;
public class UserEntity implements Serializable{
private static final long serialVersionUID = 1034088741557780953L;
private int userId;
private String userName;
private String passWord;
private String email;
public UserEntity() {
System.out.println("默认构造方法执行了");
}
public UserEntity(String userName, String passWord, String email) {
super();
this.userName = userName;
this.passWord = passWord;
this.email = email;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
注意两点
第一,实体类要序列化 第二,实体类要有默认构造方法
5. 建立映射文件UserEntity.hbm.xml,建议和实体类放一起
<?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="com.obtk.entitys.UserEntity" table="users">
<id name="userId" type="integer">
<column name="userId"></column>
<generator class="native"></generator>
</id>
<property name="userName" type="string">
<column name="userName"></column>
</property>
<property name="passWord" type="string">
<column name="passWord"></column>
</property>
<property name="email" type="string">
<column name="email"></column>
</property>
</class>
</hibernate-mapping>
解释:dtd定义可以从hibernate3.jar里面找出来;<class name="com.obtk.entitys.UserEntity" table="users"> 中,name是实体类,table是要映射的表名
<id>标签是描述主键,name是属性值,column是表里面的列名,generator是主键生成策略, class=native是根据数据库底层的主键生成策略来定主键。
6. 和核心配置文件进行关联
7. 编写测试类
package com.obtk.test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.obtk.entitys.UserEntity;
public class TestQueryOne {
public static void main(String[] args) {
SessionFactory factory=null;
Session session=null;
Configuration conf=null;
try {
//读取配置文件
conf=new Configuration();
conf=conf.configure("hibernate.cfg.xml");
//获得一个session工厂
factory=conf.buildSessionFactory();
//获得session对象(类似于数据库连接)
session=factory.openSession();
UserEntity user1=(UserEntity)session.load(UserEntity.class, 8);
System.out.println("如果主键为8的数据没有会发生什么:"+user1);
System.out.println(user1.getUserName()+","+user1.getEmail());
} catch (HibernateException e) {
e.printStackTrace();
}finally{
if(session!=null){
session.close();
}
}
}
}
加载一个对象可以用load,也可以用get。对于get:如果加载的数据部存在,get方法会返回一个null,但是用load,则会抛出空指针异常。