Hibernate学习第一天:hibernate映射文件配置.hibernate入门

1.Hibernate框架的概述

1.1 框架的概述

1.2 什么是框架

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

1.3 EE的三层结构

1.4 hibernate的基本概述

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。

1.5 什么是ORM

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

1.6 为什么学习Hibernate

与其他操作数据库的技术相比,Hibernate具有以下几点优势:

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

  • Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO(Data Access Object,数据访问对象)层编码工作

  • Hibernate的性能非常好,映射的灵活性很出色。它 支持很多关系型数据库,从一对一到多对多的各种复杂关系。

  • 可扩展性强,由于源代码的开源以及API 的开放,当本身功能不够用时,可以自行编码进行扩展、

2.Hibernate入门

2.1下载Hibernate

http://https://sourceforge.net/projects/hibernate/

2.1.1 解压,目录结构

  • documentation:Hibernate开发的文档
    • lib:Hibernate开发包
    • required:Hibernate开发的必须的依赖包
  • optional:Hibernate开发的可选的jar包
  • project:Hibernate提供的项目

2.2 创建一个项目,引入jar包

  • 数据库驱动包
  • Hibernate开发的必须的jar包
    • 在hibernate解压目录下的lib/required目录下的所有jar包
  • 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创建实体类

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;
  • 创建Customer.java实体类
  • 生成set()和get()方法

2.5 创建映射

映射需要通过XML的配置文件来完成,这个配置文件可以任意命名。尽量统一命名规范(类名.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>
    <!-- 建立类与表的映射 -->
    <class name="com.hibernate.day01.Customer" table="cst_customer">
        <!-- 建立类中的属性与表中的主键对应 -->
        <id name="cust_uid" column="cust_uid">
            <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.cnf.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">root</property>
        <!-- 配置Hibernate的方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <mapping resource="com/hibernate/day01/Customer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

以上配置必须要有,如果要打印SQL语句,就加上以下配置即可。

<!-- 可选配置 -->
<!-- 打印SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="hibernate.formate_sql">true</property>

2.7 测试

public class HibernateDemo01 {
    @Test
    // 保存客户的案例
    public void demo1(){
        // 1.加载Hibernate的核心配置文件
        Configuration configuration = new Configuration().configure();
        // 2.创建一个SessionFactory对象:类似于JDBC中连接池
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        // 3.通过SessionFactory获取到Session对象:类似于JDBC中Connection
        Session session = sessionFactory.openSession();
        // 4.手动开启事务:
        Transaction transaction = session.beginTransaction();
        // 5.编写代码

        Customer customer = new Customer();
        customer.setCust_name("admin");

        session.save(customer);

        // 6.事务提交
        transaction.commit();
        // 7.资源释放
        session.close();
        sessionFactory.close();
    } 
}

3. Hibernate的配置

3.1 映射的配置

hibernate根据映射关系可以自动生成表。

  • 【class标签的配置】
    • 标签用来建立类与表的映射关系
    • 属性:
      • name:类的全路径
      • table:  表名(类名与表名一致时,table可以省略)
      • catalog:  数据库名,可不写
  • 【id标签的配置】
    • 标签用来建立类中的属性与表中的主键的对应关系
    • 属性:
      • name:类中的属性名
      • colums:表中的字段名(类中的属性名和表中的字段名一致时,column可以省略)
      • length:长度
      • type:类型
  • 【property标签的配置】
    • 标签用来建立类中的普通属性与表的字段的对应关系
    • 属性:
      • name:类中的属性
      • colums:表中的字段名
      • length:长度
      • type:类型
      • not-null: 非空约束
      • unique:  唯一约束

3.2 Hibernate的核心的配置

3.2.1 属性文件方式

  • hibernate.properties文件

    hibernate.connection.driver_class=com.mysql.jdbc.Driver
    hibernate.connection.url = jdbc:mysql:///hibernate_day01
    hibernate.connection.username=root
    hibernate.connection.password=root
    
  • 不能引入映射文件 (手动编写代码加载映射文件,比较少见)

3.2.2 方式二:xml文件方式(最常用)

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

4.Hibernate的核心API

4.1 Hibernate的API

4.1.1 Configuration:Hibernate的配置对象

Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。

  • 加载核心配置文件
    • hibernate.properties
      • Configuration cfg = new Configuration();
        • 手动加载映射:
          cfg.addResource("com/hibernate/day01/Customer.hbm.xml");

           

    • hibernate.cfg.xml (常用)
      • Configuration configuration = new Configuration().configure();

         

4.2 SessionFactory:Session工厂

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

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

  • 配置连接池
<!-- 在连接池中可用的数据库连接的最小数目 -->
<property name="hibernate.c3p0.max_size">2</property>
<!-- 在连接池中可用的数据库连接的最大数目 -->
<property name="hibernate.c3p0.min_size">2</property>
<!-- 设定数据库连接的过期时间,以秒为单位, 如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<!--没3000毫秒检查所有连接池中的空闲连接  -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>  
  • 抽取工具类

    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();
        }
    }      
    

