@Scope

@Lazy

@Bean(value=“user0”,name=“user0”,initMethod=“initUser”,destroyMethod=“destroyUser”)

public User getUser(){

System.out.println("创建user实例");
return new User("张三",26);

}

AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);

User bean2 = applicationContext2.getBean(User.class);

创建user实例

实例1 === User [userName=张三, age=26]

@Lazy注解注解的作用主要是减少springIOC容器启动的加载时间

二、hibernate劣势


看完优势之后,感觉hibernate无所不能了,无敌是多么的寂寞。处理大量数据或者大并发情况的网络服务感觉不是很好用,那么现在开始说说hibernate的问题。

1、难以使用数据库的一些功能

hibernate将数据库与开发者隔离了,开发者不需要关注数据库是Oracle还是MySQL,hibernate来帮你生成查询的sql语句,但问题来了,如果你想用某种数据库特有的功能,或者要让查询的sql完全符合你的心意,这就难了。如果使用hibernate,虽然它能对生成的查询进行一定程序的定制,但就有点隔靴挠痒的感觉了,而且你开发起来付出的代价更大。至于hibernate对native sql的支持,还是挺完善的,这种native sql还能返回non-managed entity,不走hibernate的cache,优化是搞定了,但如果整个项目都这么整,那还是用mybatis吧。

很多时候,我们都有一个需求:得到数据库服务器的当前时间。这是因为本机时间和服务器时间是有差别的。各种数据库都提供了函数来获得,比如,mysql,可以用“select now()”。hibernate也提供了一个函数current_timestamp(说起timestamp,个人认为数据库的timestamp做的很差,它居然和datetime是一个数量级的(精确度),这怎么可以用来表示真正的stamp啊!)。可是,你却无法用直接使用“select current_timestamp()”来获得服务器的当前时间,你还必须加上一个查询的表!比如,“select current_timestamp() from tbl_Good”。个人十分郁闷,我只是想用这个简单功能而已,为什么我一定要知道数据库里面的表格呢????更何况还必须建立映射。。。。。。

不是我不明白,这世界太复杂了 。每样产品都是拼命的复杂化,其实,它们实在是忽略了一般的用户只需要一小部分功能而已。默认的功能应该是能够满足普通用户的常见需求的,那样才算是一个好的产品。我不认为hibernate做到了这点。

2、满足不了程序对cache的需求

很多web服务,对cache的依赖是非常大的,hibernate自带的cache按理说也是很强大的,但还是满足不了很多需求。

3、耦合度高

hibernate的确是在你项目开发的时候节约了很多时间,

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】浏览器打开:qq.cn.hn/FTf 开源分享

但是它对你的业务逻辑模型和数据库模型互相依赖的程序太高了。短期没啥问题,但随着项目的变迁,这些都会改变,在维持这种仅仅耦合的关系的时候,你会发信你的代码特别脆弱,随便改一处数据库的schema,整个java项目可能要改几十次。而且现在mybatis的自动mapping做的也很好,开发起来也没花多长时间,等项目进入中后期,你需要大量定制和优化查询的时候,mybatis的开发效率就更明显了。

4、debug难

作为一个后端程序员,我比较喜欢每一行代码我都精确知道它到底在干什么。尤其是数据库访问的代码,往往系统的瓶颈就在这些地方产生,每一行都不能小看。我看过hibernate早期版本的部分代码,比我想象的复杂和强大很多。的确很多地方Hibernate可以强大的只用一行代码解决很多问题,但比如说一个update()或者save()到底做了什么,这里既有hibernate本身的逻辑,也有你应用的逻辑,如果这一行产生了问题,你该如何去做?我个人觉得这是很难搞的,还不如一开始费点事,用mybatis这种。

作为一个程序员,我始终坚持认为改代码比改配置文件容易。

5、hibernate更新大批量数据

(1)hibernate批量更新customers表中大于零的所有记录的age字段:

