ssh框架学习之Hibernate框架(一)


ssh框架学习了很久,可以说内容上都已经学完,但是通过最近的应用上看出,对框架的了解不够深刻,遗忘的很快,好记性不如烂笔头,希望通过写博客,对所学的知识进行整理,这也是本人第一次写博客,若内容有误,希望能够指出,谢谢!

一、Hibernate介绍

Hibernate框架是当今主流的Java持久层框架之一,由于它灵活性强、易扩展等特点,能够大大地简化程序的代码量,提高工作效率(注:这些都是套话,但对于萌新的博客作者来说确实很强大)。
Hibernate是一个ORM框架,所谓ORM就是利用描述对象和数据库表之间映射的元数据,自动把Java应用程序中的对象,持久化到关系型数据库的表中。通过操作Java对象,就可以完成对数据表的操作。可以把ORM理解为关系型数据和对象的一个纽带,我们开发人员只需要关注纽带一端映射的对象即可。

二、Hibernate入门

  1. 下载Hibernate5
    首先需要下载Hibernate5框架下载地址,接着在项目中导入所需要的jar包,必须要导入的jar包在下载解压后的lib/required/目录下,此外还需要导入数据库的驱动包以及日志记录的jar包。
    在这里插入图片描述
  2. 创建实体(持久化类)
    持久化类是应用程序的业务实体类,这里的持久化类的对象能够被持久化保存到数据库中。Hibernate使用POJO(Plain Old Java Object:普通Java对象)的编程模式来进行持久化。POJO类中包含的是与数据表中相对应的各个属性,这些属性通过gettersetter方法来访问,对外部隐藏了内部实现的细节。如下创建一个简单的User持久化类,注意:getter和setter方法一定不要自己写,一定要通过开发工具生成,因为getter和setter的方法命名有一套自己的规则。还有就是不要用基本类型,一定要用包装类型,将平时喜欢用的int、long、double、char等等替换为Integer、Long、Double、Character等等。
public class User{
	private Integer id;
	private String username;
	private String password;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	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;
	}
}
  1. 创建映射文件
    单独的实体类并不具备持久化操作能力,Hibernate需要知道实体类映射到数据库中的哪张表,以及类中的哪个属性对应数据库表中的哪个字段,这些需要在映射文件中去配置,如下创建一个名称为User.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属性为User对象的路径 -->
<hibernate-mapping package="com.zgf.domain" >
	<!-- 
		class标签:用来建立类和表的映射
			name属性:对应持久化类名(若上面package属性没有配置,这里需要填写类的全路径)
			table属性:对应数据库中的表名(若类名和表名一致,哪个可以省略此属性)
			catalog属性:数据库名称,可以省略 -->
	<class name="User" table="sys_user" >
		<!-- 
			id标签:用来建立类中的属性与表中的主键字段对应
				name属性:为类中的属性名
				column对应数据库表中的列名(字段名,若类中的属性名和表中的字段名一致看,可以省略)
				
				length属性:字段的长度(可省略)
				type属性:字段类型(可省略) -->
		<id name="id"  column="u_id">
			<!-- 主键生成策略,后面的内容会说到 -->
			<generator class="native"></generator>
		</id>
		<!-- 
			property标签为表的普通列
				name属性:为类中的属性名
				column对应数据库表中的列名(字段名,若类中的属性名和表中的字段名一致看,可以省略)
				
				length属性:字段的长度(可省略)
				type属性:字段类型(可省略) -->
		<property name="username" column="u_username"></property>
		<property name="password" column="u_password"></property>
	</class>
</hibernate-mapping>
  1. 创建Hibernate核心配置文件
    Hibernate的映射文件反映了持久化类和数据库表的映射信息,而Hibernate的配置文件则主要用来配置数据库连接以及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>
	
		<!-- 
		#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">123456</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>
		
		 <!-- 指定hibernate操作数据库时的隔离级别 
			#hibernate.connection.isolation 1|2|4|8		
			0001	1	读未提交
			0010	2	读已提交
			0100	4	可重复读
			1000	8	串行化
		 -->
		 <property name="hibernate.connection.isolation">4</property>
		 <!-- 指定session与当前线程绑定 -->
		 <property name="hibernate.current_session_context_class">thread</property>
		<!-- 引入orm元数据
			路径书写: 填写src下的路径
		 -->
		<mapping resource="com/zgf/domain/User.hbm.xml" />
	</session-factory>
