Hibernate (开源对象关系映射框架)

一、基本介绍
1、它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm(对象关系映射)框架,hibernate可以自动生成SQL语句,自动执行; Hibernate可以应用在任何使用JDBC的场合。
2、持久化层:处理关系型数据库(数据存储层)和模型对象(object,业务逻辑模型)的映射关系的代码方法(ORM)
3、Hibernate是一个基于JDBC的主流持久化框架,对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。
4、下载地址:http://www.hibernate.org/downloads
5、新建hibernate.cfg.xml或 hibernate.properties,放在项目根目录,用于配置数据库的相关信息;xlm头文件信息可在hibernate-core-5.3.0.Final.jar中的dtd文件中找到,同时一个类对象的映射xml文件的头也可以在这个jar包的dtd文件中找到;

二、Hibernate的API
  一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。
    1、使用示例:

        // 使用Hibernate的API来完成将Customer信息保存到mysql数据库中的操作
        Configuration config = new Configuration().configure(); // Hibernate框架加载hibernate.cfg.xml文件
        SessionFactory sessionFactory = config.buildSessionFactory();//据库存储源。根据Hibernate配置文件创建对应的数据库存储源。SessionFactory对象创建后,和Configuration对象再无关联。
        Session session = sessionFactory.openSession(); // 相当于得到一个Connection
        // 开启事务
        session.beginTransaction();

        // 用户自己的操作,常用的还有update(),delete(),load(),get()后两个都是查询,get()是直接发送sql语句查询,load是使用代理技术,当要查询时,代理调用Hiberate查询数据库,并初始化其他属性;createQuery()可执行自定sql语句,但是使用的变量名是object里边的,具体待查;也可以使用SQLQuery对象来执行原生的sql语句;
        session.save(obj);

        // 事务提交
        session.getTransaction().commit();
        session.close();
        sessionFactory.close();

2、session对象方法:

     Transaction beginTransaction()    开始工作单位,并返回关联事务对象。
     void cancelQuery()                取消当前的查询执行。
     void clear()                      完全清除该会话。
     Connection close()                通过释放和清理 JDBC 连接以结束该会话。
     Criteria createCriteria(Class persistentClass)    为给定的实体类或实体类的超类创建一个新的 Criteria 实例。
     Criteria createCriteria(String entityName)        为给定的实体名称创建一个新的 Criteria 实例。
     Serializable getIdentifier(Object object)         返回与给定实体相关联的会话的标识符值。
     Query createFilter(Object collection, String queryString)    为给定的集合和过滤字符创建查询的新实例。
     Query createQuery(String queryString)             为给定的 HQL 查询字符创建查询的新实例。
     SQLQuery createSQLQuery(String queryString)       为给定的 SQL 查询字符串创建 SQLQuery 的新实例。
     void delete(Object object)                        从数据存储中删除持久化实例。
     void delete(String entityName, Object object)     从数据存储中删除持久化实例。
     Session get(String entityName, Serializable id)   返回给定命名的且带有给定标识符或 null 的持久化实例(若无该种持久化实例)。
     SessionFactory getSessionFactory()                获取创建该会话的 session 工厂。
     void refresh(Object object)                       从基本数据库中重新读取给定实例的状态。
     Transaction getTransaction()                      获取与该 session 关联的事务实例。
     boolean isConnected()                             检查当前 session 是否连接。
     boolean isDirty()                                 该 session 中是否包含必须与数据库同步的变化?
     boolean isOpen()                                  检查该 session 是否仍处于开启状态。
     Serializable save(Object object)                  先分配一个生成的标识,以保持给定的瞬时状态实例。
     void saveOrUpdate(Object object)                  保存(对象)或更新(对象)给定的实例。
     void update(Object object)                        更新带有标识符且是给定的处于脱管状态的实例的持久化实例。
     void update(String entityName, Object object)     更新带有标识符且是给定的处于脱管状态的实例的持久化实例。

