一、基本介绍

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从实体到数据库的类型自动映射;

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

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

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...

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

    Hibernate(开放源代码的对象关系映射框架) 1.简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全 ...

  3. android对象关系映射框架ormlite之一对多(OneToMany)

    前两天,用ormlite对单张表进行了基本的操作,但是,我们知道通常情况对于单张表格进行操作在实际情况中很前两天不现实,那么ormlite能否像Hibenate那样实现多张表之间的一对多,多对多(即O ...

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

    Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...

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

    1: hibernate的对象/关系映射 情景:在使用@onetotone/@manytonone时关联结果为空 原因:在使用这个注解的时候,默认的时crossjoin(交叉连接),在进行查询时以及排 ...

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

    LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...

  7. Hibernate 中对象关系映射(ObjectRelationMapping)

    1.什么是对象关系映射? 解析:对象-关系映射(Object Relational Mapping,简称ORM,对象关系映射)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说, ...

  8. Hibernate:对象关系映射(一对一,一对多,多对一,多对多)

    如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...

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

    时间回到2010年,那时候还是熟悉代码生成+基础框架这种模式,基本的开发思路是通过代码生成器生成实体,再生成接口与实现类,最后拖拉控件,写界面数据绑定代码.基本上就是动软代码生成器给出的模式,或是微软 ...

随机推荐

  1. uniqid()

    uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.

  2. 前端PHP入门-021-重点日期函数之日期验证函数

    checkdate可以判断一个输出的日期是否有效. 在实际的工作中,我们需要经常用于检测常用于用户提交表单的数据验证. 函数的语法格式如下: bool checkdate ( int month,in ...

  3. c# WebService SOAP及Rest调用

    SOAP及Rest的调用区别参照如下: REST似乎在一夜间兴起了,这可能引起一些争议,反对者可以说REST是WEB诞生之始甚而是HTTP出现之日就相伴而生的原则.但是毋庸置疑的事实是,在Google ...

  4. 基于HDP3.0的基础测试

    1,TestDFSIO write和read的性能测试, 测试hadoop读写的速度.该测试为Hadoop自带的测试工具,位于$HADOOP_HOME/share/hadoop/mapreduce目录 ...

  5. 【转】ubuntu 11.04使用apt-get安装软件时一直提示E:unable to locate package

    问题: VMware虚拟机安装了ubuntu 11.04,在使用apt-get安装软件时一直提示E:Unable to locate package. 百度了原因,说是要更新源,使用命令:sudo a ...

  6. 【CodeForces】913 D. Too Easy Problems

    [题目]D. Too Easy Problems [题意]给定n个问题和总时限T,每个问题给定时间ti和限制ai,当解决的问题数k<=ai时问题有效,求在时限T内选择一些问题解决的最大有效问题数 ...

  7. Daily Report-1126

    今日: 上午主要是回顾了react,阅读官方文档的时候发现了list中key值设计的必要性. 看了部分react源码,发现有些吃力,在询问羽牧学长之后调整策略,从redux和mobx入手,先多熟悉用法 ...

  8. Java后台开发面试题总结

    1>如何定位线上服务OOM问题 2>JVM的GC ROOTS存在于那些地方 3>mysql innodb怎样做查询优化 4>java cas的概念 Java服务OOM,比较常见 ...

  9. idea 控制台乱码

    第一步:修改intellij idea配置文件: 找到intellij idea安装目录,bin文件夹下面idea64.exe.vmoptions和idea.exe.vmoptions这两个文件,分别 ...

  10. mysql中列的增删改

    增加列: ); ) after id; ) first; 修改列名: ); #change可改名字与字段类型 mysql> alter table a change uid uid int; Q ...