Java个人总结
Java 个人总结是一个持续更新的系列,工作多年,抽个空对Java 做一个总结归纳,温故而知新,也希望能帮助到正在学习Java EE的同学们,本系列目录:
本次是第三次修改,会随着JDK更新而修改,增删一些东西,目前已至JDK8。
Java常用框架介绍
主要介绍一些我在历年工作中遇到的J2EE框架,最早接触到就是大家都熟悉的Hibernate,Struts,Spring以及SpringMVC。
后来玩分布式又熟悉了Hessian,SpringCloud系列服务框架,还有一些例如MQ框架ActionMQ,Kafka,持久化框架MyBatis和它的puls版本,当然还有一些别的,例如Quartz,Jackson,Freemarker等有意思的框架。
正是有这么多开源框架存在,使得从业开发人员节约了很多时间成本,提高了工作效率。
这些优秀的框架也是我们学习和参考的样本,去研究研究它们的源代码,设计思路,不仅能提高自己的技能水平,薪资待遇,还能给自己带来一些新的想法,开阔视野。
今天主要是总结性的概述一些框架的作用,以及它们有关的背景故事,具体的内容后续会单独详述!
Hibernate
创始人:Gavin King
背景故事:
时间2001年,地点是澳大利亚悉尼的Clarence Street有一家叫做Cirrus Technologies的公司,这是一家做J2EE企业级应用开发和咨询的公司,Gavin King在工作的时候发现CMP(实体bean技术)效率太烂(来自百度百科),并决定设计一种更好的方案,因此与当时的老板产生了争执,为了赢得争执,Gavin King耗时2年开发了Hibernate,这就是Gavin King,一个充满激情、脾气很倔、永不言败的人。
工作原理:
Hibernate技术本质是一个ORM(对象关系映射)框架,提供数据库服务的中间件。它是利用数据库以及其他一些配置文件(Hibernate.properties,XML Mapping等)为应用程序提供数据持久化服务。
1. hibernate如何连接数据库?
配置文件Hibernate.cfg.xml文件中定义了和数据库进行连接的信息,包括数据库方言.jdbc驱动.用户名.密码和URL等。
Configuration 类借助dom4j的xml解析器进行xml的解析设置环境,然后使用这些环境属性来生成sessionfactory。
这样sessionfactory生成的session 就能够成功获得数据库的连接。2. hibernate如何进行数据库写操作?
当保存一个pojo持久化对象时,触发Hibernate保存事件监听器进行处理。
Hibernate通过映射文件获得对象对应的数据库表名以及属性对应的数据库列名,然后通过反射机制获得持久化对象的各个属性,最终组织向数据库插入新对象的SQL的insert语句。
调用session.save()保存数据后这个对象会被标识为持久化状态放在session,当事物进行提交时才真正执行 insert语句。3. hibernate如何从数据中载入对象?
当需要读取读取文件时,Hibernate先尝试从session缓存中读取,如果session缓存数据不存在或是脏数据并且配置了二级缓存,Hibernate尝试从二级缓存中检索数据;否则Hibernate会根据对象类型·主键等信息组织select语句到数据库中读取,再把select结果组织成对象返回。4. hibernate如何进行数据库查询操作?
Hibernate提供SQL HQL Criteria查询方式。HQL是其中运用最广泛的查询方式。
用户使用session.createQuery()函数以一条HQL语句为参数创建Query查询对象后,Hibernate会使用Anltr库把HQL语句解析成jdbc可以识别的sql语句。如果设置了 查询缓存,那么执行Query.list()时,Hibernate会先对查询缓存进行查询,如果查询缓存不存在,在使用select语句查询数据库。
优点:
- 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
- Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
- hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
- hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
缺点:
- 由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate。
- 框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来。
- 如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
- Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点。
MyBatis(曾用名IBatis)
创始人:Clinton Begin,Apache软件基金会
背景故事:
IBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2002年发起的开放源代码项目。于2010年6月16号迁移至谷歌,改名为MyBatis。
工作原理:
MyBatis(ibatis) 是一个基于Java的半自动化的持久框架,半自动化是指ibatis并不会在运行期自动生成sql语句执行,而是具体的sql需要通过配置文件进行编写,并将所需的参数,以及返回的结果字段映射到指定的POJO.
MyBatis(ibatis)通过 SQL Map 将 Java 对象映射成 SQL 语句和将结果集再转化成 Java 对象,与其他 ORM 框架相比,既解决了 Java 对象与输入参数和结果集的映射,又能够让用户方便的手写使用 SQL 语句。
MyBatis(ibatis)要达到目的就是把用户关心的和容易变化的数据放到配置文件中配置,方便用户管理。而把流程性的、固定不变的交给 MyBatis(ibatis)来实现。这样是用户操作数据库简单、方便,这也是 MyBatis(ibatis)的价值所在。
优点:
- iBATIS被广泛认为是最简单的一种持久化框架,sql可以写在xml中,结构清晰,灵活配置。
- 文件归类,select 后的字须定义到标签中,可以实现部分代码复用。
- 执行sql后,返回的结果集自动封装。类似以下代码,均可省略。
- MyBatis真正的力量是在映射语句中。
这里是奇迹发生的地方。对于所有的力量,SQL映射的XML文件是相当的简单。
当然如果你将它们和对等功能的JDBC代码来比较,你会发现映射文件节省了大约95%的代码量。
MyBatis的构建就是聚焦于SQL的,使其远离于普通的方式。
简洁的代码和简单的配置使得使用iBATIS所需的代码量可以减少到了相应JDBC代码的62%
总结一下:可以省代码。- 动态sql。
- MyBatis改进了应用的设计方式以确保未来的可维护性,后期可维护性增加。
- 基于xml的,所以适合多平台。
缺点:
- 开源的东西,文档资料少,官方说明文档太简单,真正有应用价值的信息不多。
- 实现了结果集自动封装,一把双刃剑,返回的结果集封装结果单一,不能实现灵活封装,同名字段,会覆盖。
- sql写在xml, 没有办法打断点,调试非常不方便。
- 日志输出不完全。
- 错误信息提示异样 ,报错信息比较混乱,有些时间没有参考价值,没有起到提示作用。
- 文档少,现有的文档提供的标签,也不能完全满足我们的需求。
Hibernate与MyBatis的对比
- MyBatis非常简单易学,Hibernate相对较复杂,门槛较高。MyBatis拿来文档看半天到两天就可以掌握了。Hibernate可能需要3倍以上的时间来掌握。
- 二者都是比较优秀的开源产品。但Hibe