java网络/JBDC编程/数据/设计模式


所有内容为对“廖雪峰官网java教程”的整理

网络编程

  • 基础:
    OSITCP/IP
    应用层应用层
    表示层
    会话层
    传输层传输层
    网络层IP层
    链路层网络接口层
    物理层
  • 协议:
    • IP协议是一个分组交换,它不保证可靠传输。而TCP协议是传输控制协议,它是面向连接的协议,支持可靠传输和双向通信。TCP协议是建立在IP协议之上的,简单地说,IP协议只负责发数据包,不保证顺序和正确性,而TCP协议负责控制数据包传输,它在传输数据之前需要先建立连接,建立连接后才能传输数据,传输完后还需要断开连接。TCP协议之所以能保证数据的可靠传输,是通过接收确认、超时重传这些机制实现的。并且,TCP协议允许双向通信,即通信双方可以同时发送和接收数据。
    • TCP协议也是应用最广泛的协议,许多高级协议都是建立在TCP协议之上的,例如HTTP、SMTP等。
    • UDP协议(User Datagram Protocol)是一种数据报文协议,它是无连接协议,不保证可靠传输。因为UDP协议在通信前不需要建立连接,因此它的传输效率比TCP高,而且UDP协议比TCP协议要简单得多。
    • 选择UDP协议时,传输的数据通常是能容忍丢失的,例如,一些语音视频通信的应用会选择UDP协议。
  • TCP编程:
    使用Java进行TCP编程时,需要使用Socket模型:
    服务器端用ServerSocket监听指定端口;
    客户端使用Socket(InetAddress, port)连接服务器;
    服务器端用accept()接收连接并返回Socket;
    双方通过Socket打开InputStream/OutputStream读写数据;
    服务器端通常使用多线程同时处理多个客户端连接,利用线程池可大幅提升效率;
    flush()用于强制输出缓冲区到网络。
  • UDP编程
  • 发送接收e-mail
  • HTTP编程:
    • Java提供了HttpClient作为新的HTTP客户端编程接口用于取代老的HttpURLConnection接口;
    • HttpClient使用链式调用并通过内置的BodyPublishers和BodyHandlers来更方便地处理数据。
  • RMI远程调用:
    • Java的RMI远程调用是指,一个JVM中的代码可以通过网络实现远程调用另一个JVM的某个方法。RMI是Remote Method Invocation的缩写。
    • Java的RMI严重依赖序列化和反序列化,而这种情况下可能会造成严重的安全漏洞,因为Java的序列化和反序列化不但涉及到数据,还涉及到二进制的字节码,即使使用白名单机制也很难保证100%排除恶意构造的字节码。因此,使用RMI时,双方必须是内网互相信任的机器,不要把1099端口暴露在公网上作为对外服务。
  • PRC/gRPC:RPC/gRPC原理

XML与JSON

  • XML简介:XML是一个技术体系,除了我们经常用到的XML文档本身外,XML还支持:
    • DTD和XSD:验证XML结构和数据是否有效;
      Namespace:XML节点和属性的名字空间;
      XSLT:把XML转化为另一种文本;
      XPath:一种XML节点查询语言;
    • XML使用嵌套结构的数据表示方式,支持格式验证;XML常用于配置文件、网络消息传输等。
  • 使用DOM:xml两种解析api,DOM:一次性读取XML,并在内存中表示为树形结构;SAX:以流的形式读取XML,使用事件回调。
    • Java提供的DOM API可以将XML解析为DOM结构,以Document对象表示;
    • DOM可在内存中完整表示XML数据结构;
    • DOM解析速度慢,内存占用大。
  • 使用XML:解析XML的方式是SAX。SAX是Simple API for XML的缩写,它是一种基于流的解析方式,边读取XML边解析,并以事件回调的方式让调用者获取数据。因为是一边读一边解析,所以无论XML有多大,占用的内存都很小。
  • 使用Jackson:幸运的是,一个名叫Jackson的开源的第三方库可以轻松做到XML到JavaBean的转换。我们要使用Jackson
  • 使用json:JSON是JavaScript Object Notation的缩写,它去除了所有JavaScript执行代码,只保留JavaScript的对象格式。
    • JSON是轻量级的数据表示方式,常用于Web应用;
    • Jackson可以实现JavaBean和JSON之间的转换;
    • 可以通过Module扩展Jackson能处理的数据类型;
    • 可以自定义JsonSerializer和JsonDeserializer来定制序列化和反序列化。