Transaction transaction = session.beginTransaction();

Iterator customers=session.find(“from Customer c where c.age>0”).iterator();

while(customers.hasNext()){

Customer customer=(Customer)customers.next();

customer.setAge(customer.getAge()+1);

}

transaction.commit();

session.close();

如果customers表中有一万条年龄大于零的记录,那么session的find()方法会一下子加载一万个customer对象到内存中。当执行tx.commit()方法时,会清理缓存,hibernate执行一万条更新customers表的update语句:

update CUSTOMERS set AGE=? …. where ID=i;

(2)以上hibernate批量更新方式有两个缺点

占用大量内存空间,必须把一万个customer对象先加载到内存,然后一一更新他们。

执行的update语句的数目太多,每个update语句只能更新一个Customer对象,必须通过1万条update语句才能更新一万个Customer对象,频繁的访问数据库,会大大降低应用的性能。

(3)为了迅速释放1万个Customer对象占用的内存,可以在更新每个Customer对象后,就调用Session的evict()方法立即释放它的内存:

Transaction transaction = session.beginTransaction();

Iterator customers=session.find(“from Customer c where c.age>0”).iterator();

while(customers.hasNext()){

Customer customer=(Customer)customers.next();

customer.setAge(customer.getAge()+1);

session.flush();

session.evict(customer);

}

transaction.commit();

session.close();

在以上程序中,修改了一个Customer对象的age属性后,就立即调用Session的flush()方法和evict()方法,flush()方法使hibernate立刻根据这个Customer对象的状态变化同步更新数据库,从而立即执行相关的update()语句;evict()方法用于把这个Customer对象从缓存中清除出去,从而及时释放它占用的内存。

但evict()方法只能稍微提高批量操作的性能,因为不管有没有使用evict()方法,Hibernate都必须执行1万条update语句,才能更新1万个Customer对象,这是影响批量操作性能的重要因素。假如Hibernate能直接执行如下SQL语句:

update CUSTOMERS set AGEAGE=AGE+1 where AGE>0;

那么以上一条update语句就能更新CUSTOMERS表中的1万条记录。但是Hibernate并没有直接提供执行这种update语句的接口。应用程序必须绕过Hibernate API,直接通过JDBC API来执行该SQL语句:

Transaction transaction = session.beginTransaction();

Connection con=session.connection();

PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGEAGE=AGE+1 where AGE>0 ");

stmt.executeUpdate();

transaction.commit();

以上程序演示了绕过Hibernate API,直接通过JDBC API访问数据库的过程。应用程序通过Session的connection()方法获得该Session使用的数据库连接,然后通过它创建 PreparedStatement对象并执行SQL语句。值得注意的是,应用程序仍然通过Hibernate的Transaction接口来声明事务边 界。

如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行Hibernate批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateCustomer()的存储过程,代码如下:

create or replace procedure batchUpdateCustomer(p_age in number) as

begin

update CUSTOMERS set AGEAGE=AGE+1 where AGE>p_age;

end;

以上存储过程有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:

Transaction transaction = session.beginTransaction();

Connection con=session.connection();

String procedure = “{call batchUpdateCustomer(?) }”;

CallableStatement cstmt = con.prepareCall(procedure);

cstmt.setInt(1,0); //把年龄参数设为0

cstmt.executeUpdate();

transaction.commit();

从上面程序看出,应用程序也必须绕过Hibernate API,直接通过JDBC API来调用存储过程。

6、hibernate删除大批量数据

Session的各种重载形式的update()方法都一次只能更新一个对象,而delete()方法的有些重载形式允许以HQL语句作为参数,例如:

session.delete(“from Customer c where c.age>0”);

如果CUSTOMERS表中有1万条年龄大于零的记录,那么以上代码能删除一万条记录。但是Session的delete()方法并没有执行以下delete语句

delete from CUSTOMERS where AGE>0;

Session的delete()方法先通过以下select语句把1万个Customer对象加载到内存中:

