Day38-Hibernate01

SSH框架的介绍

什么是框架
* 框架是软件的半成品,其完成大部分的通用功能,我们程序员只需要实现自己的业务即可。(提高开发效率),学习框架就是学习api和配置文件

了解web开发中,mvc模型组成:
M:model层,javaBean+jdbc
V:view层,jsp
C:control层,servlet

SSH框架

* * SSH = Struts2         + Spring + Hibernate
* * SSM = SpringMVC + Spring + Mybatis
  • 总结:

    • SSH3个框架,分别对应开发的web层,service层,dao层三层,从而形成一个整体(套装)。
    • ​SSH,比较老的。SSM,比较新的。
    • ​框架:都是降低运行效率,提高开发效率的(代码少)。硬件的成本越来越低,人力的成本,越来越高。

hibernate的概述

hibernate的定义
这里写图片描述
Hibernate可以应用在任何使用JDBC的场合,即可以在Java客户端程序使用,也可以在Servlet/jsp的web应用中使用。

* 
    * 是一个持久层的框架
    * 是一个ORM(Object Relational Mapping)框架
    * 对jdbc的封装(记忆)
    * 
        * 说明hibernate的底层是依赖于jdbc的。jdbc是java数据库与java世界沟通的桥梁

    * 用面向对象的思想,操作关系型数据库(理解)

(持久层:参与持久化操作的层,即dao层,推广到计算机就是把容易腐败的数据(内存的数据),长期保存的操作,就是存储到了硬盘、数据库、云盘,从而成为持久化)

ORM(重点) - 对象关系映射
Ojbect relational mapping,对象关系映射,java对象与关系型数据库的映射。映射:指的是对应关系。
这里写图片描述

hibernate常见版本介绍
3.x ,4.x, 5.x
版本4用的人很少,因为和以前的3.x的版本的API,不兼容


hibernate入门案例

聊聊入门案例的步骤
a. 建表
b. javabean编写
c. 导入包
d. 页面
e. 编写映射文件
f. 使用hibernate的API写代码

实现步骤:
1. 创建工程(java工程或者web工程)
* 使用java工程

  1. 导入hibernate的所需jar包 (10+1个)
    a. hibernate所需的:
    b. mysql的jdbc驱动

  2. 创建表

    • user表
  3. 创建javaBean

    • User类
  4. 创建映射文件
    a. 作用: 处理表与类的关系
    b. 位置:理论上任意,推荐:和对应的类放在同一个包下
    c. 名字:理论上任意,推荐:类名.hbm.xml –>User.hbm.xml
    d. 约束:hibernate-core-5.0.7.Final.jar\org.hibnerate\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">
这部分代码如何找!!!
工程下面:Referenced Libraries -- hibernate-core-5.1.8.final.jar -- (第一个)org.hibernate
     --(倒数4个)hibernate-mapping-3.0.dtd

6 创建核心配置文件(hiberante自身的配置文件)
a. 作用:配置hibernate本身
b. 位置:理论上任意,推荐:src下
c. 名字:理论上任意,推荐:hibernate.cfg.xml
d. 约束:hibernate-core-5.0.7.Final.jar\org.hibnerate\hibernate-configuration-3.0.dtd

<?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">

这部分代码如何找!!!
工程下面:Referenced Libraries – hibernate-core-5.1.8.final.jar – (第一个)org.hibernate
–(倒数4个)hibernate-configuration-3.0.dtd

7 hibernate的使用(7步曲)


    //1. 创建配置对象
    Configuration configuration = new Configuration();
    configuration.configure(); // 加载hibernate.cfg.xml

    //2. 创建SessionFactory对象
    SessionFactory  sf= configuration.buildSessionFactory();

    //3. 获取session
    Session session =sf.openSession();

    //4. 开启事务, transaction事务对象
    Transaction  transaction=  session.beginTransaction();

    //5. 实际的业务(模拟用户注册)
    User user = new User();
    user.setName("admin");
    user.setPassword("123");
    session.save(user);

    //6. 事务提交
    transaction.commit();

    //7. 释放资源
    session.close();
    sf.close();

细节
1. 如何导入约束文件:见《eclipse导入约束的操作.docx》

  1. 记住要配置主键生成策略:
<generator class="native"></generator>

3.建表的时候,主键必须有auto_increment​.

4.类的全限定名称:”cn.itcast.domian.User” 不是”cn/itcast/domain/User.java”


hibernate配置文件样板:

1)映射配置文件
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>
      <!-- 建立类和数据表的映射关系 -->
      <class name="com.itheima.domain.User" table="USER">
           <!-- 建立类中属性与数据库表中主键的映射关系 -->
           <id name="uid" column="uid">
                 <!-- 主键生成策略  -->
                 <generator class="native"></generator>
           </id>
           <!-- 建立类中普通属性与数据库表中字段的映射关系 -->
           <property name="username" column="username"></property>
           <property name="password" column="password"></property>
      </class>

