初识 Hibernate

简介

Hibernate 是一个持久层的 ORM(Object Relational Mapping 即对象关系映射) 框架。所谓 OGM 就是描述实体(持久化对象)与数据库表之间的对应关系。通过操作实体,就可以完成对数据表的操作。可以把 ORM 理解为关系型数据库和对象的一个纽带,开发人员只需要关注纽带一段映射的对象即可。

一个 Hibernate 入门例子

有些步骤能看懂就最好,目前看不懂也不要紧,后面我会一一详解

1.导入jar包
  需要的jar包 在下载的hibernate路径下的 lib/required的所有 jar包和 jpa目录下的jar包,mysql驱动jar包
2.创建数据库,准备表以及实体

 create database hibernate;
 use hibernate;
 
 CREATE TABLE `cst_customer` (
	  `cust_id` BIGINT(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
	  `cust_name` VARCHAR(32) NOT NULL COMMENT '客户名称(公司名称)',
	  `cust_source` VARCHAR(32) DEFAULT NULL COMMENT '客户信息来源',
	  `cust_industry` VARCHAR(32) DEFAULT NULL COMMENT '客户所属行业',
	  `cust_level` VARCHAR(32) DEFAULT NULL COMMENT '客户级别',
	  `cust_linkman` VARCHAR(64) DEFAULT NULL COMMENT '联系人',
	  `cust_phone` VARCHAR(64) DEFAULT NULL COMMENT '固定电话',
	  `cust_mobile` VARCHAR(16) DEFAULT NULL COMMENT '移动电话',
	  PRIMARY KEY (`cust_id`)
	) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
//Hibernate要求实体类必须提供一个不带参数的默认构造方法。因为程序运行时,Hibernate会运用java的反射机制,创建实体类的实例。 

public class Customer {

	private Long cust_id;
	
	private String cust_name;
	private String cust_source;
	private String cust_industry;
	private String cust_level;
	private String cust_linkman;
	private String cust_phone;
	private String cust_mobile;

	setter/getter方法。。。
	}
4.创建对象-关系映射文件。
  该文件应该和实体类在同一目录下。命名规则为 实体类名.hbm.xml 例如Customer.hbm.xml 

<?xml version="1.0" encoding="UTF-8"?>
<!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.pngyul.domain" >
	<class name="Customer" table="cst_customer" >
		<id name="cust_id"  >
			<generator class="native"></generator>
		</id>
		<property name="cust_name" column="cust_name" ></property>
		<property name="cust_source" column="cust_source" ></property>
		<property name="cust_industry" column="cust_industry" ></property>
		<property name="cust_level" column="cust_level" ></property>
		<property name="cust_linkman" column="cust_linkman" ></property>
		<property name="cust_phone" column="cust_phone" ></property>
		<property name="cust_mobile" column="cust_mobile" ></property>
	</class>
</hibernate-mapping>
5.创建Hibernate的配置文件,放在src目录下,文件名为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>
		 <!-- 数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		 <!-- 数据库url -->
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
		 <!-- 数据库连接用户名 -->
		<property name="hibernate.connection.username">root</property>
		 <!-- 数据库连接密码 -->
		<property name="hibernate.connection.password">root</property>
		<!-- 数据库方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 将hibernate生成的sql语句打印到控制台 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
		<property name="hibernate.format_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 引入orm元数据-->
		<mapping resource="com/pngyul/domain/Customer.hbm.xml" />
	</session-factory>
</hibernate-configuration>
6.代码测试
public class demo01 {
	@Test
	public void fun1(){
		//1.加载配置主配置文件,读取配置文件
		Configuration conf = new Configuration().configure();
		//2.获得sesion工厂
		SessionFactory sessionFactory = conf.buildSessionFactory();
		//3.获得seiioon
		Session session = sessionFactory.openSession();
		//4.获得事务对象并开启事务
		Transaction transaction = session.beginTransaction();
		//---------------------------------
		Customer customer= new Customer();
		customer.setCust_name("小米集团-W");
		session.save(customer);
		//---------------------------------
		//5.关闭资源
		transaction.commit();
		session.close();
		sessionFactory.close();
	}
}

这样,这条名为[小米集团—w]的 Customer 记录就保存到了数据库中。。
通过上面的小例子,我们大致了解了使用 Hibernate 的流程,接下来让我们详解 Hibernate。

orm 元数据详解

Hiernate采用XML格式的文件来指定对象和关系数据之间的映射。Hibernate通过这个文件来生成各种sql语句。
命名规则为 实体类名.hbm.xml  应该和实体类放在同一目录下。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
   <!-- 配置表与实体对象的关系 --> 
   <!-- package属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简答类名了.
     如下的class标签的name属性写了Customer简短类名,不然要写完整类名
    -->
   
<hibernate-mapping package="com.pngyul.domain" >

	<!-- 
		class元素: 配置实体与表的对应关系的
			name: 完整类名
			table:数据库表名
	 -->
	<class name="Customer" table="cst_customer" >
		<!-- id元素:配置主键映射的属性
				name: 填写主键对应属性名
				column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
				type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
						每个类型有三种填法: java类型|hibernate类型|数据库类型
				not-null(可选):配置该属性(列)是否不能为空. 默认值:false
				length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
		 -->
		<id name="cust_id"  >
		   <!--
                generator标签用来设定主键生成策略,hibernate内置的几种主键生成策略
                1.increment 适用于代理主键。由Hibernate自动以递增的方式生成主键,每次增量为1 ,会执行两个sql语句,先从表中查找出最大的id,然后加一,插入当前数据
                2.identity  适用于代理主键。由底层数据库生成主键,依赖数据库的主键自增功能
                3.sequence  适用于代理主键。由底层数据库的序列来生成主键,前提是数据库支持序列。(mysql不支持,oracle支持)
                4.hilo      适用于代理主键。Hibernate根据hilo算法来自己生成主键。
                5.native    适用于代理主键。根据底层数据库对自动生成主键的支持能力选择 identity|sequence|hilo
                6.uuid      适用于代理主键。采用UUID算法生成主键。
                7.assigned  适用于自然主键。由我们自己指定主键值。例如指定身份证号为主键值
            -->
			<generator class="native"></generator>
		</id>
		<!-- property元素:除id之外的普通属性映射
				name: 填写属性名
				column(可选): 列名会默认使用属性名
				type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
						每个类型有三种填法: java类型|hibernate类型|数据库类型
				not-null(可选):配置该属性(列)是否不能为空. 默认值:false
				length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
		 -->
		<property name="cust_name" column="cust_name" >
			<!--  <column name="cust_name" sql-type="varchar" ></column> -->
		</property>
		<property name="cust_source" column="cust_source" ></property>
		<property name="cust_industry" column="cust_industry" ></property>
		<property name="cust_level" column="cust_level" ></property>
		<property name="cust_linkman" column="cust_linkman" ></property>
		<property name="cust_phone" column="cust_phone" ></property>
		<property name="cust_mobile" column="cust_mobile" ></property>
	</class>
</hibernate-mapping>

Hibernate 主配置文件详解

Hibernate 从其配置文件中读取和数据库连接有关的信息。Hibernate 配置文件有两种形式,XML 格式或者 java 属性文件(properties)格式。

1.使用 xml 格式的配置文件,默认文件名为 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>
	
		<!-- 
		#hibernate.dialect org.hibernate.dialect.MySQLDialect
		#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
		#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
		#hibernate.connection.driver_class com.mysql.jdbc.Driver
		#hibernate.connection.url jdbc:mysql:///test
		#hibernate.connection.username gavin
		#hibernate.connection.password
		 -->
		 <!-- 数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		 <!-- 数据库url -->
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
		 <!-- 数据库连接用户名 -->
		<property name="hibernate.connection.username">root</property>
		 <!-- 数据库连接密码 -->
		<property name="hibernate.connection.password">root</property>
		<!-- 数据库方言
			不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
			sql99标准: DDL 定义语言  库表的增删改查
					  DCL 控制语言  事务 权限
					  DML 操纵语言  增删改查
			注意: MYSQL在选择方言时,请选择最短的方言.
		 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		
		<!-- #hibernate.show_sql true 
			 #hibernate.format_sql true
		-->
		<!-- 将hibernate生成的sql语句打印到控制台 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
		<property name="hibernate.format_sql">true</property>
		<!-- 
		## auto schema export  自动导出表结构. 自动建表
		#hibernate.hbm2ddl.auto create		自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
		#hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
		#hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
		#hibernate.hbm2ddl.auto validate	校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
		 -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 引入orm元数据
			路径书写: 填写src下的路径
		 -->
		<mapping resource="com/pngyul/domain/Customer.hbm.xml" />
		
	</session-factory>
</hibernate-configuration>

2.使用 java 属性文件(properties)格式。

默认文件名为hibernate.properties,为键值对的形式,放在src目录下,例如

hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbv:mysql://localhost:3306/hibernate
hibernate.connection.username=root
hibernate.connection.password=123456
hibernate.show_sql=true

Hibernate 的 API 详解

Configuration

在使用 Hibernate 时,首先要创建 Configuration 实例,Configuration 实例主要用于启动、加载、管理 hibernate 的配置文件信息。在启动 Hibernate 的过程中,Configuration 实例首先确定 Hibernate 配置文件的位置,然后读取相关配置,最后创建一个唯一的 Session Factory 实例。Configuration 对象只存在于系统的初始化阶段,它将 SessionFactory 创建完成后,就完成了自己的使命。

 new Configuration().configure() 加载默认文件路径下的xml格式的配置文件(hibernate.cfg.xml)推荐使用
 
 如果配置文件在不默认文件路径下或者配置文件名不符合默认规则
                     可以使用 
                     new Configuration().configure(file)  加载指定文件
                     new Configuration().configure(path)  加载指定路径下的文件 

如果使用properties格式的配置文件,可以使用addClass(实体类名.class)方法可以加载映射文件。           

SessionFactory

SessionFactory 代表数据库存储源。根据 Hibernate 配置文件创建对应的数据库存储源。
SessionFactory 对象创建后,和 Configuration 对象再无关联。修改 Configuration 包含的配置文件信息,不会对 SessionFactory 有任何影响。

 获取SessionFactory对象:
 new Configuration().configure().buildSessionFactory();

由于它是线程安全的以及其重量级的特点,一般情况下,一个项目只需要一个 SessionFactory,只有当应用中存在多个数据源时,才为每个数据源建立一个 Session Factory 实例。因此,在实际项目使用中,通常会抽取出一个 Hibernate 的工具类,用来提供 Session 对象。

Hibernate 工具类
public class HibernateUtils {
	private static SessionFactory sf;
	
	static{
		//1 创建,调用空参构造
		Configuration conf = new Configuration().configure();
		//2 根据配置信息,创建 SessionFactory对象
		 sf = conf.buildSessionFactory();
	}
	
	//获得session => 获得全新session
	public static Session openSession(){
				//3 获得session
				Session session = sf.openSession();
				
				return session;
		
	}
	//获得session => 获得与线程绑定的session
	public static Session getCurrentSession(){
		//3 获得session
		Session session = sf.getCurrentSession();
		
		return session;
	}
}

PS:要获得与线程绑定的 Session,需要在主配置文件中配置一行代码:

<property name="current_session_context_class">thread</property> 

SessionFactory 内部还维护了一个连接池,如果想使用第三方连接池如 c3p0,请自行寻找资源学习!!!

Session

Session 时应用程序与数据库之间交互的一个单线程对象,时 Hibernate 运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在 session 的管理下才可以进行持久化操作。

获得Session的两种方法(上面已涉及到)
factory.openSession():
		 获取新的Session实例。使用完成需要手动关闭
factory.getCurrentSession():
		采用该方法创建的Session会取出当前线程中的Session,
		底层使用ThreadLocal进行存取 。不需要手动关闭,它在提交或回滚操作时会自动关闭
		Session时线程不安全的。多个并发线程同时操作一个Session 时,可能导致 Session 
		数据存取的混乱,同时他也是轻量级的,实例的创建与销毁不需要消耗太多的资源。
		故建议使用该方法获得session

另外,它还有一个缓存,即 HIbernate 的以及缓存,这个缓存主要用于存放当前工作单元加载的对象,后面后详解。

还有,在 Session 中提供了大量的常用方法,具体如下:

save()、update()和saveOrUpdate方法:用于增加火热修改对象。
delete():删除对象
get()和load():根据主键查询
createQuery()和createSQLQuery():用于数据库操作对象
createCriteria():条件查询

Transaction

封装了事务的操作。我们做增删改查等操作时,必须开启事务.
    因为session是线程不安全的,这样主要是为了线程安全。保证数据的正确性。
    开启事务: Transaction ts=session.beginTransaction();
    提交事务:ts.commit();
    回滚事务:ts.rollback();
    当通过getCurrentSession获取当前线程绑定的Session时,事务关闭时,会自动把Session关闭并删除。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值