• 持久化与JDBC与OR框架


    • 持久化
      • 为了避免重启后用户数据丢失,所以要把数据放到硬盘上,但是因为硬盘很慢,所以不能替代内存将对象直接放在硬盘上
      • 可以使用序列化、数据库等手段
      • 序列化
        • 将内存中的重要数据适时序列化到硬盘上,然后下次上电后反序列化回内存中
        • 效率低
      • 关系型数据库
        • 特点
          • 强大的理论基础 - 关系代数、关系演算
          • 支持大规模的数据存储和查询
          • 支持事务操作
          • 高度抽象的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
  • 相关阅读:
    vue-面试
    使用webpack4搭建一个基于Vue的组件库
    vue 仿今日头条
    如何正确的在项目中接入微信JS-SDK
    vuejs实现折叠面板展开收缩动画
    Vue的watch和computed属性
    Android Studio(十):添加assets目录
    Android Studio(九):引用jar及so文件
    Android Studio(八):Android Studio设置教程
    Android Studio(七):项目从Eclipse到Android Studio迁移
  • 原文地址:https://www.cnblogs.com/wyp1988/p/11936315.html
Copyright © 2020-2023  润新知