4.3 Session:代表的是hibernate与数据库的连接对象。不是线程安全的。与数据库交互的桥梁。

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。

  • Session中的API:

    • 保存方法:

      • Serializable save(object obj)

        public void save() {
            Session session = HibernateUtils.openSession();
            Transaction transaction = session.beginTransaction();
            Customer customer = new Customer();
            customer.setCust_name("张三");
        
            session.save(customer);
        
            transaction.commit();
            session.close();
        }
        
    • 查询方法:

      • T get(Class c,Serializable id)
      • T load(Class c,Serializable id)
      • get方法和load方法的区别?

        public void getANDload() {
            Session session = HibernateUtils.openSession();
            Transaction transaction = session.beginTransaction();
        
            /**
             * get方法:
             *      采用的是立即加载,执行到这行代码的时候,就会马上发送SQL语句去查询
             *      查询后返回的是真是对象本身
             *      查询一个找不到的对象的时候,返回null
             * 
             * load方法:
             *      采用的是延迟加载,执行到这行代码的时候,不会发送SQL语句,当真正使用这个对像 的时候才会发送SQL语句
             *      查询后返回的是一个代理对象。javassist-3.24.0-GA.jar利用javassist技术产生的代理
             *      查询一个找不到的对象的时候,返回ObjectNotFoundException
             */
        
            //使用get方法查询
            //Customer customer = session.get(Customer.class, 1l);
            //System.out.println(customer);
        
            //使用load方法查新
            Customer customer = session.load(Customer.class, 2l);
            System.out.println(customer);
        
        
            transaction.commit();
            session.close();
        }
        
    • 修改方法

      • void update(Object obj)

         public void update() {
            Session session = HibernateUtils.openSession();
            Transaction transaction = session.beginTransaction();
        
            //直接创建对象,进行修改(不推荐)
            //Customer customer = new Customer();
            //customer.setCust_id(1l);
            //customer.setCust_name("mamat");
            //session.update(customer);
        
            //先查询,再修改(推荐)
            Customer customer = session.get(Customer.class, 1l);
            customer.setCust_name("萨马特");
            session.update(customer);
        
            transaction.commit();
            session.close();
        }
        
    • 删除方法

      • void delete(Object obj)

        public void delete() {
            Session session = HibernateUtils.openSession();
            Transaction transaction = session.beginTransaction();
        
            //直接创建对象,在删除
            //Customer customer = new Customer();
            //customer.setCust_id(1l);
            //session.delete(customer);
        
            //先查询,再删除-->级联删除
            Customer customer = session.get(Customer.class, 2l);
            session.delete(customer);       
        
            transaction.commit();
            session.close();
        }
        
    • 保存或更新

      • saveOrupdate(Object obj)

        public void test05() {
                Session session = HibernateUtils.openSession();
                Transaction transaction = session.beginTransaction();
        
                Customer customer = new Customer();
                //customer.setCust_name("老大");
                //session.saveOrUpdate(customer);
        
                customer.setCust_id(9l);
                customer.setCust_name("唠叨");
                session.saveOrUpdate(customer);
        
                transaction.commit();
                session.close();
            }
        

4.4 Transaction:事务对象

Hibernate中管理事务的对象。

  • Transaction的API:
    • commit():提交事务
    • rollback():回滚
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值