Hibernate第一阶段

Hibernate

1.Hibernate的学习路线

2.Hibernate的概述

框架:就是一个=软件的半成品,完成部分功能

2.1什么是Hibernate

是持久层的ORM框架

2.2什么是ORM

Hibernate是一个优秀的ORM实现框架

ORM(Object-Relational Mapping):对象关系映射

  • 开发语言是java是面向对象
  • 数据库是Mysql 是关系型数据库
    让java跟数据库中的表之间产生关系,直接操作对象就可以操作数据库

传统方式的不足

  • 表中的字段获得类中的属性发生变化,DAO中的代码都要跟着发生变化(修改程序源代码)

2.3为什莫学习Hibernate:

3.Hibernate的入门

3.1下载Hibernate的开发包

解压之后:

  • documentation:Hibernate的开发文档跟规范,还有一些测试的项目
  • lib:Hibernate的开发包,required是必须的,别的是可选的
  • product:一些相关的项目的源代码模板

3.2创建项目,引入jar包,日志文件

引入required必须包,还有他要用到的数据库驱动包connection
还需要log4j的jar包

  • slf4j 简单日志门面,是一个接口,log4j是整合日志的一个规范

可以把日志文件的配置文件引入log4j.properties
打开配置文件,可以在最后边更改,从而设置日志信息打印在哪,默认是在控制台,可以加一个file打印在文件中,路径上面可以更改。

3.3创建表跟实体类

3.4创建映射文件(ORM框架)

  • 映射文件通常是一个XML文件,而且这个文件是可以任意命名。通常情况下名称:类名.hbm.xml
    创建约束:Hibernate 的核心包core下第一个后边位置,找到3.0 mapping的约束里面的
    1
    2
    3
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

,copy过去

  • 建立类和表的映射
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <hibernate-mapping>
       <class name="实体类路劲" table="表名">
           <id name="实体主键属性名" column="表主键名">
               <generator class="native"/>
           </id>
           //普通属性与表中字段建立映射
           <property name="实体名" column="属性名" /> //两个名字是一样的
           <property name="" column="" />
           <property name="" column="" />
            。。。
       </class>
    </hibernate-mapping>

3.5创建核心配置文件连接哪个数据库

  • src下创建一个固定名称的xml hibernate.cfg.xml
    创建约束:project下etc下的hibernate.cfg.xml里面的约束copy过去,或者找
    Hibernate 的核心包core下第一个后边位置,找到3.0 configuration的约束dtd里面的约束
    两个是一样的
  • 参数:
    project下etc下的hibernate.properties是模板,找到参数写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <hibernate-configuration>
       <session-factory>
          //连接数据库的基本参数
          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
          <property name="hibernate.connection.url">jdbc:mysql///表名</property>
          <property name="hibernate.connection.username">root</property>
          <property name="hibernate.connection.password">123</property>
          
         // 配置hibernate的属性:
         //hibernate的方言:(也是在上面那个文件中找,mysql是这莫写)
         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
         //可以配置一些其他的属性
         //打印出sql语句
          <property name="hibernate.show_sql">true</property>
         //格式化一下
          <property name="hibernate.format_sql">true</property>
          
         //hbm2ddl.auto:对应数据库的ddl操作:create,create-drop,update,validate
         <property name="hibernate.hbm2ddl.auto">update</property>
         
          //加载映射文件
          <mapping resource="com/itheima/domain/...xml(**映射文件的路劲**中间是/并且以src下面的第一个包开头前面不加/)" />
       </session-factory>
    </hibernate-configuration>

3.6使用Hibernate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//加载配置文件
Configuration con=new Configuration().configure();
//创建一个SessionFactory:类似连接池
SessionFactory sess=con.buildSessionFactory();
//创建一个Session:相当于Connection
Session session=sess.openSession();
//开启事务:
Transaction tran=session.beginTransaction();
//操作:
Customer customer=new Customer();
customer.setCust_name("要田间的属性名");
//提交事务:
transaction.commit();
//释放资源:
session.close();

4.Hibernate 常见的配置

4.1配置文件的配置

映射文件:将对象与表建立映射关系。类名.hbm.xml

配置没有网的时候,编写配置文件的提示信息:

先复制,约束下边的路劲
在window属性中找到
xml catalog点 add 在找本地的dtd约束,引入,改为url,粘贴刚才复制的。

4.1.1class标签:建立类与表的映射

  • name:实体类的全路劲
  • table:数据库的表名(如果类名与表明相同,则table可以省略)
  • catalog:写数据库名(可以不写)

4.1.2id标签: 用来表中的主键与类中属性建立映射

  • name :类中的属性名
  • column:表中的字段名(如果属性名跟字段名一致则可以省略)
  • type (从这个以下可以省略):数据的类型(hibernate类型,java类型,数据库类型)

也可以这么写:

4.1.3property标签:表中的字段与类中的属性的映射

