• Hibernate框架笔记01_环境搭建_API_CRUD


    1. Hibernate框架的概述

    1.1 什么是框架

    • 框架:指的是软件的半成品,已经完成了部分功能。

    1.2 经典三层架构

    三层架构

    1.3 Hibernate框架

    • 什么是hibernate:Hibernate是一个持久层ORM框架

    • 什么是ORM:Object Relational Mapping(对象关系映射)。指的是将一个Java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表。

      对象关系映射

    2 Hibernate入门

    2.1 下载Hibernate的开发包

    2.2 创建项目,引入jar包

    • 数据库驱动包mysql

    • hibernate开发必备包required

    • hibernate引入日志记录包

    2.3 创建表

    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_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;
    

    2.4 创建实体类

    package com.itzhouq.hibernate.demo1;
    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_phone;
    	private String cust_mobile;
        //set/get。。。
    

    2.5 创建映射(***)

    • 映射需要通过XML的配置文件来完成,这个配置文件可以任意命名。尽量统一命名规范(类名.hbm.xml)

    • package com.itzhouq.hibernate.demo1;包下新建映射文件Customer.hbm.xml

    • 导入约束

      <!DOCTYPE hibernate-mapping PUBLIC 
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
      
    • 完整的映射文件

      <?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>
      	<!-- 建立类和表的映射 -->
      	<class name="com.itzhouq.hibernate.demo1.Customer" table="cst_customer">
      		<!-- 建立类中的属性与表中的主键对应 -->
      		<id name="cust_id" column="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_phone" column="cust_phone"></property>
      		<property name="cust_mobile" column="cust_mobile"></property>
      	</class>
      	
      </hibernate-mapping>
      

    2.6 创建一个Hibernate的核心配置文件(***)

    • Hibernate的核心配置文件的名称:hibernate.cfg.xml

    • 在src下新建核心配置文件hibernate.cfg.xml,导入约束

    • 配置核心文件,连接数据库,用户名,密码等信息可以参考文件..hibernate-release-5.0.7.Finalhibernate-release-5.0.7.Finalprojectetchibernate.properties 56行 351行

      <?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">2626</property>
      		
      		<!-- 配置Hibernate的方言(可选的) -->
      		<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>
      		
      		<!-- 配置映射文件 -->
      		<mapping resource="com/itzhouq/hibernate/demo1/Customer.hbm.xml"/>
      		
      	</session-factory>
      </hibernate-configuration>
      

    1.2.7 编写测试代码

    package com.itzhouq.hibernate.demo1;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    public class HIbernateDemo1 {
    	
    	//保存客户的案例
    	@Test
    	public void demo1() {
    		// 1. 加载hibernate的核心配置文件
    		Configuration configure = new Configuration().configure();
    		// 2. 创建一个SessionFactory对象:类似于JDBC的中连接池
    		SessionFactory sessionFactory = configure.buildSessionFactory();
    		// 3. 通过SessionFactory获取Session对象:类似于JDBC中Connection
    		Session session = sessionFactory.openSession();
    		// 4. 手动开启事务
    		Transaction transaction = session.beginTransaction();
    		// 5. 编写代码
    		Customer customer = new Customer();
    		customer.setCust_name("老王");
    		
    		session.save(customer);
    		// 6. 提交事务
    		transaction.commit();
    		// 7. 释放资源
    		session.close();
    	}
    }
    

    3 hibernate的常见配置

    3.1 XML的提示配置

    • 提前复制配置的连接http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd

    • 按照以下顺序配置

      本地约束配置顺序

    • 核心配置文件的提示配置方法类似

    3.2 Hibernate的映射的配置

    <?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>
    	<!-- 建立类和表的映射 -->
    	<class name="com.itzhouq.hibernate.demo1.Customer" table="cst_customer">
    		<!-- 建立类中的属性与表中的主键对应 -->
    		<id name="cust_id" column="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_phone" column="cust_phone"></property>
    		<property name="cust_mobile" column="cust_mobile"></property>
    	</class>
    	
    </hibernate-mapping>
    
    • class标签的配置
      • 标签用来建立类与表的映射关系
      • 属性:
        • name-----------类的全路径名
        • table-----------表名(类名与表名一致时,table可以省略)
        • catalog--------数据库名
    • id标签的配置
      • 标签用来建立类中的属性与表中的主键的对应关系
      • 属性:
        • name-----------类中的属性名
        • column---------表中的字段名(类中的属性和表中的字段名一致时,可以省略)
        • length-----------长度
        • type-------------类型
    • property标签的配置
      • 标签用来建立类中的普通属性与表的字段的对应关系
      • 属性:
        • name-----------类中的属性名
        • column---------表中的字段名
        • length-----------长度
        • type-------------类型
        • not-null--------设置非空
        • unique---------设置唯一

    3.3 Hibernate的核心配置方式

    • 必须的配置------------连接数据库的基本的参数
      • 驱动类
      • url路径
      • 用户名
      • 密码
    • 可选的配置
      • 显示SQL-----------hibernate.show_sql
      • 格式化SQL--------hibernate.format_sql
      • 自动建表-----------hibernate.hbm2ddl.auto
        • update如果数据库中有表,使用原有表,如果没有表,创建新表(更新表结构)
        • validate如果没有表,不会创建表。只会使用数据库中原有的表。(校验映射和表结构)。
        • none:不使用hibernate的自动建表
        • create:如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表。(测试)
        • create-drop:如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表。(测试)
    • 映射文件的引入
      • 引入映射文件的位置

    4. Hibernate的核心API

    4.1 Configuration:Hibernate的配置对象

    • 作用:

      • 加载核心配置文件

        // 1. 加载hibernate的核心配置文件
        		Configuration configure = new Configuration().configure();
        
      • 加载映射文件

        <!-- 配置映射文件 -->
        		<mapping resource="com/itzhouq/hibernate/demo1/Customer.hbm.xml"/>
        
    • Configuration类的作用是对Hibernate进行配置,以及对它进行启动。在hibernate的启动过程中,Configuration类的实例首先定位映射文件的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration类在整个Hibernate项目中只扮演一个很小的角色,但是他是启动Hibernate时所遇到的第一个对象。

    4.2 SessionFactory:Session工厂

    • SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。徐娅注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目只需要一个SessionFactory就够,当需要操作多个数据库时,可以未每个数据库指定一个SessionFactory。

    • SessionFactory内部维护了Hibernate的连接池和Hibernate的二级缓存(不讲)。是线程安全的对象。一个项目创建一个对象即可。

    • 配置连接池,提取工具类

      • 导入c3p0的jar包..hibernate-release-5.0.7.Finalhibernate-release-5.0.7.Finalliboptionalc3p0
        • c3p0-0.9.2.1.jar
        • hibernate-c3p0-5.0.7.Final.jar
        • mchange-commons-java-0.2.3.4.jar
      • 在主配置文件中,添加以下配置
      <!-- 配置C3P0连接池 -->
      		<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
      		<!--在连接池中可用的数据库连接的最少数目 -->
      		<property name="c3p0.min_size">5</property>
      		<!--在连接池中所有数据库连接的最大数目  -->
      		<property name="c3p0.max_size">20</property>
      		<!--设定数据库连接的过期时间,以秒为单位,
      		如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
      		<property name="c3p0.timeout">120</property>
      		 <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
      		<property name="c3p0.idle_test_period">3000</property>
      
      • 新建一个包,创建一个工具类HibernateUtils.java

        package com.itzhouq.hibernate.utils;
        
        import org.hibernate.Session;
        import org.hibernate.SessionFactory;
        import org.hibernate.cfg.Configuration;
        
        /*
         * Hibernate的工具类
         */
        public class HibernateUtils {
        	public static final Configuration cfg;
        	public static final SessionFactory sf;
        	
        	static {
        		cfg = new Configuration().configure();
        		sf = cfg.buildSessionFactory();
        	}
        	
        	public static Session openSession() {
        		return sf.openSession();
        	}
        }
        
      • 配置之后测试类的代码大大简化了

        package com.itzhouq.hibernate.demo1;
        /*
         * Hibernate工具类的测试
         */
        
        import org.hibernate.Session;
        import org.hibernate.Transaction;
        import org.junit.Test;
        
        import com.itzhouq.hibernate.utils.HibernateUtils;
        
        public class HibernateDemo2 {
        	
        	@Test
        	//保存客户
        	public void demo1() {
        		Session session = HibernateUtils.openSession();
        		Transaction tx = session.beginTransaction();
        		
        		Customer customer = new Customer();
        		customer.setCust_name("王晓东");
        		Serializable id = session.save(customer);
        		System.out.println("id = " + id);//1
        		tx.commit();
        		session.close();
        	}
        }
        

    4.3 Session:类似Connection对象是连接对象

    • session接口负责执行呗持久化对象的CRUD操作。但需要注意的是session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里的session类似于Connection。

    • Session中的API

      • 保存方法:

        • Serializable save(Object obj);

          @Test
          	//保存客户
          	public void demo1() {
          		Session session = HibernateUtils.openSession();
          		Transaction tx = session.beginTransaction();
          		
          		Customer customer = new Customer();
          		customer.setCust_name("王晓东");
          		Serializable id = session.save(customer);
          		System.out.println("id = " + id);//1
          		
          		tx.commit();
          		session.close();
          	}
          
      • 查询方法

        • T get(Class c, Serializable id)

        • T load(Class c, Serializable id)

          @Test
          	//查询方法
          	public void demo2() {
          		Session session = HibernateUtils.openSession();
          		Transaction tx = session.beginTransaction();
          		
          //		Customer customer = session.get(Customer.class, 1L);
          //		System.out.println(customer);
          		
          		Customer customer = session.load(Customer.class, 1L);
          		System.out.println(customer);
          		
          		tx.commit();
          		session.close();
          	}
          
        • get方法和load方法的区别

        • get:

          1. 采用的是立即加载,执行到这行代码的时候,就马上发送sql语句去查询。
          2. 查询后返回的是一个真实对象本身。
          3. 查询一个找不到的对象的时候,返回null;
        • load:

          1. 采用的延迟加载(lazy懒加载),执行到这行代码的时候,不会立即发送SQL语句,当真正使用这个对象的时候才会发送sql语句。
          2. 擦汗寻后返回的代理对象,利用javassist技术产生的代理。
          3. 查询一个找不到的对象的时候,抛出异常。
      • 修改方法

        • void update(Object obj)

      • 删除方法

        • void delete(Object obj)

      • 查询所有

    4.4 Transaction:事务对象

    • Hibernate中管理事务的对象
      • commit()
      • rollback()
  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/itzhouq/p/hibernate01.html
Copyright © 2020-2023  润新知