hibernate的作用及优缺点
hibernate是一个对象关系映射框架,他是对JDBC进行了轻量级的对象封装,使得程序员可以使用面相对象的思维来操作数据库,把以往的操作数据库记录换成操作对象,还实现了对象的持久化
优点
hibernate使用反射机制而不是字节码增强程序来实现透明性
hibernate的性能非常好,因为他是一个轻量级框架,映射灵活
他支持各种关系的数据库,从一对一到多对多的各种复杂关系
缺点:
大量的多表,复杂的查询级联关系难以驾驭,对于复杂的查询需要配置的比较多,效率还不高(不过他提供了HQL语句也可)
而且对数据库的要求高
ORM - Hibernate设计原理
hibernate框架是以款ORM工具,依据ORM设计思想开发出来的
Object--Relation--Mapping 对象是java的entity,关系是关系数据库,思想就是将程序中的对象和数据库表实现自动映射,利用ORM工具在查询的时候返回的就是对象,在更新、插入的时候也会将对象自动写入到数据库表,hibernate就是封装了SQL+JDBC操作细节
类似的框架还有JPA,ibatiS
hibernate 核心API
org.hibernate.cfg.Configuration类
configure():加载hibernate.cfg.xml配置文件并且解析处理【Configuration cfg = new Configuration().configure(); 先调用无参数的构造:
public Configuration() {
this(new SettingsFactory());//创建SessionFactory
}
然后调用:
protected Configuration(SettingsFactory settingsFactory) {
System.out.println("Configuration(SettingsFactory settingsFactory)");
this.settingsFactory = settingsFactory;
reset();//初始化很多变量
}
然后调用configure()
public Configuration configure() throws HibernateException {
configure("/hibernate.cfg.xml");//加载hibernate主配置文件
return this;
}
默认是调用的hibernate.cfg.xml文件,如果想调用自定义的文件可以调用如下方法:
public Configuration configure(String resource) throws HibernateException {
log.debug("configuring from resource: " + resource);
InputStream stream = getConfigurationInputStream(resource);
return doConfigure(stream, resource);
}
根据getConfigurationInputStream(resource)得到文件流,getConfigurationInputStream(resource)调用ConfigHelper.getResourceAsStream(resource)。
public static InputStream getResourceAsStream(String resource) {
String stripped = resource.startsWith("/") ?
resource.substring(1) : resource;
InputStream stream = null;
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader!=null) {
stream = classLoader.getResourceAsStream( stripped );
}//加载文件dom4j解析文件
】
buildSessionFactory():创建SessionFactory
setProperty(String key,Object value):通过代码给hibernate设置属性
这里的设置参数和一般的在hibernate配置文件里配置效果是一样的Configuration configuration = new Configuration(); configuration.configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); configuration.setProperty("hibernate.connection.url", myConnectionUrl); configuration.setProperty("key", value); sessionFactory = configuration.buildSessionFactory(); Session s = sessionFactory.openSession(); Transaction tx =session.beginTransaction();
org.hibernate.SessionFactory接口
作用:初始化Hibernate,负责创建Session,使用了工厂模式
Configuration config = new Configuration(); config.configure(); SessionFactory sessionFactory = config.builSessionFactory();
SessionFactory是线程安全的,一个数据对应一个Sessionfactory,生命周期长,一般在整个生命周期中有效;
Sessionfactory缓存了生成的SQL和数据库连接的相关信息(url,user,password)和映射信息,以及hibernate运行时要用到的一些信息
- openSession():创建数据库连接,并且返回一个Session
- getCurrentSession():获得当前线程的Session
org.hibernate.Session接口
作用:执行对象持久化对象的CRUD操作
beginTransaction():开始一个事物,并且返回一个事物实例
save(Object):用于保存持对象,并保存数据的方法;执行save方法之后并不会立即操作数据库来进行保存数据,而是在事物提交的时候才会保存数据;
persist(Object):
saveOrUpdate(Object):创建或更新一条记
merge(Object):
get(Class,Serializable):根据id(主键)查询某个类型的对象
load(Object,Serializable):根据id查询,查询返回的是一个代理对象,不会立刻访问数据库,而是延迟加载的,当真的调用到这个对象的属性或方法的时候才会查询数据库
以上两者的区别:load()和get()在未找到符合条件的持久化对象的时候,load()会抛出一个异常,而get()方法会返回null;另外两者对缓存对象的读取也不同,load()方法会先从hibernate的一级缓存中查找符合条件的对象,找不到的话就去hibernate的二级缓存中去查找对象,仍未找到的话才会去数据库中去查找,但是get方法不会去查找hibernate的二级缓存;
delete(Object):删除记录
flush():把以及缓存和数据库同步
clear():清空Sessiono,清除所有保存在当前session缓存中的实体对象,终止所有正在执行的方法(eg:save,updae,delete)
createSQLQuery(“select * from tablename”):执行纯sql语句的查询,Hibernate中不建议使用SQL查询
getNameQuery(“名字”):命名查询,查询语句配置在hbm.xml配置文件中
org.hibernate.Transaction接口
org.hibernate.Query接口
list():返回查询结果集
uniqueResult():查询唯一的结果,返回结果是Object
executeUpdate():批量更新
setFirst(int):设置分页时开始的位置,从0开始
setMaxResult(int):设置一次抓取多少条
org.hibernate.Criteria接口
作用:条件擦汗下,比Query更加面向对象
org.hibernate.criterion.Restrictions类
org.hibernate.StatelessSession接口
hibernate框架的基本特性
hibernate关系映射
hibernate关联操作
hibernate查询
hibernate高级特性
主键生成策略
作用:配置并启动Hibernate,读取配置文件、读取映射文件,创建单实例的SessionFactory(一个数据库一个SessionFactory)
Session 也称为持久化器,Session是非线程安全的,生命周期短,代表程序和数据库的一次连接,如果session长时间打开,会长时间占用内存和数据库连接;
获取Session对象后,Hibernate内部并不会获取操作数据库的Connection对象,而是等Session对象真正需要对数据库进行CRUD等操作时,才会从数据库连接池中获取Connection对象;
关闭Session对象时,则是将Connection对象返回到连接池中,而不是关闭Connection对象
每个session对象内部都有一个缓存,他存放当前工作单元中加载的对象,session缓存被称为hibernate的一级缓存,sessionFactory缓存被称为hibernate的二级缓存,这两个缓存都位于持久层,他们存放的都是数据库数据的拷贝,sessionFactory的内置缓存存放元数据和预定义SQL,sessionFactory内置缓存是只读缓存
Hibernate缓存的三大优点:
1.减少数据库的访问频率,提高访问性能
2.保证缓存中的对象与数据库同步,位于缓存中的对象在事物提交的时候会自动同步到数据库
3.当持久化对象之间在关联时Session保证不出现对象图的死锁
4.Session如何判断持久化对象的状态的改变呢?
Session加载对象后为对象值类型的属性复制一份快照,当Session清理缓存时,比较当前对象和他的快照就可以知道哪些属性发生了变化;
5.session什么时候清理缓存?
(1)commit()方法被调用时
(2)查询时会清理缓存,保证查询结果能反映对象的最新状态
(3)显示的调用session的flsh()方法
当对象使用native生成器时会立刻清理缓存想数据库中插入记录
作用:负责事物的操作
commit():事物提交
rollback():事物回滚
作用:Query可以使用HQL语言查询数据库
无状态session,不和一级缓存、二级缓存打交道,通过使用该接口会把数据立刻写到数据库
StatelessSession s = sessionFactory.openStatelessSession();