zoukankan      html  css  js  c++  java
  • Hibernate

     

    ORM:

    对象-关系映射(Object Relational Mapping)
    把对象模型表示的对象映射到基于SQL的关系模型数据结构中
    操作实体对象的时候,不需要和复杂的sql语句打交道,只需要简单的操作实体对象的属性和方法

    javaBean:
      符合三点要求:
        1 属性私有
        2 提供共有的getter和setter方法
        3 公共无参构造

    ORM只是一种行为规范
    主流的ORM框架是Hibernate,iBatis,JPA...
    ORM中基本上都有缓存:一级缓存和二级缓存

    缺点:
      对象之间的关系更加复杂
      自动生成的SQL效率可能不会太高

     Hibernate:

    官网链接:http://hibernate.org/
    易百教程:http://www.yiibai.com/hibernate/
    参考博客:http://blog.csdn.net/dawanganban/article/details/13748235

    Hbernate是一个开放源代码的对象关系映射框架(ORM
    对JDBC进行了非常轻量级的对象封装(消耗资源少
    将pojo与数据库表建立映射关系,是一个全自动的ORM框架
    Hibernate可以自动生成SQL语句,自动执行
    Hibernate可以应用在任何使用JDBC的场合,即可以在Java的客户端程序使用,也可以在Servlet/Jsp的Web应用中使用
    具有数据库兼容性(通过dialog)

    MyBatis映射的是Dao层,映射文件只写SQL语句即可
    Hibernate映射的是pojo层,直接将表映射成对象
      

     Hibernate框架体系结构:

    1 映射类文件:pojo
    2 主配置文件:
        用于描述数据库连接信息,数据库方言,关联映射文件
        命名规则:Hibernate.cfg.xml 或者 hibernate.properties
        位置:源码目录的根目录(Maven项目放在resources目录下)(配置文件的头部可以参考jar包)
          <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    3 映射描述文件:
        用于描述映射类及属性与DB表的字段之间的对应关系
        命名规则:实体类名.hbm.xml
        位置:和实体类在同一目录下(配置文件的头部可以参考jar包)
          <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    4 主要API
        Configration:主要用于加载主配置文件,获取数据库连接
        SessionFactory:用于创建session对象,封装了映射信息以及预定义的SQL
        Session:用于对象操作,完成CRUD操作
        Transaction:用于事务的处理,进行CRUD时要注意,因为Hibernate自动提交事务是关闭的
        Query:用于执行HQL查询语句(HQL属于面向对象的查询,语句中没有表名和字段名)

    Hibernate持久化类的编写规则:

    1 必须提供无参的构造方法(Hibernate底层需要使用反射生成类的实例)
    2 持久化类的属性需要私有,并且提供公有的getter和setter(Hibernate底层会将查询到的数据进行封装)
    3 持久化类的属性尽量使用包装类类型(包装类类型和基本类型默认值不同)
    4 持久化类要有一个唯一标识OID与表的主键对应
      Hibernate需要通过OID区分在内存中是否是同一个持久类,在Java中通过地址区分是否是同一个对象
      Hibernate不允许内存中出现两个OID相同的持久化对象
    5 持久化类尽量不要用final进行修饰
      Hibernate有延迟加载机制,会产生代理对象
      代理对象是hibernate使用字节码增强技术完成的,其实就是产生了当前类的一个子类对象
      剐使用了final,就不能产生子类,从而不会产生代理对象

    在Maven项目中需要引入的jar包:

     <dependencies>
            <!-- hibernate -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.2.10.Final</version>
            </dependency>
            
            <!-- MySql -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.32</version>
            </dependency>
        </dependencies>

        
    
    

    Hibernate主要API:

    Configration:主要用于加载主配置文件,获取数据库连接
      在hibernate的启动过程中,configuration类的实例首先定位映射文档的位置,读取这些配置
      创建sessionFactory对象
      单例的  

    //读取hibernate.cfg.xml文件
     Configuration cfg = new Configuration();
    cfg.configure();
    SessionFactory:用于创建session对象,封装了映射信息以及预定义的SQL
      sessionFactory接口负责初始化hibernate
      单例的,如果一个应用程序中连接了多个数据库,那么需要创建多个sessionFactory对象

    //创建SessionFactory工厂
    SessionFactory sessionFactory = cfg.buildSessionFactory();
    Session:用于对象操作,完成CRUD操作
      session在hibernate中的设计是线程不安全的,所以每个线程创建一个session对象
      hibernate中的session不同于JSP中的HttpSession

    //创建session
    Session session = sessionFactory.openSession();
    Transaction:用于事务的处理,进行CRUD时要注意,因为Hibernate自动提交事务是关闭的

    //开启事务
    Transaction tx = session.beginTransaction();
            
    //执行添加操作

    //提交事务
    tx.commit();
    Query:对数据库及持久对象进行查询,有两种方式:
      用于执行HQL查询语句(HQL属于面向对象的查询,语句中没有表名和字段名)
      本地数据库SQL语句
    Criteria:与Query接口类似
      允许创建并执行面型对象的标准化查询
      不能在session之外使用

    在hibernate.cfg.xml中配置的顺序问题:

    必须将property标签放在mapping节点前:<原因未知,,,欢迎补充>
          
         <!-- 可选配置 -->
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">true</property>
            <property name="hibernate.hbm2ddl.auto">update</property>
            
            <!-- mapping文件 -->
            <mapping resource="com/roxy/hibernate/pojo/Customer.hbm.xml"/>

  • 相关阅读:
    nodejs REPL清屏
    flask 的relationship使用
    flask 数据库多对多(文章和标签)
    设置管理员的 蘑菇丁日报 周报、月报
    访问个人主页、蘑菇丁、使用:import urllib.request
    使用requests访问、登录蘑菇丁
    UUID
    爬虫经典案例
    selenium 获取 cookies, 然后登录
    用chrome浏览器登录以后 手动找到cookie、加到自己的python代码中
  • 原文地址:https://www.cnblogs.com/roxy/p/7607954.html
Copyright © 2011-2022 走看看