Hibernate4---尚硅谷学习笔记

认识Hibernate

Hibernate是一个java领域的框架,对JDBC的操作进行封装.
如果使用原生的JDBC操作需要进行以下几步骤

  1. 针对不同数据库厂商使用Connection类进行数据库的链接,实例化vo类对象
  2. 使用PreparedStatement操作接口编写SQL语句
  3. 执行PreparedStatement的sql语句

如果是使用Hibernate进行操作,以上的步骤框架都已经封装好了,只需要调用Hibernate中的Session类的方法即可

在这里插入图片描述

  • Hibernate是一个ORM框架
    在这里插入图片描述

  • 使用IDEA创建Hibernate项目

  1. 创建一个空的项目
  2. 创建一个Hibernate模块,选择web Application 和Hibernate,本次选择Hibernate4.0作为开发
  3. 将所需的开发包复制到lib目录下(包括连接数据库的加载驱动程序包)
    在这里插入图片描述

Hibernate的HelloWorld程序

  • 本次使用mysql5.0版本的数据库,创建一个名称为:"hibernatedb"的数据库
create database hibernatedb;
  1. 配置hibernate.cfg.xml文件
  • 将hibernate.cfg.xml文件创建到src目录下

Hibernate 从其配置文件中读取和数据库连接的有关信息, 这个文件应该位于应用的 classpath 下.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

<session-factory>
    <!--配置数据库基本信息-->
    <property name="connection.username">root</property>
    <property name="connection.password">mysqladmin</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost/hibernatedb</property>

    <!--配置hibernate基本信息-->
    <!--配置链接的数据库类型-->
    <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    <!--是否打印sql语句-->
    <property name="show_sql">true</property>
    <!--是否对sql语句进行格式化-->
    <property name="format_sql">true</property>
    <!--指定自动生成数据表-->
    <property name="hbm2ddl.auto">update</property>

    <!--映射持续化类-->
    <mapping resource="mao/shu/vo/News.hbm.xml"/>
</session-factory>
</hibernate-configuration>


  1. 创建持久化类(也就是普通的javaBean类)

Hibernate 不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因

package mao.shu.vo;

import java.io.Serializable;
import java.sql.Date;

public class News implements Serializable {
    private Integer id;
    private String title;
    private String info;
    private Date pubDate;
    private Double price;

    public News(){};

    public News(Integer id, String title, String info, Date pubDate, Double price) {
        this.id = id;
        this.title = title;
        this.info = info;
        this.pubDate = pubDate;
        this.price = price;
    }
	
	//...
	//getter和setter方法
	//toString()方法
	//...
}
  • 创建对象-关系映射文件,表示映射到数据库中的数据表

Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射. 在运行时 Hibernate 将根据这个映射文件来生成各种 SQL 语句
映射文件的扩展名为 .hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--设置java类和数据表的映射关系-->
<hibernate-mapping package="mao.shu.vo">
    <!--对应的类名称-->
    <class name="News" table="News" dynamic-insert="true">
        <!--配置主键-->
        <id name="id" type="java.lang.Integer">
            <column name="ID"/><!--生成的数据列名称-->
            <generator class="native"/><!--使用数据库本地的方式创建主键-->
        </id>

        <!--设置类中的属性和数据表对应的字段的映射-->
        <property name="title" not-null="true" index="news_index" length="200" type="java.lang.String" column="TITLE">
        </property>
        <property name="info" not-null="true" type="text" column="INFO">
        </property>
        <property name="pubDate" not-null="true"  type="java.sql.Date" column="PUBDATE">
        </property>
        <property name="price" not-null="true"  type="java.lang.Double" column="PRICE">
        </property>
    </class>
</hibernate-mapping>
  1. 将hbm.xml文件配置到hibernate.cfg.xml文件之中
  <!--映射持续化类-->
  <mapping resource="mao/shu/vo/News.hbm.xml"/>
  1. 建立一个junit测试类
package mao.shu.vo;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Before;
import org.junit.Test;



public class NewsTest {
    //加载hibernate配置文件
    private Configuration configuration;
    //使用ServiceRegistry 类创建SessionFactory类对象
    private ServiceRegistry serviceRegistry;
    //Session工厂类,用于创建Session类对象
    private SessionFactory sessionFactory;

    //Session用于操作JDBC相当于java中的Connection
    private Session session;
    //事物控制,控制例如数据会滚,数据提交,等等
    private Transaction transaction;


    @Before
    public void init(){
        //加载的hibernate默认配置名称就是"hibernate.cfg.xml"
        this.configuration = new Configuration().configure();

        //4.0之前使用这样的方式创建SessionFactory ,但是4,0之后这个方法就废除了,不推荐使用该方法
        //this.sessionFactory = this.configuration.buildSessionFactory()

        this.serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
        this.sessionFactory = this.configuration.buildSessionFactory(this.serviceRegistry);

        this.session = this.sessionFactory.openSession();
        this.transaction = this.session.beginTransaction();
    }

