重拾Hibernate框架——入门

目录

Hibernate入门

第一个Hibernate程序

第一步 搭建Hibernate环境
(1)创建一个Java(或Java Web)工程项目;
(2)导入Hibernate的jar包;
注:除此之外,在使用Hibernate的时候,有日志信息的输出,而Hibernate本身没有包含日志输出的jar包,需要我们额外导入其他日志相关的jar(log4j、slf4j-api、slf4j-log4j12);同时还需要mysql驱动的jar包。(这里图省事还木有导入日志相关的包)

Hibernate框架相关jar包

第二步 创建实体类
注:使用Hibernate的时候,不需要我们自己手动创建表,Hibernate会帮把表创建出来。
如:User.java

package com.wm103.entity;

public class User {
    /*Hibernate要求实体类有一个属性是唯一的。*/
    private int uid;
    private String username;
    private String password;
    private String address;

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

第三步 配置实体类合数据库表一一对应的关系(映射关系)
使用配置文件实现映射关系
(1)创建xml格式的配置文件
- 映射配置文件名称和位置没有固定要求;
- 建议在实体类所在包内创建,名称为:实体类名称.hbm.xml
(2)在配置文件中引入xml约束
- 在Hibernate中引入的约束是dtd约束(约束有dtd和schema格式)

<?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 表示该xml的根标签。
(3)配置映射关系
如: 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">
<hibernate-mapping>

    <!--
        1. 配置类和表对应
        class标签
            name属性:实体类全路径
            table属性:数据库中对应表的名称
    -->
    <class name="com.wm103.entity.User" table="t_user">
        <!--
            2. 配置实体类id和表id对应
            Hibernate要求实体类有一个属性唯一值;
            Hibernate要求表有字段作为唯一值。
        -->
        <!--
            id标签
                name属性:实体类中作为唯一标识的属性的名称
                column属性:生成的表字段名称
        -->
        <id name="uid" column="uid">
            <!--
                设置数据库表中ID的增长策略
                native:生成表的id是主键自动增长的。
            -->
            <generator class="native"/>
        </id>
        <!--
            3. 配置实体类中的其他属性与表字段对应
            property标签
                name属性:实体类属性名称
                column属性:生成表字段名称
        -->
        <property name="username" column="username"></property>
        <property name="password" column="password"></property>
        <property name="address" column="address"></property>
    </class>
</hibernate-mapping>

第四步 创建Hibernate的核心配置文件
(1)在src目录下创建Hibernate核心配置文件 hibernate.cfg.xml
  核心配置文件的格式为xml,且文件名称和位置是固定的。
- 位置:必须在src目录下面
- 名称:必须为hibernate.cfg.xml
(2)为配置文件引入dtd文件

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

  其中 hibernate-configuration 表示该xml的根标签。
注:Hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载,需要在核心配置文件中进行设置。
(3)配置hibernate.cfg.xml中的信息

  • 配置数据库信息
<!-- **配置数据库信息(必须)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&amp;characterEncoding=UTF-8</property>
  • 配置hibernate信息
<!-- **配置hibernate信息(可选)** -->
<!--
    配置数据库方言,如:
    在MySQL中实现分页功能,需要使用到关键字limit,该关键字只能在MySQL中使用;
    在Oracle数据库中则使用rownum实现分页功能。
    以下配置是让Hibernate框架识别不同数据库各自特有的语句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 输出底层SQL语句 -->
<property name="format_sql">true</property><!-- 格式化底层SQL语句 -->
<!--
    Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
        update:如果已存在表,则更新表,如果没有,则进行创建。
 -->
<property name="hbm2ddl.auto">update</property>
  • 把映射文件放到核心配置文件中
<!-- **把映射文件放到核心配置文件中(必须)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>

如: hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- **配置数据库信息(必须)** -->
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&amp;characterEncoding=UTF-8</property>

        <!-- **配置hibernate信息(可选)** -->
        <!--
            配置数据库方言,如:
            在MySQL中实现分页功能,需要使用到关键字limit,该关键字只能在MySQL中使用;
            在Oracle数据库中则使用rownum实现分页功能。
            以下配置是让Hibernate框架识别不同数据库各自特有的语句。
        -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property><!-- 输出底层SQL语句 -->
        <property name="format_sql">true</property><!-- 格式化底层SQL语句 -->
        <!--
            Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
                update:如果已存在表,则更新表,如果没有,则进行创建。
         -->
        <property name="hbm2ddl.auto">update</property>

        <!-- **把映射文件放到核心配置文件中(必须)** -->
        <mapping resource="com/wm103/entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

实现数据库操作

第一步 加载Hibernate核心配置文件

第二步 创建SessionFactory对象

第三步 使用SessionFactory对象创建session对象

第四步 开启事务

第五步 编写具体逻辑CRUD操作

第六步 提交事务

第七步 关闭资源

如: HibernateDemo.java

package com.wm103.hibernatetest;

import com.wm103.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

/**
 * Created by DreamBoy on 2017/5/19.
 */
public class HibernateDemo {

