Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
那么什么又是数据持久化呢?百度百科是这么解释的:数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。其实就是对象和数据库是一直关联的,对象上数据的修改,Hibernate框架会把这种修改同步到数据库中。
Hibernate框架使用Session会话,来完成数据的提交、更新、删除、查询等等。数据持久化是解决程序与数据库之间交互访问的问题,使程序不直接访问数据库,而是直接访问Session会话,然后由Session会话与数据库“打交道”。只要确保,程序每次访问Session时中的数据时,与数据库中的数据保持一致,就不会出现错误。
Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面分别解释这几个接口的作用:
1. Configuration:负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
2. SessionFactory:负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式
3. Session:负责执行被持久化对象的操作,完成与数据库的交流,包含了很多常见的SQL语句。
4. Transaction:负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码
5. Query/Criteria:负责执行各种数据库查询。它可以使用HQL语句或SQL语句两种表达方式。
那么Hibernate的工作原理是怎么回事呢?
1. 通过Configuration().configure()读取并解析hibernate.cfg.xml配置文件
2.由hibernate,cfg.xml中的<mappingresource="con/xx/xx.hbm.xml"/>读取解析映射关系
3. 通过config.buildSessionFactory()创建sessionFactory
4. sessionFactory.openSession()打开Session
5. session.beginTransaction 创建事物Transaction
6. persistent operate 持久化操作
7. session.getTransaction().commit()提交事物
8. 关闭session 和sessionFactory
下面做一个Hibernate的小Deme和大家分享:
1. 创建HibernateFactory.java文件:
package com.sinosoft.test.Util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateFactory {
public static SessionFactory sessionFactory;
static{
sessionFactory=new Configuration().configure().buildSessionFactory();
}
}
2. 创建实体对象User.Java
package com.sinosoft.test.entity;
import java.util.Date;
public class User {
private String id;
private String name;
private byte gender;
private Date birthday;
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 byte getGender() {
return gender;
}
public void setGender(byte gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
3. 创建逻辑接口
package com.sinosoft.test.service;
import java.util.List;
import com.sinosoft.test.entity.User;
public interface UserService {
public void addUser(User user);
public List<User> getAllUser();
}
4. 创建逻辑接口的实现:
package com.sinosoft.test.service.impl;
import java.util.Date;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.sinosoft.test.Util.HibernateFactory;
import com.sinosoft.test.entity.User;
import com.sinosoft.test.service.UserService;
public class UserServiceImpl implements UserService {
private SessionFactory sessionFactory=HibernateFactory.sessionFactory;
public void addUser(User user) {
if(user!=null){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
session.save(user);
transaction.commit();
session.close();
}
return ;
}
public List<User> getAllUser() {
List<User> users=null;
Session session =sessionFactory.openSession();
users=session.createQuery("from User").list();
session.close();
return users;
}
public static void main(String[] args){
for(User user:new UserServiceImpl().getAllUser()){
System.out.println(user.getName());
}
User user=new User();
user.setName("ppp");
user.setGender((byte) 0);
user.setBirthday(new Date());
new UserServiceImpl().addUser(user);
}
}
5. 配置配置文件User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.sinosoft.test.entity">
<class name="User" table="USERS">
<id name="id" column="ID">
<generator class="uuid"/>
</id>
<property name="name"/>
<property name="gender"/>
<property name="birthday" type="timestamp"/>
</class>
</hibernate-mapping>
6. 配置配置文件hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--数据库URL-->
<property name="connection.url">jdbc:mysql://localhost:3306/Hibernate_end</property>
<!--数据库用户名-->
<property name="connection.username">root</property>
<!--数据库密码-->
<property name="connection.password">123456</property>
<!--是否将运行产生的sql语句输出到日志-->
<property name="hibernate.show_sql">True</property>
<!--指定连接的语言-->
<property name="dialect">org.hibernate.dialect.H2Dialect</property>
<!--hbm2ddl.auto的值有4个:
create:表示启动的时候先drop,再create
create-drop: 也表示创建,只不过再系统关闭前执行一下drop
update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新
如果数据库中存在相应的表,可以不进行设置;如果数据库中没有对用的表进行操作,自动进行创建
-->
<property name="hbm2ddl.auto">create</property>
<mapping resource="com/sinosoft/test/entity/User.hbm.xml"/>-->
</session-factory>
</hibernate-configuration>
执行了若干次之后,数据库中的数据如下图: