Hibernate第一阶段

Hibernate

1.Hibernate的学习路线

2.Hibernate的概述

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

2.1什么是Hibernate

是持久层的ORM框架

2.2什么是ORM

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

ORM(Object-Relational Mapping):对象关系映射
- 开发语言是java是面向对象
- 数据库是Mysql 是关系型数据库
让java跟数据库中的表之间产生关系,直接操作对象就可以操作数据库
01

传统方式的不足
- 表中的字段获得类中的属性发生变化,DAO中的代码都要跟着发生变化(修改程序源代码)

2.3为什莫学习Hibernate:

02

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的约束里面的
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

,copy过去

  • 建立类和表的映射
<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是模板,找到参数写

<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

//加载配置文件
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类型,数据库类型)

也可以这么写:
03

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:如果没表则报错,有表使用原来的表,并对表进行校验(实体对象的属性跟表的字段不一样时会报错)

04

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抽取一个工厂的工具类
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中

<!-- 配置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

05
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. 先查询在修改
      07

    5.3.4 delete删除
    1. 直接创建对象 然后删除
      这里写图片描述
    2. 先查询在删除(推荐,为以后的级联删除方便)
      这里写图片描述
    5.3.5 saveOrUpdate 保存或更新

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

    5.3.6 查询全部

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

    5.4 Transaction 事务操作

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

    • 注:hibernate5中有一个特性,就是会自动提交,前提是必须使用内置的连接池,但是为了低版本跟防止多事务提交出现错误,一般都要手动提交
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值