JBDC编程

    JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。
    使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。

  • 益处:
    • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发;
    • Java程序编译期仅依赖java.sql包,不依赖具体数据库的jar包;
    • 可随时替换底层数据库,访问数据库的Java代码基本不变。
  • 需掌握:
    • DDL(data definition language)数据定义语言
    • DML(data manipulation language) 数据操纵语言(SELECT、UPDATE、INSERT、DELETE)
    • DCL(Data Control Language)数据控制语言:来设置或者更改数据库用户角色权限等的语句,例如:grant、revoke语句。
  • jbdc查询:
    SQL数据类型Java数据类型
    BIT, BOOLboolean
    INTEGERint
    BIGINTlong
    REALfloat
    FLOAT, DOUBLEdouble
    CHAR, VARCHARString
    DECIMALBigDecimal
    DATEjava.sql.Date, LocalDate
    TIMEjava.sql.Time, LocalTime
    • JDBC接口的Connection代表一个JDBC连接;
    • 使用JDBC查询时,总是使用PreparedStatement进行查询而不是Statement;
    • 查询结果总是ResultSet,即使使用聚合查询也不例外。
  • crud:数据库操作总结起来就四个字:增删改查,行话叫CRUD:Create,Retrieve,Update和Delete。
  • JBDC事务:事务:数据库事务(Transaction)是由若干个SQL语句构成的一个操作序列,有点类似于Java的synchronized同步。数据库系统保证在一个事务中的所有SQL要么全部执行成功,要么全部不执行,即数据库事务具有ACID特性:Atomicity:原子性、Consistency:一致性、Isolation:隔离性、Durability:持久性。
    • 典型案例:
      事务典型案例,面试时可能会考
  • JBDC Batch:通过一个循环来执行每个PreparedStatement虽然可行,但是性能很低。SQL数据库对SQL语句相同,但只有参数不同的若干语句可以作为batch执行,即批量执行,这种操作有特别优化,速度远远快于循环执行每个SQL。
    • 在JDBC代码中,我们可以利用SQL数据库的这一特性,把同一个SQL但参数不同的若干次操作合并为一个batch执行。
  • JDBC连接池:类似的,在执行JDBC的增删改查的操作时,如果每一次操作都来一次打开连接,操作,关闭连接,那么创建和销毁JDBC连接的开销就太大了。为了避免频繁地创建和销毁JDBC连接,我们可以通过连接池(Connection Pool)复用已经创建好的连接。
    • 通过连接池获取连接时,并不需要指定JDBC的相关URL、用户名、口令等信息,因为这些信息已经存储在连接池内部了(创建HikariDataSource时传入的HikariConfig持有这些信息)。一开始,连接池内部并没有连接,所以,第一次调用ds.getConnection(),会迫使连接池内部先创建一个Connection,再返回给客户端使用。当我们调用conn.close()方法时(在try(resource){…}结束处),不是真正“关闭”连接,而是释放到连接池中,以便下次获取连接时能直接返回。
    • 因此,连接池内部维护了若干个Connection实例,如果调用ds.getConnection(),就选择一个空闲连接,并标记它为“正在使用”然后返回,如果对Connection调用close(),那么就把连接再次标记为“空闲”从而等待下次调用。这样一来,我们就通过连接池维护了少量连接,但可以频繁地执行大量的SQL语句。

函数式编程

  • Lamda表达式:函数式编程(Functional Programming)是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。历史上研究函数式编程的理论是Lambda演算,所以我们经常把支持函数式编程的编码风格称为Lambda表达式。
    • 表达式: (s1, s2) -> s1.compareTo(s2)
    • FunctionalInterface:只定义了单方法的接口称之为FunctionalInterface,用注解@FunctionalInterface标记。
    • Lambda表达式的参数和返回值均可由编译器自动推断。
  • 方法引用:所谓方法引用,是指如果某个方法签名和接口恰好一致,就可以直接传入方法引用。Arrays.sort(array, Main::cmp);

    stream:

    • 定义、特点:Stream和List也不一样,List存储的每个元素都是已经存储在内存中的某个Java对象,而Stream输出的元素可能并没有预先存储在内存中,而是实时计算出来的。    Stream API提供了一套新的流式处理的抽象序列;Stream API支持函数式编程和链式操作;Stream可以表示无限序列,并且大多数情况下是惰性求值的。
    • 创建、map、filter、reduce(聚合)、输出集合、其他操作

设计模式