    @Test
    public void add(){
        News vo = new News(1,"测试1","测试数据1",new java.sql.Date(new java.util.Date().getTime()),50.5);
        this.session.save(vo);//保存数据
        this.transaction.commit();//提交事务
    }
}

在这里插入图片描述

  • 后台测试输出的sql语句

在这里插入图片描述

  • 添加的数据库表中的数据

在这里插入图片描述

核心接口讲解

  1. 持续化java类:News.java
  • 提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类
  • 提供一个标识属性(identifier property): 通常映射为数据库表的主键字段. 如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()
  • 为类的持久化类字段声明访问方法(get/set): Hibernate对JavaBeans 风格的属性实行持久化。
  • 使用非 final 类: 在运行时生成代理是 Hibernate 的一个重要的功能. 如果持久化类没有实现任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 类, 则无法生成 CGLIB 代理.
  • 重写 eqauls 和 hashCode 方法: 如果需要把持久化类的实例放到 Set 中(当需要进行关联映射时), 则应该重写这两个方法
  • 对象关系映射表

Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射. 在运行时 Hibernate 将根据这个映射文件来生成各种 SQL 语句
映射文件的扩展名为 .hbm.xml
在这里插入图片描述

  • Hibernate 配置文件

Hibernate 从其配置文件中读取和数据库连接的有关信息, 这个文件应该位于应用的 classpath 下.
在这里插入图片描述
标签<mapping resource=“xxx”> 中的resource属性的值是对象关系映射文件的所在目录.

  • Hibernate 核心API
  1. Configuration 类

Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:

  • Hibernate 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。
  • 持久化类与数据表的映射关系(*.hbm.xml 文件)
  • 创建 Configuration 的两种方式
  1. 属性文件(hibernate.properties):
    - Configuration cfg = new Configuration();
  2. Xml文件(hibernate.cfg.xml)
    - Configuration cfg = new Configuration().configure();
  • Configuration 的 configure 方法还支持带参数的访问:
    - File file = new File(“simpleit.xml”);
    - Configuration cfg = new Configuration().configure(file);
  • 推荐使用XML文件的方式创建
  • SessionFactory 接口
  • 针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。
  • SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息
  • SessionFactory是生成Session的工厂
  • 构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个
  • SessionFactory 对象。
  • Hibernate4 新增了一个 ServiceRegistry 接口,所有基于 Hibernate 的配置或者服务都必须统一向这个 ServiceRegistry 注册后才能生效
  • Hibernate4 中创建 SessionFactory 的步骤

Configuration类中的configure()方法默认加载的配置文件为"/hibernate.cfg.xml",所以如果"hibernate.cfg.xml"文件的位置默认就在src/的根目录下,调用configure()方法时不传入参数也可以加载到配置文件
在这里插入图片描述

  • Session 接口
  • Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection。
  • 持久化类与 Session 关联起来后就具有了持久化的能力。
  • Session 类的方法:
  • 取得持久化对象的方法:
    • get() load()
  • 持久化对象都得保存,更新和删除:
    • save(),update(),saveOrUpdate(),delete()
  • 开启事务:
    • beginTransaction().
  • 管理 Session 的方法:
    • isOpen(),flush(), clear(), evict(), close()等
  • Transaction(事务)
  • 代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
    Transaction tx = session.beginTransaction();
  • 常用方法:
    • commit():提交相关联的session实例
    • rollback():撤销事务操作
    • wasCommitted():检查事务是否提交
  • Hibernate 配置文件的两个配置项
  • hbm2ddl.auto:该属性可帮助程序员实现正向工程, 即由 java 代码生成数据库脚本, 进而生成具体的表结构. 。取值 create | update | create-drop | validate
  1. create : 会根据 .hbm.xml 文件来生成数据表, 但是每次运行都会删除上一次的表 ,重新生成表, 哪怕二次没有任何改变
  2. create-drop : 会根据 .hbm.xml 文件生成表,但是SessionFactory一关闭, 表就自动删除
  3. update : 最常用的属性值,也会根据 .hbm.xml 文件生成表, 但若 .hbm.xml 文件和数据库中对应的数据表的表结构不同, Hiberante 将更新数据表结构,但不会删除已有的行和列
  4. validate : 会和数据库中的表进行比较, 若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常
  • format_sql:是否将 SQL 转化为格式良好的 SQL . 取值 true | false
  • 通常情况下hbm2ddl.auto的属性值都是用update
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值