首先你这个问题说法就不对,Hibernate强悍就不要JDBC这句话是存在问题的,因为Hibernate就是对JDBC进行的封装。 JDBC的全城叫做Java Data Base Connectivity(java数据库连接),是一组由Sun公司提供的Java操作数据库的API,然后由各个数据库厂商进行了实现,这样我们就能通过相应的驱动包进行各种数据库的连接操作。Hibernate就是基于JDBC的这个一个持久层框架。那么为何要有Hibernate呢?Hibernate又为何而来呢?这要从我们本身Java这门语言说起,Java语言从出生开始就被定位为一种面向对象的语言,Java视一切皆对象,而我们目前大多数的数据库为关系型数据库,数据是通过表与表之间的关系进行联系,当我们使用JDBC操作关系型数据库的时候我们不得不去考虑关系型问题,这样就违背了我们Java这门语言的面向对象观点,于是Hibernate出现了,Hibernate就是为了隔绝对象和关系型数据库之间的这一层别扭(姑且这么叫吧),这样,我们站在Hibernate的角度我们只需要考虑对象的操作,比如说保存一个对象只需要调用session的save方法,而不需要写一条insert into的SQL语句去操作关系型的表,从而达到OO的思想。这样我们就纯面向对象了,那些非面向对象的事情都交由Hibernate去做了,Hibernate会帮我们生成一条insert into语句去发送给数据库。 既然Hibernate如此的好,那么当Hibernate出现后我们还需要JDBC吗?上面我讲了,不是我们不要JDBC了,而是Hibernate帮我们去操作了JDBC,既然Hibernate在操作JDBC我们在操作Hibernate,这样Hibernate就充当了一个中间人的角色,我们想要什么东西须得交给Hibernate,然后再由Hibernate交给JDBC,这样就会多一层去操作,对性能会有一定的影响,如果你的程序对性能要求非常高,那么自己操作JDBC自然要比Hibernate速度更快、效率更高。 在批量处理问题上,Hibernate并没有提供较完美的实现,比如说你要修改1万个对象的某一个属性,通过Hibernate操作你得先加载这1万个对象,然后修改这1万个对象的属性,然后再保存这一万个对象,而JDBC我们可以update xxx set x = x where x = x就可以实现。 看完我的回复之后你觉得“Hibernate如此强大,还需要JDBC么?”这还是一个问题么?
有时没优化
1.hibernate封装的比较XX,但是也有弱点,比如没有ibatis之类的灵活。
2.再者,对于一些小型项目,用hibernate有点牛刀杀鸡。
3.对于数据库这方面的知识不熟悉的人来说,用hibernate固然方便,但是一些基础的代码都会更加生疏,不利于新手学习。
4.hibernate对于我们来说只是一个工具,它的诞生更多的是为了简化开发,所以要分时分地去用。
搞个10几张表相连的数据 你用hibernate查。。 那性能可能想而知。。
当然 问为什么有人要用jdbc 这是必须的 java要访问数据库就要使用JDBC (没有使用框架) LS的也说了 用框架得看项目的大小 开销等种种问题...
你能够从数学意义上论证 “JDBC的功能hibernate都有,JDBC没有的功能hibernate也有”,如果这样,hibernate为什么还保留的接口,给原生的SQL调用提供支持?
还有,hibernate本身的应用,很可能会形成系统的性能降低,能有功能不算什么,能完成高并发相应才是王道。当然hibernate本身也提供了缓存机制,这没啥问题。
2.hibernate适合开发人员,但对于测试人员,本来只需要一条简单的SQL语句,如今却要配置映射文件,如果某个表的字段非常多的话,这是一件痛苦的事情。
哥,我说的是直接使用JDBC,不是通过hibernate间接使用
JDBC的全城叫做Java Data Base Connectivity(java数据库连接),是一组由Sun公司提供的Java操作数据库的API,然后由各个数据库厂商进行了实现,这样我们就能通过相应的驱动包进行各种数据库的连接操作。Hibernate就是基于JDBC的这个一个持久层框架。那么为何要有Hibernate呢?Hibernate又为何而来呢?这要从我们本身Java这门语言说起,Java语言从出生开始就被定位为一种面向对象的语言,Java视一切皆对象,而我们目前大多数的数据库为关系型数据库,数据是通过表与表之间的关系进行联系,当我们使用JDBC操作关系型数据库的时候我们不得不去考虑关系型问题,这样就违背了我们Java这门语言的面向对象观点,于是Hibernate出现了,Hibernate就是为了隔绝对象和关系型数据库之间的这一层别扭(姑且这么叫吧),这样,我们站在Hibernate的角度我们只需要考虑对象的操作,比如说保存一个对象只需要调用session的save方法,而不需要写一条insert into的SQL语句去操作关系型的表,从而达到OO的思想。这样我们就纯面向对象了,那些非面向对象的事情都交由Hibernate去做了,Hibernate会帮我们生成一条insert into语句去发送给数据库。
既然Hibernate如此的好,那么当Hibernate出现后我们还需要JDBC吗?上面我讲了,不是我们不要JDBC了,而是Hibernate帮我们去操作了JDBC,既然Hibernate在操作JDBC我们在操作Hibernate,这样Hibernate就充当了一个中间人的角色,我们想要什么东西须得交给Hibernate,然后再由Hibernate交给JDBC,这样就会多一层去操作,对性能会有一定的影响,如果你的程序对性能要求非常高,那么自己操作JDBC自然要比Hibernate速度更快、效率更高。
在批量处理问题上,Hibernate并没有提供较完美的实现,比如说你要修改1万个对象的某一个属性,通过Hibernate操作你得先加载这1万个对象,然后修改这1万个对象的属性,然后再保存这一万个对象,而JDBC我们可以update xxx set x = x where x = x就可以实现。
看完我的回复之后你觉得“Hibernate如此强大,还需要JDBC么?”这还是一个问题么?
hibernate好处:面向对象的操作数据 ORM
坏处:1 系统运行效率差
2 缓存
适合做在线事务处理
不适合做在线事务分析 存储过程 BI
但是hibernate在优化性能等方面,运行效率方面会比较差,怎么它也要讲你的hql转换为sql才能执行的,况且一些复杂的sql,hibernate是不支持 ,这时候只能老老实实的写sql语句了
麻烦一点点的任务在性能上和SQL就是两回事了
基本的增删改查关联操作Hibernate是可以胜任的。但是还是有一些操作,Hibernate做的不是不可以,而是实在效率不高。比如做报表,多表联合查询等等。(当然,很可能不是Hibernate做的不好,而是使用Hibernate的人做的不够好,呵呵)应该说Hibernate有它自己的优势,在配置定义好的情况下,如果项目相对简单,业务操作不复杂,规模不大。这时使用Hibernate确实不错。复杂数据操作,高并发集群方面,Hibernate确实支持的不好。
更改LZ一句话。既然hibernate封装了JDBC,也就是说,JDBC的功能hibernate都有,JDBC没有的功能hibernate也有。hibernate有的JDBC都有,hibernate能做的,JDBC都能办到。hiberate没有的不能做的,JDBC也有
好了,就说这么多
在此基础之上,数据库访问层往往会遇到如下场景。
1.用户程序需要支持数据主键生成,不然系统升级或迁移的代价很大。
2.DAO访问层提供给业务层的"数据对象"和数据库中"表对象"往往不是一一对应的。人为解决数据映射。
3.增加DAO会话(Session,该会话也可以延长至业务会话),提升了connection(由ConnPool提供Con)利用率,Session的生命周期不等于Conn。
4.Java语言一大特性:封装。对应用开发者屏蔽Conn的API,提供给用户更人性的会话式API。(不要说JDBC更简单,那是应该你熟悉它或者应该说你不熟悉它)。
5.锁机制实现。乐观,悲观。6.缓存 | 内存数据库策略优势。
面对大量的数据插入 缓存后批量更新,效率提升。
面对大批量数据查询 缓存热点数据,减少DB访问量。
面对大量数据更新(特别是紧耦合对象更新) 级联加载,缓存更新,减少DB访问频率。
内存数据库在面对数据更新插入时,能保证事物,(XTP)极限事物处理的必备良药。 一级缓存就不多说了,咱来说说二级缓存。二级缓存在很多应用中都是被独立出来的。
而二级缓存是可以使用内存缓存或者内存数据库来替代Hibernate默认的ehcache实现。
Hibernate提供了二级缓存的接口。以上场景,Hibernate都提供了实现方案,你看下你的应用有哪些符合以上场景不就好了。
JDBC可和Hibernate没啥冲突,他们解决的问题截然不同的。
或者换句话说,你不需要Hibernate解决的问题场景,再个就是你觉得你能做的比它好。刚才学习Hibernate的时候容易有这个误区,淡定,放松,仔细慢慢的体会,一切切会不一样。
对方说的是解决得问题场景。 ORM在数据映射上,本来就是基于面向对象的概念进行映射处理。这个重视程度可能因为角度不同,呵呵,这个我就不累述了。楼主对以上的回答还有什么不满意的啊?尽管提出来,马上放假,哇哈哈! 心情特好。有问必答
还有就是jdbc轻量级
还好意思说别人?垃圾一个。你这个问题我可以给你翻译一下:你好比在问,你比你爹,你妈优秀多了。那还要你爹你妈干吗?
没你爹,你妈。哪儿来的你?
不知道hibernate是封装的JDBC?不知道你是你爹妈生的?
如果发生频率一旦提高,形成一定热点,hibernate的二级缓存还是能提速的。如果不能形成热点,的确只能从native sql去解决这个问题了。而且各个数据库厂商也会提出一些私有API,如果真从极限效率上去考虑,估计hibernate就更疲软了。因场景而异,各人取其所需。
考虑到开发项目的进度,用Hibernate可以加快工作效率,繁琐的jdbc的语句你就可以不用去考虑的
但是如果是做批量操作,必须使用JDBC,即对性能要求较高的操作,请用JDBC