</hibernate-configuration>
  1. 编写测试程序
public class HibernateDome {

	@Test
	public void test() {
		//1加载配置文件
		Configuration configure = new Configuration().configure();
		//2创建一个SessionFactory
		SessionFactory sessionFactory = configure.buildSessionFactory();
		//3创建session对象
		Session session = sessionFactory.openSession();
		//4开启事务
		Transaction tx = session.beginTransaction();
		//-----------------------------------------
		//5执行相关操作
		User user = new User();
		user.setUsername("张三");
		user.setPassword("xxxxxx");
		session.save(user);
		//-----------------------------------------
		//6提交事务
		tx.commit();
		//7释放资源
		session.close();
	}
}
  • Configuration:配置对象
    在使用Hibernate时,首先要创建Configuration实例,Configuration主要用于启动、加载、管理hibernate的配置文件信息。在启动hibernate的过程中,Configuration实例首先确定Hibernate对象配置文件的位置,然后读取相关配置,最后创建一个唯一的SessionFactory实例。Configuration对象只存在于系统的初始化阶段。
    hibernate通常使用Configuration cfg = new Configuration().configure();的方式来创建实例,这种方法默认会去src下读取hibernate.cgf.xml配置文件,若不想使用默认的配置文件(其他的命名方式),则需要向configure方法中传递一个文件路径的参数。

  • SessionFactory:Session工厂对象
    SessionFactory接口负责Hibernate的初始化和建立Session对象。它在Hibernate中起到一个缓冲作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的数据放在这个缓冲区中。同时它还保持了对数据库配置的所有映射关系,维护了当前的二级缓存。
    SessionFactory具有以下特点:

    • 它是线程安全的,它的同一个实例能够供多个线程共享。
    • 它是重量级的,不能随意的创建和销毁它的实例。
      一般情况下,一个项目只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。因此,在实际的项目中,通常会抽取一个HibernateUtils工具类,用来提供Session对象。
      Hibernate的工具类:
public class HibernateUtils {
	private static SessionFactory sessionFactory;
	static {
		Configuration configure = new Configuration().configure();
		sessionFactory = configure.buildSessionFactory();
	}
	public static Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}
	public static Session openSession() {
		return sessionFactory.openSession();
	}
}

  • Session
    Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。
    获取Session实例有两种方式,一种是通过openSession()方法,另一种是通过getCurrentSession()方法。
//采用openSession方法创建session
Session session = sessionFactory.openSession();
//采用getCurrentSession()方法创建session
Session session  = sessionFactory.getCurrentSession();

以上两种获取session实例方式的主要区别是,采用openSession方法获取session实例时,SessionFacotory直接创建一个新的Session实例,并且在使用完成后需要调用close方法进行手动关闭。而getCurrentSession()方法创建的Session实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭。
在Session中提供了大量的常用方法,具体如下:

save()、 update()和saveOrUpdate()方法:用于增加和修改对象。
delete()方法:用于删除对象。
get()和load()方法:根据主键查询。
createQuery()和createSQLQuery方法:用于数据库操作对象。
createCriteria()方法:条件查询。
  • Transaction
    Transaction接口主要用于管理事务,它是Hibernate的数据库事务接口,且对底层的事务接口进行了封装。Transaction接口的事务对象是通过Session对象开启的,其开启方式如下。
    Transaction tx = session.beginTransaction();
在Transaction接口中,提供了事务管理的常用方法,具体如下:
commit()方法:提交相关联的session实例。
rollback()方法:撤销事务操作。

Session执行完数据库操作后,要使用Transaction接口的commit()方法进行事务提交,才能真正的将数据操作同步到数据库中。发生异常时,需要使用rollback()方法进行事务回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值