Hibernate第一,二小节

Hibernate5.2.11

框架概念:

框架(Framework)
1.框架封装了一些常用的功能,供开发者使用。不需要手动一步一步的实现。
2.框架可以看作是一个半成品的项目,开始者只需要知道如何调用即可,并不需要知道其中实现的原理过程。

特点:框架是可重用的设计。可以提高开发效率(非常适合于敏捷快速开发)

Hibernate官网:

https://hibernate.org/

Hibernate入门

1.1 什么是Hibernate?

1. Hibernate是一个开放源代码的ORM框架:Object Relational Mapping对象关系映射
     ORM:通过面向对象思想将java对象映射到数据库表中。而且通过操作java对象(访问set/get方法)来操作Hibernate数据库。不需要写任何的sql语句。
     示例:
    java对象-----------映射过程Hibernate完成-----------------数据库
    私有成员变量  -----------映射过程Hibernate完成------------ 表中的字段(列名)
    提供公共的set/get方法------映射过程Hibernate完成----------- 操作表中的字段(列名)
2.Hibernate封装老了jdbc的所有操作,可以应用到任何使用JDBC的场合,即可以在java客户端程序使用,也可以在web程序中的servlet/jsp中使用

1.2 Hibernate特点?

1.基于面向对象思想的,不需要写sql语句
2.高性能(延迟加载策略,抓取策略等。。。。)
3.scalability 可伸缩性
4.可靠性强(稳定性)
5.可拓展性
6.数据库平台移植性好。(通过配置可以使用不同的数据库平台)
7.hibernate开源免费,适合大中型系统

缺点:
   1.不是批量操作
   2.效率比jdbc略差。

1.3 下载hibernate的库

http://hibernate.org/orm/releases/5.2/

1.4 入门程序

1.4.1 准备工作:

Hibernate5.2及后续版本 使用JDK1.8以上包含1.8

Hibernate 5.1及后续版本 使用jdk1.6以上

1.4.2 入门程序
1.创建web project工程
2.添加jar包(11个):

​ hibenernate(10个:下载库的lib/required/xx) mysql驱动

3.写一个持久化Student类。

/* 持久化类(pojo类:一个简单的java对象   plain ordinary  java object  )
书写原则:
 * 1.必须有无参构造方法
 * 2.成员变量必须是private的
 * 3.属性方法(set/get)是public
 * 4.成员变量的类型尽量使用包装类型(包装类具有对象的属性和方法,可以方便的去操作基本类型)
 * 5.必须要有一个oid(Object  InDetitifer  唯一标识)与表的主键对应
 * 6.该类不能用final修饰(final修饰的变量不可改变,final修饰的方法不可重写, final修饰的类不可继承)
 * 
 备注: Hibernate中延迟加载的机制用到了动态代理模式,动态代理中的类很可能要被继承。
 */
4.元数据配置文件

持久化类的映射文件

备注: 文件名称: 持久化类名称.hbm.xml 和持久化类必须在同一个目录下

<?xml version="1.0" encoding="UTF-8"?>
<!-- 查找映射文件的xml约束规则:
     hibernate-core.xx.jar中查找:org.hibernate包hibernate-mapping-3.0.dtd-->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    
<!--hibernate映射的说明 -->
<hibernate-mapping>
<!-- class:告诉hibernate要映射的是那个类 
       name:指明具体的类, table:表示指定类要映射到数据库中的表名-->
 <class name="com.qf.domain.Student" table="stu">
   <!-- id表示主键,唯一标识,name是持久化类中的主键名,column:表中的主键名 -->
     <id name="stu_id" column="stu_id">
        <!-- 主键的生成策略 native根据数据库平台决定主键如何运行,mysql:主键肯定是唯一,不为空,自动增长 -->
            <generator class="native"></generator>
     </id>
     <!-- 普通的成员变量映射到数据库表中作为普通的列 -->
     <property name="stu_name" column="stu_name"></property>
     <property name="stu_birthday" column="stu_birthday"></property>
 </class>
</hibernate-mapping>     
5.主配置文件(hibernate.cfg.xml)

4(数据库连接信息)+1(数据库方言)+2(显示数据库)+1(数据库生成策略)+1(加载映射文件)

<?xml version="1.0" encoding="UTF-8"?>
<!-- 加载并启动初始化hibernate框架: 约束规则:
   hibernate-core.xx.jar/org.hibernate/hibernate-configuration-3.0.dtd -->
<!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>
    <!-- 以下配置的依据查找:下载的库project\etc\hibernate.properties中查找 -->
    <!-- 1. 配置连接数据库的信息:驱动,地址,用户名,密码 -->
        <property name="hibernate.connection.driver_class">
               com.mysql.jdbc.Driver
         </property>
        <property name="hibernate.connection.url">
              jdbc:mysql://localhost:3306/1715_hibernate01
         </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>

        <!--2. 配置数据库的方言 mysql5.0之后的方言  org.hibernate.dialect.MySQL5InnoDBDialect
           表示创建表的类型是:  engine=InnoDB -->
       <property name="hibernate.dialect">
         org.hibernate.dialect.MySQL5InnoDBDialect
      </property>

         <!--3.配置在后台显示hibernate生成的sql语句(过程)-->
         <property name="hibernate.show_sql">true</property>
         <property name="hibernate.format_sql">true</property>
         <!--4.配置数据库生成的策略(4个)  -->
         <property name="hibernate.hbm2ddl.auto">update</property>
         <!--5. 加载持久化类的映射文件: resource: src下资源目录-->
         <mapping  resource="com/qf/domain/Student.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