select * from CUSTOMERS where AGE>0;

接下来执行一万条delete语句,逐个删除Customer对象:

delete from CUSTOMERS where ID=i;

delete from CUSTOMERS where ID=j;

Hibernate基础知识总结相关推荐

  1. 大专生三面蚂蚁金服,Hibernate基础知识总结

    二.hibernate劣势 看完优势之后,感觉hibernate无所不能了,无敌是多么的寂寞.处理大量数据或者大并发情况的网络服务感觉不是很好用,那么现在开始说说hibernate的问题. 1.难以使 ...

  2. Hibernate基础知识

    本文主要包括以下内容 对象的状态 一对多的单向关联 一对多的双向关联 多对多关联 一对一关联 对象状态的变化 对象的状态 临时状态 new 持久化状态 get,save,update 脱管状态 cle ...

  3. 基础知识漫谈(1): 想到哪儿写到哪儿

    http://www.cnblogs.com/anrainie/p/5606570.html ***************************** 一.想到哪儿写到哪儿 给公司新员工培训,和网上 ...

  4. Spring框架基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-spring-framework/ Spring框架简介 Spring , 一个开源的框架 , ...

  5. oracle对查询结果求和_oracle基础知识分享

    原文链接:https://page.om.qq.com/page/OO2PXCD6VZ6CVqLqjpU6uShg0 以下是本人整理的ORACLE学习的一些基本的语法知识,如有不对的地方,望大家批评指 ...

  6. java最最基础知识(入门必备)

    JAVA的面向对象编程--------课堂笔记 面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方 ...

  7. IT:后端进阶技术路线图(初级→中级→高级)、后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介、技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略

    IT:后端进阶技术路线图(初级→中级→高级).后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介.技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略 目录 后端 ...

  8. 计算机基础知识对程序员来说有多重要?

    数据结构和算法,操作系统,编译原理,计算机组成原理这些课程对普通程序员来说是否需要去学习?会带来哪些帮助? 我们依次来了解这几门课程是在工作中有啥用,回答有点长,请保持耐心:) 一.数据结构与算法 正 ...

  9. SpringBoot基础知识

    SpringBoot基础知识 SpringBoot课程笔记 前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程- ...

最新文章

  1. PlanAhead工具应用
  2. 韦东山u-boot、kernel打补丁操作
  3. 网站不允许上传asp cer cdx htr等文件时
  4. Leetcode 100. 相同的树 解题思路及C++实现
  5. Android 抓包工具r0capture使用
  6. 学习一项新技能的公式
  7. WPF开源项目:AIStudio.Wpf.AClient
  8. DOM(document object model),文档对象模型
  9. profile 配置文件修改后如何生效?
  10. Android 系统(270)---开机广播的简单守护以及总结
  11. html5触摸指定区域,HTML5/CSS3系列教程:HTML5 区域(Sectioning)的重要性
  12. 在Ubuntu中部署并测试Fabric 1.0 Beta
  13. uni-app 引用地图
  14. Pthon入门--range()函数
  15. Linux之web服务搭建静态网页------综合练习
  16. 删除电脑中用强制删除不能删除的bat命令脚本
  17. 小说我成了机器人桑尼_我在月球当皇帝
  18. python爬虫ip限制_爬虫访问中如何解决网站限制IP的问题?
  19. 代理池篇(一)获取66免费代理网+西刺代理
  20. Houdini图文笔记:Houdini Indie正版声明

热门文章

  1. 190326 逆向-MFC逆向技巧
  2. NS-3学习——(1)
  3. 2021-09-20 微信小程序WebService调用接口
  4. 攻防世界WEB练习 | easyphp
  5. 2020年2月的第一篇
  6. java连接SQL server2008
  7. (附源码)spring boot教师排课课系统 毕业设计 310858
  8. 高权重B2B网站分析
  9. JAVA之List去重
  10. 转载一篇不错的博客:程序员的幽默