Hibernate_day01

1.1 Hibernate的概述

        Hibernate是当今主流的Java数据持久层的框架之一,Hibernate是一个免费开源的ORM(Object Relational Mapping 对象关系模型)框架,Hibernate对JDBC进行了轻量级的封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

1.2 Hibernate的好处

       Hibernate对JDBC访问数据库的代码进行了轻量级的封装,大大的简化了数据访问层繁琐的的重复性代码,并且减少了内存消耗,加快了运行效率。

1.3 Hibernate入门

1.3.1 下载Hibernate5

 下载: https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

解压完目录结构如下图。
  • document 文件夹:存放Hibernate的相关文档,包括参考文档的API文档。
  • lib 文件夹:存放Hibernate编译和运行所依赖的jar包。其中required子目录下包含了运行Hibernate5项目必须的JAR包。
  • project 文件夹 : 存放Hibernate各种相关的源代码。                   
   在lib/required子目录下包含的jar包
   

1.3.2 Hibernate项目需要的jar包

数据库驱动包、Hibernate/lib/required/*.jar、日志记录的包

 1.3.3 创建实体类(持久化类)

       hibernate使用普通Java对象(Plain Oid Java Object), 即POJO的编程模式来进行持久化。POJO类包含的是与数据库表相对应的各个属性,这些属性通过getter和setter方法来访问。

1.3.4 映射文件的配置

<?xml version="1.0" encoding="utf-8" ?>
<!-- 映射文件的dtd信息 -->
<!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.yyh.hibernate.pojo">
	<!-- name是实体类名,table是表名 -->
	<class name="Customer" table="cst_customer">	
		<!-- name是类中的id属性 column是表中的id字段 -->
		<id name="cust_id" column="cust_id">
			<!-- 主键生成策略 -->
			<generator class="native"></generator>
		</id>
		<!-- 其他属性使用property标签来映射 -->
		<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>	

映射文件通常是一个XML文件,一般命名为类名.hbm.xml,与实体类放在同一个目录下

1.3.5 核心配置

Hibernate的配置文件,包含连接持久层所需要的基本信息,其配置文件有两种格式,具体如下:
  • 一种是properties属性文件格式的配置文件,它使用键值对的形式存放信息,默认文件名称为hibernate.properties;

  • 另一种是XML格式的配置文件,XML配置文件的默认名称为hibernate.cfg.xml                                                                        上述两种格式的配置文件是等价的,具体使用哪个可以自由选择。XML格式的配置文件更容易修改,配置能力强,当改变底层应用配置时不需要改变和重新编译代码,只修改配置文件的相应属性即可,而properties格式的文件则不具有此优势,因此,在实际开发项目中,大多数情况会使用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>
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123456</property>
		
		<!-- 数据库方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!-- 是否在控制台输出SQL语句 -->
		<property name="hibernate.show_sql">true</property>
		
		<!-- 是否在控制台按格式输出SQL语句 -->
		<property name="hibernate.format_sql">true</property>
		
		<!-- hibernate的hbm2dd1(	数据库定义语言:create、drop、alert ... -->
		<!-- 
			hbm2dd1.auto的值:
				* none : 不用Hibernate自动生成表
				* create : 每次都会创建一个新的表(测试用)
				* create-drop : 每次都会创建一个新的表,执行程序结束后删除这个表(测试用)
				* update : 如果数据库有表,使用数据库中的表,如果没有,创建一个新表,可以更新表结构
				* validate : 只会使用原有的表,对映射关系进行校验。
		 -->
		 <property name="hibernate.hbmadd1.auto">update</property>
		 
		 <!-- Hibernate加载映射 -->
		 <mapping resource="com/yyh/hibernate/pojo/Customer.hbm.xml"/>
		 
	</session-factory>
	
</hibernate-configuration>

            配置文件的dtd信息,可以在核心包hibernate-core-5.0.7.Final.jar下的org.hibernate包中的hibernate-configuration-3.0.dtd文件中找到。

1.3.6 Hibernate的相关API

1.3.6.1 Configuration: 配置对象

Configuration主要用于Hibernate框架加载映射文件。
     Configuration类的作用是对Hibernate进行配置,以及对它进行启动。在hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置, 读取这些配置,然后创建一个SessionFactory对象。虽然Configuration类在整个Hibernate项目中扮演着一个很小的角色,但它是启动hibernate时所遇到的第一个对象。
        Hibernate通常会使用Configuration config = new Configuration().configure();的方式来创建实例,此种方式默认会去src下读取hibernate.cfg.xml配置文件。如果不想使用默认的hibernate.cfg.xml配置文件,而是使用指定目录下(或者自定义)的配置文件,则需要向configure()方法中传递一个文件路径的参数,例如:
Configuration config = new Counfiguration().configure("配置文件xml的位置");

此种写法hibernate会去指定位置查找匹配文件,例如想要使用src下config包中hibernate.cfg.xml文件,只需将文件位置加入configure()中即可

Configuration config = new Configuration().configure(“/config/hibernate.cfg.xml”);

1.3.6.2 SessionFactory : Session工厂对象

    SessionFactory接口负责Hibernate的初始化和建立Session对象。它在hibernate中起到一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的数据放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。
      SessionFactory实例是通过Configuration对象获取的,其获取方法如下所示:
SessionFactory sessionFactory = config.buildSesssionFactory();
       SessionFactory具有以下特点:
            - 它是线程安全的,它的一个实例可以供多个线程共享。
            - 它是重量级的,不能随意的创建和销毁它的实例。
        由于SessionFactory具有这些特点,一般情况下,一个项目中只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。所以一般实际开发项目使用中,通常会抽取出一个HibernateUtils的工具类,用来提供Session对象。
Hibernate的工具类:
public class HibernateUtils {
	
	private static SessionFactory sessionFactory;
	
	static {
		Configuration config = new Configuration().configure();
		sessionFactory = config.buildSessionFactory();
	}
	
	// 提供获得Session的方法
	public static Session openSession() {
		return sessionFactory.openSession();
	}
	
}

1.3.6.3 Session

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

        获得Session实例有两种方式:

// 采用openSession方法创建对象
Session session = sessionFactory.openSession();

// 采用getCurrentSession()方法创建对象
Session session = sessionFatory.getCurrentSession();
        这两种创建方式的主要区别是:

            -- openSession是直接创建一个新的Session实例,并且在使用完成后需要调用close方法进行手动关闭。

            -- getCurrentSession是创建的Session实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭。

         Session是线程不安全的,多个并发线程同时操作一个Session实例是,就可能导致Session数据存取的混乱(方法内部定义和使用Session时,不会出现线程问题)

1.3.6.4 Transaction

        Transaction接口主要用于管理事务,它是Hibernate的数据库事务接口,且对底层的事务接口进行了封装。Transaction接口的事务对象是通过Session对象开启的。

Transaction tx = session.beginTransaction();

在Transaction接口中,提示了事务管理的常用方法,具体如下:

    -- commit()方法: 提交相关联的session实例

    -- rollback()方法: 撤销事务操作

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



                   

              

            


                     

猜你喜欢

转载自blog.csdn.net/qq_37581282/article/details/81037262
今日推荐