6.创建测试类测试
package com.qf.test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.qf.domain.Student;
public class TestHibernate01 {
    public static void main(String[] args) {
    //1.加载主配置文件Hibernate.cfg.xml(主配置文件又加载了映射文件(元数据配置文件))
        //1.1 创建配置类的对象
        Configuration configuration =new Configuration();
        //1.2 加载配置文件(加载hibernate.cfg.xml文件)
        configuration.configure();  
        //2.从配置文件中得到sessionFactory对象
        SessionFactory factory = configuration.buildSessionFactory();
        //3.工厂生成session(Hibernate中的session)
        Session session = factory.openSession();
        //4.session可以增删查改
        Student student =new Student();
        student.setStu_name("皮皮虾");
        student.setStu_birthday( new Date());

         session.save(student); 
        //关闭资源
        session.close();
    }
}
1.5 Hibernate中使用的核心类api解释

1.Configuration

Configuration: 配置Hibernate且启动初始化Hibernate框架。
示例:
Configuration  c =new Configuration();
c.configure(); //加载src下的hibernate.cfg.xml文件

2.SessionFactory

从配置中得到SessionFactory对象,生产Session对象:
 c.buildSessionFactory();
 备注:SessionFacotry不是轻量级的。一个数据库对应一个SessionFactory对象。
     如果一个程序有多个数据库一定要有多个SessionFactory对象。
     SessionFactory线程安全的。

3.Session

Session负责增删改查。Session是非线程安全的。此处的Session指的是Hibernate的session(不同于HttpSession,唯一标识用户,用户session)
factory.openSession()
备注:Session使用结束需要关闭。

4.Query

负责查询,本地SQL语句查询和HQL查询。

5.Transaction

事务操作。

6.Criteria

查询(在线查询和离线查询)
1.6 主键生成策略:

备注:

<!-- 当不指定table的时候表名就是持久化类的名称 -->
<!--如果没有指明column属性,表中的列名就是持久化类中成员变量的名称  -->
示例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 查找映射文件的xml约束规则: hibernate-core.xx.jar中查找:org.hibernate包hibernate-mapping-3.0.dtd -->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--hibernate映射的说明 -->
<hibernate-mapping package="com.qf.domain">
<!-- 当不指定table的时候表名就是持久化类的名称 -->
    <class name="Student2">
    <!--如果没有指明column属性,表中的列名就是持久化类中成员变量的名称  -->
        <id name="stu_id">      
            <generator class="uuid"></generator>
        </id>
        <property name="stu_name"></property>
        <property name="stu_birthday"></property>
    </class>
</hibernate-mapping>     

主键的分类

1.自然主键    开发者自己维护主键
     表中有一个列,不为空,不重复,而且不能随意修改,当作主键使用。
     需要用户手动插入主键值(主键由开发者来维护,hibernate不维护) 
     特点:业务逻辑复杂的时候,数据库的维护难度增加,不推荐。

     assigned:必须自己手动插入主键值,不插入报异常。
2.代理主键  hibernate维护主键
     表中没有符合主键的列,创建一个列作为主键,且该键在业务处理中不具有任何意义(只是用来标识数据)。
     特点:显然代理主键
     常见代理主键如下: 
    native:本地策略。数据库平台不同。自动选择指定数据的策略。
            例如:mysql数据默认选择的是identity
                  orcale数据库默认选择的是sequence
    increment:适用于int,long,short类型的主键。自动增长机制是:
              1.先查询数据库中最大的id值 select  max(id) from stu;
              2.在最大的id值上加1作为新的id值插入 
    identity:只能用在支持自动增长的数据中使用。如mysql支持自动增长,orcale不支持自动增长。
    uuid:适用于char,varchar类型的主键。长度为32位的16进制的字符串。占空间大。
         效率高保证唯一性,数据库移植性更好。
    sequence:oralce数据库使用的策略。 

备注:hibernate所有操作加事务
开启事务
Transaction t = session.beginTransaction();
    try{
      //做自己的事
      提交事务
      t.commit();
    }catch(Exception e){
      事务回滚(异常的时候)
      if(t!=null){
         t.rollback();
      }
    }
1.5 数据库生成策略:
<!--配置数据库生成的策略
             create:先删除表后创建表,再操作
             create-drop:先判断有就删除,没有就创建,但是使用完该表删除。(关掉sessionFactory)
             update:没有表就创建表,如果有表了直接进行数据库操作(插入,删除,修改,查询)
             validate:校验。不会自动创建表。主要是校验持久化类中的变量和数据库表的列名是否一致。

                    正式运行的项目使用update.
                    测试:create-drop
-->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值