3、Transaction对象的使用:
    封装了事务的操作。我们做增删改查等操作时,必须开启事务.因为session是线程不安全的,这样主要是为了线程安全。保证数据的正确性。
            开启事务: Transaction ts=session.beginTransaction();
            提交事务:ts.commit();
            回滚事务:ts.rollback();
            当通过getCurrentSession获取当前线程绑定的Session时,事务关闭时,会自动把Session关闭并删除。   
    4、xxx类的映射文件xxx.hbm.xml配置示例(这些都可以通过注解实现):

    <!DOCTYPE hibernate-mapping PUBLIC
     "-//Hibernate/Hibernate Mapping DTD//EN"
     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

  <hibernate-mapping>
    <!--定义从一个 Java 类到数据库表的特定映射-->
   <class name="Employee" table="EMPLOYEE">
     <!--可选-->
      <meta attribute="class-description">
         This class contains the employee detail.
      </meta>
      <!--主键,其中generator标签可自动生成主键值-->
      <id name="id" type="int" column="id">
         <generator class="native"/>
      </id>
      <!--其他普通的值,name是对象中属性名字,column是数据库的对应的名字-->
      <property name="firstName" column="first_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
      <property name="salary" column="salary" type="int"/>
   </class>
  </hibernate-mapping>

5、Hibernate 注解
    使用环境:需要安装 Hibernate 3.x 注释包,从 Hibernate 注释发布中拷贝 hibernate-annotations.jar, lib/hibernate-comons-annotations.jar 和 lib/ejb3-persistence.jar 到你的 CLASSPATH。
    @Entity     志着一个类为一个实体 bean
    @table         注释提供了四个属性,允许您覆盖的表的名称,目录及其模式,在表中可以对列制定独特的约束
    @Id            主键;
    @Column        指定某一列与某一个字段或是属性映射的细节信息,常用属性有:name,length,nullable,unique;
        
    6、Hibernate中持久化类编写规范;
       1)、必须提供无参数的默认构造方法。因为程序运行时,Hibernate会运用java的反射机制,创建实体类的实例。
       2)、所有属性必须提供public访问控制符的set get方法
       3)、属性应尽量使用基本数据类型的包装类型(如Integer)
                基本数据类型无法表达null值,所有基本数据类型的默认值都不是null,这样就有很大的缺陷。
                例如有一个score属性,表示学生分数,如果为0,那么是表示该学生未参加考试还是说该学生成绩为0呢?
                这时候如果用包装类型,就可以使用null来表示空值,学生未参加考试等等。
       4)、不要用final修饰实体(将无法生成代理对象进行优化)

三、查询语句:
1、HQL
    面向对象的类似sql的语句;
    1)、基础示例;

    String hql = "FROM Employee";        //查询这个Employee类的所有数据库数据,类名前也可以使用完成的包路径;
    Query query = session.createQuery(hql);
    List results = query.list();

其他语法:
    FROM Employee AS E                给类创建别名
    SELECT E.firstName FROM Employee E        只查询特定项的数据;
    FROM Employee E WHERE E.id = 10            条件查询,类似的使用还有ORDER BY ,GROUP BY,UPDATE,DELETE,INSERT,SUM,MAX,MIN,COUNT,AVG,DISTINCT等
    2)、传参数示例:

    String hql = "FROM Employee E WHERE E.id = :employee_id";
    Query query = session.createQuery(hql);
    query.setParameter("employee_id",10);
    List results = query.list();

3)、分页
    query.setFirstResult(int startPosition)         表示结果中的第几行,从 0 行开始。
    query.setMaxResults(int maxResult)                最大检索结果数量;
2、标准查询(Criteria)
    当使用标准查询时返回一个持久化对象类的实例
    1)基础示例:

    Criteria cr = session.createCriteria(Employee.class);
    cr.add(Restrictions.eq("salary", 2000));    //查询所有salary=2000的结果,也可以不要此行,则查询数据库中所有数据;类似的条件还有gt,lt,like,ilike,between,isNull,isEmpty,isNotEmpty(以上都是替换eq来进行相同的用法)
    List results = cr.list();  