    @Test
    public void testAdd() {
        // **第一步** 加载Hibernate核心配置文件
        //            自动到src下面寻找hibernate.cfg.xml配置进行加载,封装成对象
        Configuration cfg = new Configuration();
        cfg.configure();

        // **第二步** 创建SessionFactory对象
        //            读取hibernate核心配置文件内容,创建sessionFactory
        //            在这个过程中,会根据配置好的映射关系,在对应的数据库中将表创建出来
        SessionFactory sessionFactory = cfg.buildSessionFactory();

        // **第三步** 使用SessionFactory对象创建session对象
        //            类似JDBC中的Connection对象
        Session session = sessionFactory.openSession();

        // **第四步** 开启事务
        Transaction tx = session.beginTransaction();

        // **第五步** 编写具体逻辑CRUD操作
        User user = new User();
        user.setUsername("梦小白");
        user.setPassword("123");
        user.setAddress("China");
        session.save(user);

        // **第六步** 提交事务
        tx.commit();

        // **第七步** 关闭资源
        session.close();
        sessionFactory.close();
    }
}

Hibernate配置文件详解

Hibernate映射配置文件

  1. 映射匹配文件的名称和位置没有固定的要求,但是一般将该配置文件放置同需要映射的实体类相同的包下;
  2. 映射配置文件中标签的name属性,属性值与实体类相关,其中:
    (1)class标签的name属性值为实体类的全路径;
    (2)id标签和property标签的name属性值为实体类某个属性的名称。
  3. id标签和property标签,column属性可以省略,不设置,这个时候,column属性的默认值与name属性值相同
  4. property标签还有另外一个属性type属性,设置生成表字段的类型。不设置该属性时,Hibernate会根据实体类属性的类型自动确定表字段的类型。

Hibernate核心配置文件

核心配置文件名称和位置是固定的,名称为hibernate.cfg.xml,位置在src目录下。
配置内容以及要求如下:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- **配置数据库信息(必须)** -->
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&amp;characterEncoding=UTF-8</property>

        <!-- **配置hibernate信息(可选)** -->
        <!--
            配置数据库方言,如:
            在MySQL中实现分页功能,需要使用到关键字limit,该关键字只能在MySQL中使用;
            在Oracle数据库中则使用rownum实现分页功能。
            以下配置是让Hibernate框架识别不同数据库各自特有的语句。
        -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property><!-- 输出底层SQL语句 -->
        <property name="format_sql">true</property><!-- 格式化底层SQL语句 -->
        <!--
            Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
                update:
         -->
        <property name="hbm2ddl.auto">create</property>

        <!-- **把映射文件放到核心配置文件中(必须)** -->
        <mapping resource="com/wm103/entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Hibernate的核心API

Configuration

// **第一步** 加载Hibernate核心配置文件
//            自动到src下面寻找hibernate.cfg.xml配置进行加载,封装成对象
Configuration cfg = new Configuration();
cfg.configure();

SessionFactory(重点)

  SessionFactory是一个线程安全的Session工厂类,能为不同的线程生成不同的Session。SessionFactory维护着Session相关的资源,包括数据库连接池等、缓存数据等。
1. 通过使用configuration对象来创建SessionFactory对象,在创建过程中,如果核心配置文件配置了自动创建表的功能,如:

<!--
    Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
        update:
 -->
<property name="hbm2ddl.auto">create</property>

,则Hibernate会根据核心配置文件中的数据库和映射文件的配置,根据映射关系,在数据库中创建对应的表。
2. 创建sessionFactory对象过程中,非常耗资源(因为Hibernate需要检查实体类与数据库中表的映射情况,甚至需要创建或更新表)。因此**在Hibernate操作中,建议一个项目一般只创建一个sessionFactory对象。
实现方式如下:
静态代码快在类加载时执行,且执行一次。

package com.wm103.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Created by DreamBoy on 2017/5/19.
 */
public class HibernateUtil {
    // 单态模式的SessionFactory
    private static final SessionFactory sessionFactory;

    static {
        Configuration cfg = new Configuration();
        sessionFactory = cfg.buildSessionFactory();
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

使用:

SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

Session(重点)

  1. 这里的session对象类似于JDBC中的Connection对象;
  2. 调用session对象中的不同方法可以实现CRUD操作:
    (1)添加:save方法;
    (2)修改:update方法;
    (3)删除:delete方法;
    (4)查询:根据id查询的get方法;
  3. session对象
      Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。
      Session代表用户的一次操作。Session的生命周期很短,在操作开始时通过SessionFactory.openSession()生成,在操作结束时通过执行session.close()关闭。Session维护着Session相关的资源,包括Transaction、当前数据库连接等。
      Session是线程不安全的,多个并发线程同时操作一个Session实例时,就可能导致Session数据存取的混乱(方法内部定义和使用Session时,不会出现线程问题)。因此设计软件架构时,应避免多个线程共享一个Session实例。同时它也是轻量级的,实例的创建和销毁不需要消耗太多的资源。它还有一个缓存,即Hibernate的一级缓存,这个缓存主要用于存放当前工作单元加载的对象。

Transaction

  1. 开启事务
Transaction tx = session.beginTransaction();
  1. 事务的提交和回滚
tx.commit();

tx.rollback();
  1. 事务的特性
    • 原子性
    • 一致性
    • 隔离性
    • 持久性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值