跟id大同小异

  • length :代表表中的长度(因为hibernate可以帮助你建表,默认设置为255

4.2核心配置文件

不能联网的时候配置一下,就可以提醒了

如果没有写在src底下,在加载的时候记得传一个路劲过去。

4.2.1分类

  • hibernate.properties
    • 格式:key=value键值对的形式,但是不能加载映射文件。(手动写)
    • 加载:Configuration con=new Configuration();
  • hibernate.cfg.xml
    • 格式:格式化的格式
    • 加载:Configuration con=new Configuration().configure();

4.2.2内容

  • 配置基本配置参数

  • 其他参数

  • 加载映射文件
    <mapping resource="com/itheima.domain/...xml" />

hbm2ddl.auto参数(hibernate mapping to ddl):对应数据库的ddl操作:(一般会使用update,validata,别的一般用作测试)

  • create: 如果数据库有表,先删掉,重新创建一个新的表
  • create-drop:如果数据库有表,先删掉,重新创建,使用完毕,会删除该表(没有表也会创建使用完再删除)
  • update:如果有表使用原来的表,没有则创建新表,并且可以更新,插入的时候没有字段创建一个新的字段
  • validate:如果没表则报错,有表使用原来的表,并对表进行校验(实体对象的属性跟表的字段不一样时会报错)

5.Hibernate的常用API

5.1Configuration:配置对象

5.1.2加载核心配置文件

因为核心配置文件有两种书写方式。

  • hibernate.properties
    • 格式:key=value键值对的形式,但是不能加载映射文件。(手动写)
    • 加载:Configuration con=new Configuration();
  • hibernate.cfg.xml
    • 格式:格式化的格式
    • 加载:Configuration con=new Configuration().configure();

5.1.3 加载映射配置文件

如果不用配置文件来加载映射文件可以
手动加载映射文件:(两种方法)
Configuration.addResource(路劲...);
//这种方法有一个条件,就是实体类跟配置文件在同一个包中
Configuration.addClass(实体类名.class);

5.2 SessionFactory

SessionFactory 对象内部维护了连接池和二级缓存(不讲)。是一个线程安全重量级的对象,所以说一般情况下,一个项目只对应一个SessionFactory。
所以一般把他单独抽出来。

5.2.1抽取一个工厂的工具类

1
2
3
4
5
6
7
8
9
10
11
private static final Configuration cfg;
private static final SessionFactory sf;
static{
   cfg=new Configuration().config();
   sf=cfg.buildSessionFactory();
}
public static Session getSession(){
    return sf.openSession();
}

5.2.2配置连接池

Hibernate中自带了连接池,但是可以自己配置c3p0

  • 引入c3p0相关的jar包,包括hibernate跟其整合的包,
    在lib中option中的c3p0中

  • 配置核心配置文件:在session-factory中

1
2
3
4
5
6
7
8
9
10
11
<!-- 配置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>

5.3session(完成基本的CRUD的操作)

Session session=sessionFactory.openSession();

  • 相当于JDBC中的connection,生命周期是以事务的开始跟结束为界限

  • 不是线程安全的,所以最好定义成局部变量

  • 是数据库核心对象

5.3.1save


save方法中:

  • 先查询在,修改对象里面的东西,save跟update的效果是一样的
  • 新建一个对象,然后设置id跟其他的值后save,只要主键生成策略不是assigned,那么则不用手动设置id,设置了也没用

5.3.2查询get/load

  • get:
    • 查询一个:get(实体类的class,数据库id); //这里的id在实体里用的long型,所以加L
    • Customer customer=sess.get(Customer.class, 1l);
  • load

    • 查询一个:load(实体类的class,数据库id);
    • Customer customer=sess.load(Customer.class, 1l);

      重要

  • **get跟load的区别:**

    • 加载时间
      • get方法:当程序执行到这行的时候,马上发送一条sql语句,返回Customer的对象
      • load方法:当程序执行到这行的时候,没有马上发送sql语句(使用的是Hibernate中延迟加载的策略lazy,真正使用该对象的时候才会加载)(使用的时候才执行,不用根本不加载,只用id也不行,因为人家已经知道了)
    • 返回值
      • load返回的实体类的代理对象
      • get返回实体类本身
    • 查询找不到的对象
      • load抛出ObjectNotFoundException
      • get 返回一个null,或报空指针

5.3.3 update修改

  1. 先创建对象在修改

  2. 先查询在修改

5.3.4 delete删除

  1. 直接创建对象 然后删除
  2. 先查询在删除(推荐,为以后的级联删除方便)

5.3.5 saveOrUpdate 保存或更新

没有id即保存,有id即更新

5.3.6 查询全部

HQL:Hibernate Query Language
Query query=session.createQuery("from Customer"); List<Customer> lists=query.list();

5.4 Transaction 事务操作

beginTranscction(); //开启事务
commit(); //提交事务

  • 注:hibernate5中有一个特性,就是会自动提交,前提是必须使用内置的连接池,但是为了低版本跟防止多事务提交出现错误,一般都要手动提交
张冲 wechat
欢迎扫一扫上面的微信关注我,一起交流!
坚持原创技术分享,您的支持将鼓励我继续创,点击打赏!