设计模式,即Design Patterns,是指在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。遵循开闭原则(由Bertrand Meyer提出的开闭原则(Open Closed Principle)是指,软件应该对扩展开放,而对修改关闭。这里的意思是在增加新功能的时候,能不改代码就尽量不要改,如果只增加代码就完成了新功能,那是最好的。)和里氏替换原则(里氏替换原则是Barbara Liskov提出的,这是一种面向对象的设计原则,即如果我们调用一个父类的方法可以成功,那么替换成子类调用也应该完全可以运行)。

  • 创建型模式:创建型模式关注点是如何创建对象,其核心思想是要把对象的创建和使用相分离,这样使得两者能相对独立地变换。
    • 创建工厂:
      • 如果调用方直接使用Integer n = new Integer(100),那么就失去了使用缓存优化的可能性。
      • 总是引用接口而非实现类,能允许变换子类而不影响调用方,即尽可能面向抽象编程。也就是说,里氏替换原则:返回实现接口的任意子类都可以满足该方法的要求,且不影响调用方。
      • 工厂方法是指定义工厂接口和产品接口,但如何创建实际工厂和实际产品被推迟到子类实现,从而使调用方只和抽象工厂与抽象产品打交道。
      • 实际更常用的是更简单的静态工厂方法,它允许工厂内部对创建产品进行优化。
      • 调用方尽量持有接口或抽象类,避免持有具体类型的子类,以便工厂方法能随时切换不同的子类返回,却不影响调用方代码。
    • 抽象工厂:
      • 抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;
      • 抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。
    • 生成器Builder:Builder模式是为了创建一个复杂的对象,需要多个步骤完成创建,或者需要多个零件组装的场景,且创建过程中可以灵活调用不同的步骤或组件。
    • 原型:原型模式,即Prototype,是指创建新对象的时候,根据现有的一个原型来创建。
    • 单例:Singleton模式是为了保证一个程序的运行期间,某个类有且只有一个全局唯一实例;Singleton模式既可以严格实现,也可以以约定的方式把普通类视作单例。
  • 结构型模式
    结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过组合与运行期的动态组合来实现更灵活的功能。
    • 适配器:
      • Adapter模式可以将一个A接口转换为B接口,使得新的对象符合B接口规范。
      • 编写Adapter实际上就是编写一个实现了B接口,并且内部持有A接口的类
    • 桥接:桥接模式通过分离一个抽象接口和它的实现部分,使得设计可以按两个维度独立扩展。
    • 组合:Composite模式使得叶子对象和容器对象具有一致性,从而形成统一的树形结构,并用一致的方式去处理它们。类似的,像文件夹和文件、GUI窗口的各种组件,都符合Composite模式的定义,因为它们的结构天生就是层级结构。
    • 装饰器:Decorator模式的目的就是把一个一个的附加功能,用Decorator的方式给一层一层地累加到原始数据源上,最终,通过组合获得我们想要的功能。
    • 外观Facade:如果客户端要跟许多子系统打交道,那么客户端需要了解各个子系统的接口,比较麻烦。如果有一个统一的“中介”,让客户端只跟中介打交道,中介再去跟各个子系统打交道,对客户端来说就比较简单。所以Facade就相当于搞了一个中介。
      • 更复杂的Web程序,会有多个Web服务,这个时候,经常会使用一个统一的网关入口来自动转发到不同的Web服务,这种提供统一入口的网关就是Gateway,它本质上也是一个Facade,但可以附加一些用户认证、限流限速的额外服务。
    • 享元(共享):享元(Flyweight)的核心思想很简单:如果一个对象实例一经创建就不可变,那么反复创建相同的实例就没有必要,直接向调用方返回一个共享的实例就行,这样即节省内存,又可以减少创建对象的过程,提高运行速度。
    • 代理:
      • 权限检查
      • 代理模式通过封装一个已有接口,并向调用方返回相同的接口类型,能让调用方在不改变任何代码的前提下增强某些功能(例如,鉴权、延迟加载、连接池复用等)。
      • 远程代理(Java内置的RMI机制)、虚代理(JDBC连接池)、保护代理、智能引用
  • 行为型模型:行为型模式主要涉及算法和对象间的职责分配。通过使用对象组合,行为型模式可以描述一组对象应该如何协作来完成一个整体任务。
    • 责任链
    • 命令:将一组对象封装为命令
    • 解释器:
    • 迭代器:
    • 中介:用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
    • 备忘录:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
    • 观察者:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
    • 状态:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
    • 策略:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
    • 模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
    • 访问者:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古剑诛仙

你的鼓励是我创造的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值