- 持久化
- 为了避免重启后用户数据丢失,所以要把数据放到硬盘上,但是因为硬盘很慢,所以不能替代内存将对象直接放在硬盘上
- 可以使用序列化、数据库等手段
- 序列化
- 将内存中的重要数据适时序列化到硬盘上,然后下次上电后反序列化回内存中
- 效率低
- 关系型数据库
- 特点
- 强大的理论基础 - 关系代数、关系演算
- 支持大规模的数据存储和查询
- 支持事务操作
- 高度抽象的SQL,屏蔽了数据库的不同和实现细节
- 应用程序与数据库自上而下的交互过程
- 应用程序->O/R Mapping框架->JDBC->各个数据库或第三方基于JDBC的实现(一些jar)->与特定数据库交互的底层协议(不统一)->数据库
- Java和数据库交互的底层协议(应用层)
- 你发什么请求,我给你什么响应,消息的格式、次序
- 怎么握手、认证、授权、数据加密、数据包分组、查询语句的格式、结果的格式、大结果集的拆分、数据缓冲
- JDBC(Java Database Connectivity)
- Java定义接口,各个数据库去实现
- 是非常“低级”的接口,使用复杂,细节太多,比如要打开Connection,创建Statement,执行SQL,遍历ResultSet,关闭Connection避免资源泄露。
- 其实是一组简单易用的接口,如Connection、Statement、ResultSet等,并不是具体的实现。
- 是代码级的协议、约定。
- 是除了O/R Mapping框架以外最高层的抽象层了。
- JDBC的设计思路/架构优化过程
- 第一阶段
- 做法:用户直接new出特定数据库的JDBC实现类,如MySQLConnectionImpl。
- 问题:面向实现编程,当底层实现细节改变时,使用者会受到不必要的影响,可能这个变化还没有大到改变逻辑和接口、影响用户。比如类名修改时,用户受影响,new的地方都要改。
- 第二阶段
- 做法:使用简单工厂。即增加了一个抽象层,根据传入的type字符串来创建相应的底层实现类。
- 问题:还是有点面向实现编程,虽然不再面向底层实现类,但是面向了工厂类(自身实际上就是一个实现类)。比如工厂类被封装在了JDK等底层jar包中,那就没办法通过修改工厂类增加一个新的底层实现类了。
- 第三阶段
- 做法:数据驱动。即使用配置文件。把工厂类需要创建哪些底层实现类放到配置文件中,工厂类中使用反射机制去动态创建配置文件中列出的底层实现类。
- 问题:配置文件使用有点麻烦,而且必须写对底层实现类的名字。而且这些底层实现细节和过程不应该暴露出来,应该让各个厂商或者第三方在各自的jar包中去创建各自的底层实现类。
- 第四阶段
- 做法:使用工厂方法。这样就彻底的面向接口编程了,把工厂也给变成了接口,那么以后用户不用再写配置文件了,也不用在增加底层实现类时去修改工厂类了。
- 问题:虽然用户不在直接面向底层实现类,但是面向了具体工厂类,只是问题转移了?难道用户以后在使用时要new相应的工厂类?
- 第五阶段
- 做法:增加一个Manager类,把工厂类也隐藏取来,有点Facade、代理、适配器的感觉。各个具体工厂类在静态初始化时自动把自己注册到Manager类中,然后用户向Manager类要一个指定类型的工厂类,Manager只需要从注册到自己这里的工厂类中找到合适的返回给用户即可。Class.forName("com.conderising.mysql.MySqlDriver");其实就是这个注册过程。
- 反思
- 和直接使用一个Manager去直接获得底层实现类相比,多了一个工厂方法抽象层,有了工厂方法带来的下述优势。
- 工厂方法的作用是在增加或修改新的底层实现类时,不用去动底层代码或Manager类。这样才可以在引入的底层jar包之外进行扩展,可以增加自定义的底层实现类和工厂类、或者新引入的jar包(包含前面两者)。
- Manger类的作用是提供一个统一入口,不用去new具体的工厂类甚至底层实现类。即使增加了自定义的底层实现类和工厂类、或者新引入的jar包(包含前面两者),只需要注册到Manger类中,就能用了,而且只要用户传入type即可,不需要new具体的工厂类,有点类似简单工厂的部分优势。
- 第一阶段
- O/R Mapping
- 为了将Java对象和关系型数据库对应起来
- 中间件(Middleware)
- 把通用的、复杂的服务交给中间件提供商去搞定,开发人员只关注于业务逻辑的开发
- EJB标准
- 最早出现,但还是有点复杂,而且要和企业级应用服务器等一起卖,贵。
- EJB 3.0
- Hibernate的创始人加入后推出,参考Hibernate也使用了注解的方式,极大的简化了开发,但开发人员已经爱上了轻量级开发,仍没有成功。
- 不过遗留下一个副产品 - JPA(Java Persistence API),成为了一个标准。
- 轻量级框架
- Hibernate
- 把Java属性用声明的方式映射到数据库表中,完全不用关系Connection、SQL这些细节。
- iBatis
- MyBatis
- Hibernate
- 特点