hibernate:对象关系映射(ORM)框架
- 在POJO与数据库表之间建立映射关系。
- 对JDBC进行轻量级封装,即底层是JDBC实现。
对象关系映射:是一种把对象映射到关系数据库中去的技术。它的作用是在数据库和对象之间作了一个映射,让我们在操作对象的时候,不需要再去和复杂的sql语句打交道,只要像平时操作对象一样操作它就可以了。
配置文件名默认为“hibernate.cfg.xml”(或者hibernate.properties),Hibernate初始化期间会自动在classpath中寻找这个文件,并读取其中的配置信息,为后期数据库操作做好准备。
使用Hibernate操作数据库需要七个步骤
(1)读取并解析配置文件
Configuration conf = new Configuration().configure();
上面的代码将利用CLASSPATH中的默认配置文件(“hibernate.cfg.xml”或者hibernate.properties)来创建并初始化一个Configuration实例。
(2)读取并解析映射信息,创建SessionFactory
SessionFactory sf = conf.buildSessionFactory();
(3)打开Session
Session session = sf.openSession();
(4)开始一个事务(增删改操作必须,查询操作可选)
Transaction tx = session.beginTransaction();
(5)数据库操作
session.save(user);//或其它操作
(6)提交事务(回滚事务)
tx.commit();(tx.rollback();)
(7)关闭session
session.close();
Configuration 实例会根据当前的数据库配置信息,构造SessionFactory 实例并返回。SessionFactory 一旦构造完毕,即被赋予特定的配置信息。也就是说,之后的Configuration 任何变更将不会影响到已经创建的SessionFactory 实例。
SessionFactory 中保存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级数据缓存和Statement Pool。由此可见,SessionFactory 的创建过程非常复杂、代价高昂。
一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。
SessionFactory有以下特点:
1)它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。
2)它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。
Session也被称为持久化管理器,相当于JDBC的Connection。它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。
Session有以下特点:
1)不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。
2)Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。
Session接口提供了操纵数据库的各种方法,如:
1)save()方法:把Java对象保存数据库中。
2)update()方法:更新数据库中的Java对象。
3)delete()方法:把Java对象从数据库中删除。
4)get()方法:从数据库中加载Java对象。
transaction:hibernate对数据的操作都是封装在事务中,并且默认是非自动提交的方式,所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。
openSession与getCurrentSession的区别
1)getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出。
2)openSession每次创建新的session对象,getCurrentSession使用现有的session对象。
当PreparedStatement对象创建时,数据库会对这个PreparedStatement中的SQL进行语法检查、语义分析、选择优化器并创建相应的执行计划。PreparedStatement对象与创建它的Connection实例绑定,一旦connection被关闭,那么对应的PreparedStatement也将被废弃。
序列化:为了使对象可序列化,可以实现Serializable接口。序列化意味着对象可以在HttpSession中保存,或者将对象通过RMI传输。
XML:XML文件头定义了XML文档所采用的编码方式:encoding=”UTF-8”。并指定了当前XML的DTD,DTD文件对当前XML文档中的节点进行了定义,这样我们加载配置文件之前,可通过指定的DTD对当前XML中的节点进行检查,确定XML结构和数据类型是否合法。
HQL拼接:
参数绑定机制(顺序占位符、引用占位符):
属性查询:
1)单属性:
2)多属性:
或者
实体对象的三种状态:
缓存策略: