Java框架(三)——Hiberate

       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>

执行了若干次之后,数据库中的数据如下图:






猜你喜欢

转载自blog.csdn.net/xudepeng0813/article/details/8009352