</hibernate-mapping>

2)hibernate核心配置文件

<?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>
           <!--1. 连接数据库的参数 -->
           <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
           <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day38_hibernate</property>
           <property name="hibernate.connection.username">root</property>
           <property name="hibernate.connection.password">123456</property>

           <!--2. hiberntae自身的特色:方言 : 指定底层的数据库是那个-->
           <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

           <!--3. 加载映射文件 User.hbm.xml -->
           <mapping resource="com/itheima/domain/User.hbm.xml"/>
      </session-factory>

hibernate配置文件的介绍

配置文件1:映射配置文件 – (类名.hbm.xml)

class标签:表与javaBean的映射关系

name: javaBean的全路径名称
table:对应的表的表名(细节:如果名称与javaBean名称相同,可以省略,但不建议省略)
catalog: 指定表所在数据库的名字

id标签:完成主键字段的映射

name: 类中表示主键的属性的名称
column:表中主键的字段名称(细节:如果和name名称相同,可以省略)
type: 类型,java类型或者hibernate类型 (用于hiberante自动建表 )
         以int为例, java类型:java.lang.Integer  hibernate类型:integer
length:长度 (用于hiberante自动建表 )

property标签:完成普通字段的映射

    name: 类中表示普通字段的属性的名称
    column:表中普通字段的字段名称(细节:如果和name名称相同,可以省略)
    type: 类型,java类型或者hibernate类型(默认) (自动建表时使用 )
        java:java.lang.Integer  hibernate:integer
    length:长度(自动建表时使用 )
    not-null:非空约束 (自动建表时使用 )
    unique:唯一约束 (自动建表时使用 )

配置文件2:核心配置文件 (hibernate.cfg.xml)
1. 连接数据库的参数配置

<!--1. 连接数据库的参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day38_hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
  1. 自身的参数
    a. 必选:方言配置(重点关注)
<!--2. hiberntae自身的特色:方言 : 指定底层的数据库是那个-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
 * 指定底层的数据库。自动生成sql语句。
     * 优点:针对性的生成SQL,实现跨数据库特性。
         * 现在有个项目,从mysql数据库,迁移到oracle数据库。
      * 不同的数据库,sql语句存在差异。最明显的差异:分页语句不同。
         * mysql: select * from user limit 5,5;  6--10
         * oracle: select a.* from (select rownum as num, * from user where rownum <=10) a  where num >=5;
      * hibernate,利用sql语句,是自己生成的特性。你要实现分页,不用sql语句。你就调用一个方法:分页(5,5 );

b. 可选:(部分)
(1) 显示并格式化sql语句–sql依然存在,不过是hibernate自动生成。

          <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">true</property>   
  (2) hibernate自动建表
            <!-- 可选:是否自动建表
                none:默认值
                create:启动时,自动建表(测试)
                create-drop:启动时,自动建表,关闭时,自动销毁表(测试)
                update:没有表的时候,自动建表。有表,使用原来的表。如果表结构不匹配,更新表结构
                validate:不会自动建表。如果有表,检查表的结构,如果,不匹配,报错。
            <property name="hibernate.hbm2ddl.auto"></property>
  1. 加载映射文件(有多少个映射文件写多少行)
   <mapping resource="cn/itcast/domain/Customer.hbm.xml"/>

配置文件【总结】
1. 重点理解“方言”,其实现跨数据库的特性。例如:项目从mysql数据库,迁移到oracle数据库,代码无需修改,只需要修改方言配置即可。

  1. 自动建表:工作中,肯定配置为:none

hibernate4个核心对象的关系图

就是使用过程中七步曲中使用的核心对象
这里写图片描述

hibernate核心API:Configuration对象

  1. 用途:加载核心配置文件。

  2. API介绍
    (1) configure():–无参,默认加载src下hibernate.cfg.xml核心配置文件
    (2) configure(String resource): –加载自定义名字(非hibernate.cfg.xml)的核心配置文件
    (3) addResource(String resourceName):–加载的映射文件
    (4) SessionFactory buildSessionFactory():–用于创建SessionFactory对象

hibernate核心API:SessionFactory对象(最重要的知识点)
1. SessionFactory概述
(1) Session工厂对象,用于创建Session对象。
(2) sessionFactory对象,是线程安全的。
(3) 不是轻量级的,创建这个对象的成本很高。一个web项目只需要创建一个即可。
(4) 本质:对jdbc中数据库连接池的封装。类似于jdbc中的数据源(数据库连接池)
(5) 维护了hibernate二级缓存。(见明天内容)