2)逻辑条件示例:

    Criteria cr = session.createCriteria(Employee.class);

    Criterion salary = Restrictions.gt("salary", 2000);
    Criterion name = Restrictions.ilike("firstNname","zara%");

    // 或(or),与(and)
    LogicalExpression orExp = Restrictions.or(salary, name);
    cr.add( orExp );

    List results = cr.list();

3)分页
    public Criteria setFirstResult(int firstResult);
    public Criteria setMaxResults(int maxResults);
3、原始SQL语句查询
    基础示例:

    String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id";
    SQLQuery query = session.createSQLQuery(sql);
    query.addEntity(Employee.class);//返回的是实体对象,如果setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)则返回原始的数据;
    query.setParameter("employee_id", 10);
    List results = query.list();     

四、其他扩展
    1、Hiberate能实现一对一、一对多、多对一、多对多的映射;
    2、Hiberate的缓存机制,批处理方法和拦截器的使用方法;
    3、附:Hiberate从实体到数据库的类型自动映射;

原文地址:https://www.cnblogs.com/aland-1415/p/9161534.html

时间: 2024-12-10 04:01:06

Hibernate (开源对象关系映射框架)的相关文章

Hibernate(开放源代码的对象关系映射框架)

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

Hibernate (开放源代码的对象关系映射框架)

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

Hibernate (开放源代码的对象关系映射框架)介绍

Hibernate (开放源代码的对象关系映射框架) 编辑 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hiberna

Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 但是对于我个人来说,我可能更加倾向于用GreenDao,所以今天也为大家带来了GreenDao的详细博客,希望大家喜欢,之前也详细介绍了ORM的思想,如果不明白可以先看一下前面的博文,这里就不多赘述了,我们新建一个工程 一.相关介绍 官方网站 : http://greendao

hibernate的对象/关系映射结果为空,exists查不到值的问题-20190823

1: hibernate的对象/关系映射 情景:在使用@onetotone/@manytonone时关联结果为空 原因:在使用这个注解的时候,默认的时crossjoin(交叉连接),在进行查询时以及排序时用到了注解关联的属性,如果这个属性为空就会导致查空 解决:注意关联过程中使用到的属性一定要存在 拓展: 1 @OneToOne(fetch = FetchType.LAZY)--懒加载2 @JoinColumns({ 3 @JoinColumn(name = "主键", referen

解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro

LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. 1  LLBL Gen Pro 入门  LLBL Gen Pro Basic 打开LLBL Gen Pro程序,在右边的数据库浏览器(Catelog Explorer)中根结点右键选择从关系数据库创建关系模型( Add Relational Model Data from a Database),然

ORM对象关系映射框架基本搭建

一 概念 1 概念 ORM :对象关系映射,对象和关系之间的映射,使用面向对象的方式来操作数据库 关系对象模型和python对象模型之间的映射 tabel => class ,表映射类 row => object ,行映射为实例 column=> property ,字段映射属性 2 举例 表有login,字段为id int , username varchar, age int 映射到python为 #!/usr/bin/poython3.6 #conding:utf-8 class

接触LLBL Gen Pro 对象关系映射框架后 前途变的一片光明

时间回到2010年,那时候还是熟悉代码生成+基础框架这种模式,基本的开发思路是通过代码生成器生成实体,再生成接口与实现类,最后拖拉控件,写界面数据绑定代码.基本上就是动软代码生成器给出的模式,或是微软的Repository Factory模式的实践,迷恋于微软的Enterprise Libray,这个框架是从Application Block演化而来.我也是算是.NET技术推广以来,第一批学习.NET技术的开发人员. 一直在寻找一种界面与逻辑分离的技术,也没有思路,上面代码生成造成的结果是逻辑代

001---Hibernate简介( 开源O/R映射框架)

001---Hibernate简介(开源O/R映射框架) ORM(Object Relational Mapping)---是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术.简单说:ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据中.本质上就是将数据从一种形式转换到另外一种形式. 分层后,上层不需要知道下层是如何做了. 分层后,不可以循环依赖,一般是单向依赖. Hibernate的创始人:Gavin King Hibernate做什么: