Hibernate从零开始Hibernate

Posted 经理,天台风好大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate从零开始Hibernate相关的知识,希望对你有一定的参考价值。

一、认识 Hibernate

1、hibernate 中文:冬眠

2、持久化:数据从瞬时状态转化为持久状态

3、Hibernate:是一个轻量级的持久化框架。没有侵入性。是一个 orm 映射框架。简化了 jdbc 操作。极大了提高了开发效率。提供了缓存机制。强大的查询机制。支持多种数据库(数据库移植);

4、框架结构原理(解决阻抗不匹配)
在这里插入图片描述
5、原理
在这里插入图片描述

二、第一个hibernate案例

2.1 包的结构解析

在这里插入图片描述

2.2 hello hibernate

  1. 新建 java 项目
  2. 导入相关 jar 包
    antlr-2.7.7.jar
    dom4j-1.6.1.jar
    hibernate-commons-annotations-4.0.5.Final.jar
    hibernate-core-4.3.10.Final.jar
    hibernate-jpa-2.1-api-1.0.0.Final.jar
    jandex-1.1.0.Final.jar javassist-3.18.1-GA.jar
    jboss-logging-3.1.3.GA.jar
    jboss-logging-annotations-1.2.0.Beta1.jar
    jboss-transaction-api_1.2_spec-1.0.0.Final.jar
    mysql-connector-java-5.1.20-bin.jar
  3. 编写 hibernate.cfg.xml 文件(拷贝 project/etc/hibernate.cfg.xml)
<hibernate-configuration>
	<session-factory> 
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property > 
		<property name="connection.url">jdbc:mysql://localhost:3306/hibernate4</property> 
		<property name="connection.username">root</property> 
		<property name="connection.password">root</property> 
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
	</session-factory> 
</hibernate-configuration>
  1. 编写实体类
public class User { 
	private int id; 
	private String name;
	private int age; 
	
	public User() {} 
}
  1. 编写实体类的映射文件(*.,hbm.xml)—将映射文件加入到 hibernate.cfg.xml
<hibernate-mapping package="cn.sxt.pojo"> 
	<class name="User" table="t_user"> 
		<id name="id"> 
			<generator class="native"/> 
		</id> 
		<property name="name"/> 
		<property name="age"/> 
	</class> 
</hibernate-mapping>
  1. 编写测试类
public class Test { 
	public static void main(String[] args) { 
	//读取 src 下 hibernate.cfg.xml 
	Configuration cfg = new Configuration().configure(); 

	//获取注册对象 4.3 的创建办法 
	ServiceRegistry registry = new StandardServiceRegistryBuilder()
									.applySettings(cfg.getProperties())
									.build(); 
	SessionFactory factory = cfg.buildSessionFactory(registry); 
	Session session = factory.openSession(); 
	//保存数据 
	Transaction tx = session.beginTransaction(); 
	User u = new User("张三",22); 
	session.save(u); 
	tx.commit(); 
	session.close(); 
	} 
}

三、配置文件讲解

3.1 hibernate.cfg.xml 配置文件

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration> 
	<!-- session 工厂的配置 --> 
	<session-factory> 
		<!-- jdbc 配置 --> 
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property> 
		
		<property name="connection.url"> 
			<!-- url 的两种配置方式 --> 
			<!-- jdbc:mysql://localhost:3306/hibernate4--> 
			jdbc:mysql:///hibernate4 
		</property>
		
		<property name="connection.username">root</property> 
		<property name="connection.password">root</property> 
		<!-- 数据库方言 hibernate 支持多种数据库,通过设置方言 hibernate 才知道应该 生成对应数据库的 sql 语句:hibernate 支持的数据库的方言 hibernate.properties 文件中都有 --> 
		<property name="dialect">
			org.hibernate.dialect.MySQL5Dialect
		</property> 
		
		<!-- 打印 hibernate 生成的 sql 语句 --> 
		<property name="show_sql">true</property> 
		<!-- 格式化打印的 sql 语句 --> 
		<property name="format_sql">true</property> 
		<!-- 根据不同值,进行数据表表的操作 
			create 每次执行 都删除原有表,然后创建新表 
			create-drop 执行前创建表,执行后删除表 
			update 如果有则不改变表,如果没有则创建 
		--> 
		<property name="hbm2ddl.auto">update</property> 
		<!-- 将所有映射文件添加到这里 --> 
		<mapping resource="cn/sxt/pojo/User.hbm.xml"/> 
	</session-factory> 
</hibernate-configuration>

3.2 *.hbm.xml 映射文件讲解

<!-- 类的映射文件信息 --> 
<!-- package 指定类的包名 可以不配置 如果不配置 那么在配置 class 的 name 时需要指定该类所在包--> <hibernate-mapping>
	<!-- class 配置类 
		name 指类名 
		table 指定表名 
		如果不写,默认类名 为表名
	--> 
	<class name="cn.sxt.pojo.User" table="t_user"> 
		<!-- id 主键的配置 
			name 配置类的属性名 
			column 数据库字段名 不写和属性名一致 
			type 指定属性的类型 
			length 指定字段的长度 
		--> 
		<id name="id" column="id"> 
		<!-- 主键的生成策略 
			increment: 
				-用于为 long, short 或者 int 类型生成 唯一标识。只有在 没有其他进程往同一张表中插入数据时才能使用。 
			在集群下不要使用。 
			identity:
				-对 DB2,MySQL, MS SQL Server, Sybase 和 HypersonicSQL的内置标识字段提供支持。 
				返回的标识符是 long, short 或 者 int 类型的。
			native: -(如果是 mysql 自增,那么 native 和 identity 是一样)	
				-根据底层数据库的能力选择 identity, sequence 或者 hilo 中的一个。
			sequence: 
				-在 DB2,PostgreSQL, Oracle, SAP DB, McKoi 中使用序 列(sequence), 而在 Interbase 中使用生成器(generator)。返回的标识 符是 long, short 或者 int 类型的。 
				<generator class="sequence"> 
					<param name="sequence">user_seq</param> 
				</generator> 
			assigned: 
				-让应用程序在 save()之前为对象分配一个标示符。这是 <generator>元素没有指定时 
				的默认生成策略。 
			--> 
			<generator class="identity"> 
			</generator> 
		</id> 
		<!-- property 是配置类的属性 name 指属性名 --> 
		<property name="name" length="40"/> 
		<property name="age" /> 
	</class> 
</hibernate-mapping>

四、Hello 的代码分析

4.1 Test.java

package cn.sxt.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import cn.sxt.pojo.User;

public class Test {
	public static void main(String[] args) {
		//1、读取src下hibernate.cfg.xml 如果不为configure指明参数 默认读取hibernate.cfg.xml
		Configuration cfg = new Configuration().configure();
		//3.x版本不需要ServiceRegistry
		//4.0 ServiceRegistryBuilder
		//获取注册对象4.3的创建办法
		ServiceRegistry registry = new StandardServiceRegistryBuilder()
									.applySettings(cfg.getProperties())
									.build();
		//SessionFactory是一个重量级对象 session的工厂 生命周期是进程级别的 支持集群 线程安全的
		SessionFactory factory = cfg.buildSessionFactory(registry);
		/*Session (org.hibernate.Session) 
			表示应用程序与持久储存层之间交互操作的一个单线程对象,
			此对象生存期很短。 其隐藏了JDBC连接,也是Transaction的工厂。
			 其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到
		   session支持数据库操作
		 * */
		Session session = null;
		//事务对象
		Transaction tx =null;
		try{
			session = factory.openSession();
			tx = session.beginTransaction();
			User u = new User("小红",22);
			//保存数据
			session.save(u);
			//提交事务
			tx.commit();
		}catch(Exception e){
			if(tx!=null)
			//回滚事务
			tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
		factory.close();
	}
}

4.2 封装util

package cn.sxt.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {
	private static Configuration cfg=null;
	private static ServiceRegistry registry=null;
	private static SessionFactory factory=null;
	static{
		cfg = new Configuration().configure();
		registry = new StandardServiceRegistryBuilder()
					.applySettings(cfg.getProperties())
					.build();
		factory = cfg.buildSessionFactory(registry);
	}
	public static Session getSession(){
		return factory.openSession();
	}
}

4.3 常用操作

package cn.sxt.vo;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.sxt.pojo.User;
import cn.sxt.util.HibernateUtil;

public class HibernateTest {
	//向数据库添加数据
	@Test
	public void testSave(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			
			User u = new User("张学友",55);
			
			session.save(u);
			
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
	//获取数据
	@Test
	public void testGetById(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			//获取对象   第一参数 是对象的类型  第二个参数是 主键值
			//User u = (User)session.get(User.class, 2);
			User u = (User)session.load(User.class, 2);
			System.out.println(u);
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
	//获取所有对象
	@Test
	public void testGetAll(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			//查询所有
			List<User> list = session.createCriteria(User.class).list();
			for(User u:list){
				System.out.println(u);
			}
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
	//修改数据
	@Test
	public void testUpdate(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			//获取对象   第一参数 是对象的类型  第二个参数是 主键值
			//User u = (User)session.get(User.class, 2);
			User u = (User)session.load(User.class, 2);
			u.setAge(60);
			//修改数据
			session.update(u);
			System.out.println(u);
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
	@Test
	public void testDelete(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			//获取对象   第一参数 是对象的类型  第二个参数是 主键值
			//User u = (User)session.get(User.class, 2);
			User u = (User)session.load(User.class, 2);
			//删除对象
			session.delete(u);
			System.out.println(u);
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
}

五、hibernate 对象生命周期

5.1 对象生命周期图

在这里插入图片描述

5.2 对象的 3 种状态:

  1. 临时状态/瞬时状态:
    该对象是新创建的;一个持久化状态的对象被删除;一个游离状态的数据被删除
  2. 持久化状态:
    对象从数据库中查询出来时,临时状态的数据被保存时,游离状态的数据被更新/ 锁定
  3. 游离状态:
    持久化状态的数据被(session)清理

5.3 对象生命周期一

@Test
public void testSession(){ 
	Session session = null; 
	//瞬时状态 
	User u = new User("西毒",70);
	try{
		session = HibernateUtil.getSession(); 
		session.beginTransaction()hibernate从零开始到各种映射

从零打造在线网盘系统之Hibernate框架起步

分享知识-快乐自己:初识 Hibernate 概念片

从零打造在线网盘系统之Hibernate查询与更新技术

从零打造在线网盘系统之Hibernate配置O/R映射

Intellij IDEA下的第一个Hibernate项目