2 API介绍
* openSession(): –获取session对象
* getCurrentSession():–获取与当前线程绑定的session.(明天讲解)

3 抽取工具类–不是轻量级的,一个项目只需要创建一个即可。(jdbc:连接池)
* 方法和思路(详解源码)—编程技能

4 整合c3p0流程(hiberante官方推荐连接池技术)
* hibnerate有一个内置的连接池,不过是玩具级别的。实际开发中,使用hibernate官方推荐的连接池技术c3p0。

  • a.补充–增加日志

    • 增加jar包:log4j日志文件夹下的 (3个jar包都需要)
    • 增加log4j的配置文件,直接扔到src目录下面即可
  • b.加载c3p0的jar

    • 加载3个jar.位置:必须资料\jar包整理\c3p0数据库连接池*.jar
  • c.增加c3p0的配置(写在核心配置文件中)
    <!--c3p0的配置-->
        <property  name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!--在连接池中可用的数据库连接的最少数目 -->
        <property name="c3p0.min_size">10</property>
        <!--在连接池中所有数据库连接的最大数目  -->
        <property name="c3p0.max_size">30</property>
        <!--设定数据库连接的过期时间,以秒为单位,
        如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
        <property name="c3p0.timeout">120</property>
         <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
        <property name="c3p0.idle_test_period">3000</property>

hibernate核心API:Session对象

  1. 概述
    a. 执行CRUD的主体(增删改查)
    b. hibernate与数据库交互的桥梁。(类似jdbc中Connection对象)
    c. 线程不安全的对象。

  2. API介绍
    a. Serializable save(Ojbect obj); –保存
    b. T get(Class class, Serializable id); –查询
    c. T load(Class class, Serializable id);–查询
    d. void update(Object obj);–修改
    * 推荐:先查询,后修改
    e. void delete(Object obj);–删除
    * 推荐:先查询,后删除,但是原因,后面讲级联操作的时候,才会体会

        User user = new User();
           user.setUsername("测试");
           user.setPassword("123");
           session.save(user);
           System.out.println("增加成功=======");
           User user2 = session.get(User.class, 3);
           System.out.println(user2);
           System.out.println("查找成功成功=======");
           user2.setUsername("测试2");
           session.update(user2);
           System.out.println("修改成功=======");
           session.delete(user2);
           System.out.println("删除成功=======");

4 API使用总结
a. 增删改查,4个操作
b. 4个方法,都依赖于主键(id)。
c. 更新和删除操作前,推荐先查询。其中删除操作,需要后面级联的时候,才会体现。
例如:

          User user = session.load(User.class, 2);
           user.setUsername("测试");
           session.update(user);

5 get和load的异同(面试题)
a. get方法:立即加载策略:执行get,立即发送SQL查询语句。
b. load方法:延迟加载(懒加载):执行load,不会发送sql语句;真正使用数据的时候,才发送sql查询语句。
c. 查询不到数据是,get方法的错误是:java.lang.NullPointerException
load方法的错误是:org.hibernate.ObjectNotFoundException

hibernate核心API:Transcation对象

  1. 概述

    • hibernate封装的处理事务的对象。
    • 通过session来创建Transcation对象,说明与session对象密切相关。
  2. API介绍
    a. Transcation transaction = session.beginTransaction(); // 事务对象的创建方式
    b. commit(): // 事务提交
    c. rollback(): // 事务回滚
    抽取Hibernate工具类:

public class HibernateUtils {

    private static SessionFactory sessionFactory;
    private static Configuration configuration;

    static {
        configuration = new Configuration();
        configuration.configure();

        sessionFactory = configuration.buildSessionFactory();
    }

    /**
     * @Title: HibernateUtils.java
     * @Description: TODO(获得session对象)
     * @return
     * @author jjizh
     * @date 2017年7月26日 下午8:07:59
     * @version V1.0
     */
    public static Session openSession(){
        return sessionFactory.openSession();
    }

}

下述抽取方法的问题:
问题:线程不安全,如果第一个线程进入之后,判定sf为空,就回去创建sessionFactory,此时如果又有一个线程进入的话,那么还是判定sf为空,就又回去创建一个sessionFactory,那么就无法做到只创建一个sessionFactory了
这里写图片描述


附加内容

类型对照表(部分): Hibernate映射类型和java类型的对照表

这里写图片描述

sql语句的分类

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库database、表table,列column等。关键字:创建create, 修改alter, 删除drop等(结构)
  • DML(Data Manipulation Language):数据操作语言,用来对数据库中表的记录进行更新。关键字:插入insert, 删除delete, 更新update等(数据)
  • DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录。关键字:select, from ,where等。
  • DCL(Data Control Language):数据控制语言,用来定义数据库的访问权限和安全级别及创建用户;关键字:grant等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值