导航

Hibernate

Posted on 2017-09-28 18:22  耍流氓的兔兔  阅读(214)  评论(0编辑  收藏  举报

 

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