第六周总结

本文详细介绍了TCP的三次握手过程以及客户端和服务器端的交互。接着,讨论了Java中的序列化和反序列化,用于对象与数据流之间的转换。此外,还阐述了Java反射机制,包括获取类信息、构造方法、字段和方法的使用。接着,对比了静态代理和动态代理的区别和应用场景。最后,提到了数据库的基本操作,如创建、查询、更新和删除数据,以及数据库的约束和分组查询等概念。
摘要由CSDN通过智能技术生成

TCP方式发送数据:

客户端:

创建TCP协议这种方式的客户端的socket对象。

写出给服务器端

关闭资源

服务器端:

创建服务器端的Socker对象

通过accept方法获取到客户端的Socket,监听客户端链接

读取通道的内输入流

关闭服务器端Socket对象(一般服务器端不关闭)。

三次握手:可以防止因为延迟等原因导致的已失效的连接请求报文段突然又传送到了服务端,因而产生错误。也可以节省服务器资源

首先客户端会给服务器端发送一个握手信号SYN: Synchronize Sequence Numbers (同步序列编号)。

服务器端接受到之后向客户端发送SYN+ACK信号 ACK是应答机制:Acknowledge character。表示数据已经准确接受无误。

客户端收到服务器的信号之后会再次回复一个SYN+ACK信号,服务器收到后从此刻开始建立通信。

序列化:使用ObjectOutputStream将一个Java对象的信息写入流中.

对象转为数据流: 构造方法:    public ObjectOutputStream(OutputStream out)

成员方法:public final void writeObject(Object obj) :将指定的对象写入到序列化流中,变成流数据

反序列化:就是使用ObjectInputStream 将数据流中的内容--->还原成--->对象。

构造方法:public ObjectInputStream(InputStream in)

成员方法:public final Object readObject():从反序列流中将数据流的内容----解析成对象

反射:

在运行状态中,对任意一个类,都能知道这个类的所有属性和方法,对任意一个对象,都能 调用它的任意一个方法和属性。这种能动态获取信息及动态调用对象方法的功能称为 java 语言的反射机制。

反射的作用:开发过程中,经常会遇到某个类的某个成员变量、方法或属性是私有的,或只对系统应用开放,这里就可以利用 java 的反射机制通过反射来获取所需的私有成员或是方法。

使用反射首先需要获取到这个类的字节码文件。

三种方式:

调用getclass方法可以获取到

任意Java类型的class属性。

Class类中的forname方法(推荐)。

获取构造方法:

public Constructor<?>[] getConstructors()throws SecurityException 获取所有的公有的构造方法

public Constructor<?>[] getDeclaredConstructors() throws SecurityException 获取所有的构造方法

public Constructor<?>[] getConstructor(参数数组)throws SecurityException throws NoSuchMethodException, SecurityException 获取公有的构造方法

public Constructor<?>[] getDeclaredConstructor(参数数组)throws SecurityException throws NoSuchMethodException, SecurityException 获取指定的构造方法。

参数数组是.class 比如String类型那么就是String.class

获取类的字段:

public Field[] getFields():获取所有的公共字段(成员变量)

public Field[] getDeclaredFields():获取"这个类"所有的字段所在的Field类对象,公共的/默认的/私有的/受保护的

public Field getField(String name) throws NoSuchFieldException, SecurityException

public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException

name是字段名称。

接受到获取到的字段之后可以使用.set(obj,<?>)方法对其赋值,obj是这个类的实例

获取类中的方法:

public 方法[] getMethods() throws SecurityException 获取公有方法。

public 方法[] getDeclaredMethods() throws SecurityException 获取全部的方法

public 方法 getMethod(String name, <?>... parameterTypes) throws NoSuchMethodException, SecurityException 获取公有的方法

public 方法 getDeclaredMethod(String name, <?>... parameterTypes) throws NoSuchMethodException, SecurityException 获取指定方法。 

name:方法名称

parameterTypes:参数数值

获取方法之后可以用invoke方法进行调用方法,需要传入类的对象和需要的参数。

取消Java访问检查。

public void setAccessible(boolean flag) :参数为true:取消Java语言访问检查        

静态代理和动态代理的区别:

代理是一种常用的设计模式,目的是:为其他对象提供一个代理以控制对某个对象的访问, 将两个类的关系解耦。代理类和委托类都要实现相同的接口,因为代理真正调用的是委托类 的方法。

区别: 静态代理:由程序员创建或是由特定工具生成,在代码编译时就确定了被代理的类是哪 一 个是静态代理。静态代理通常只代理一个类;

动态代理:在代码运行期间,运用反射机制动态创建生成。动态代理代理的是一个接口 下 的多个实现类;

实现步骤:

实现 InvocationHandler 接口创建自己的调用处理器;

给 Proxy 类提供 ClassLoader 和代理接口类型数组创建动态代理类;

利用反射机制得到动态代理类的构造函数;

利用动态代理类的构造函数创建动态代理类对象;

使用场景:Retrofit 中直接调用接口的方法;Spring 的 AOP 机制;

静态代理和动态代理,它们都是代理模莫式的一种应用,静态代理指的是在程序运行前已经编译

好,程序知道由谁来执行代理方法。 而动态代理只有在程序运行期间才能确定,相比于静态代

理,动态代理的优势在于可以很方便的 对代理类的函数进行统一的处理,而不用修改每个代理类

中的方法。可以说动态代理是基于反射实现的。通过反射我们可以直接操作类或者对象,比如获取

类的定义,获取声明的属性和方法,调用方 法,在运行时可以修改类的定义。 动态代理是一种在

运行时构建代理、动态处理方法调用的机制。动态代理的实现方式有很多, Java 提供的代理被称

为 JDK 动态代理,JDK 动态代理是基于类的继承。

数据库:

show databases 查询所有数据库。

create database 数据库名 创建数据库

create database if not exists 库名 判断是否存在这个库,如果不存在创建。

show create database 库名 查看库的字符集编码格式

alter database 库名 (default) character set 字符集格式 修改这个库的字符集格式

drop database 库名 删除这个库

drop database if exists 库名; 判断存在库名,直接删除

use database 使用库

select database()查询正在使用的库

create table 表名(字段名称 字段类型,字段名称 字段类型,字段名称n 字段类型n);创建表

show tables 查询库中所有的表

desc 表名:查询这个表的结构

alter table 表名 change 以前的字段名称 现在的新字段名称 以前的字段类型 修改表的字段名称

alter table 表名 modify 字段名称 对应的新的字段类型 修改表的字段类型

alter table 表名 add 字段名称 字段类型 给表中添加一个新的字段名称

alter table 表名 drop 字段名称 将表中的字段名称删除

create table 新的表名 like 旧表名 复制一张一摸一样的表。

drop table 表名 删除表

drop table if exists 表名,如果存在这个表,那么删除它。

增:

Insert into 表名 values (值1,值2,....值n),(值1,值2,....值n),.....; 在表中插入数据

insert into 表名 (字段1,字段2,.......字段n) values(值1,值2,.....值n),(值1,值2,....值n).......; 在表中插入对应字段的值。

删:

delete from 表名 删除这张表的所有数据,但是结构依然存在

delete from 表名 where 字段名称= 值 ; 
delete from 表名 where 字段名称= 值1 and  字段名称2 = 值2 ;  根据条件进行删除


delete from 表名和truncate table 表名的区别?
    
    共同点:
        delete from 表名和truncate table 表名都是删除全表的数据
    不同点:
        delete from 表名:仅仅只是删除表的记录,表的结构还在(约束相关的信息也就在)
        不影响自增主键id的值,下一次插入数据之后,id值在上一次基础上继续自增!
        truncate table 表名:不仅仅删除全表的记录,
        会将表删除(表的结构都存在了),会自己创建一张结构一一的空表
        直接影响自增长主键id 的值;

改:

update 表名 set 字段名称 = 值 将表中的一列改为某个值

update 表名 set 字段名称 = 值 where 非业务字段 = 值 根据条件进行修改

查:

select * from 表名 查询某个表  在开发中不可以使用*,必须写上所有的字段名称 

select 字段名称1,字段名称2,部分字段名称或者指定所有字段名称 from 表名 查询对应的字段名称的数据

select 字段名称1 as 别名1,字段名称2 as 别名2...from 表名; (as可以省略不写) 查询时给字段名称起别名

select distinct 字段名称 from 表名 查询某张表某个字段的值,并且对重复值进行过滤

某些字段如果有空值。如果进行运算时,因为数据库中运算遇见null值也会变成null,所以可以使用IFNULL函数

IFNULL(字段名称,预期值) 如果这个字段上有控制,那么给一个预期值,比如给一个0;

条件查询 

where 条件

赋值运算符    
比较运算符:<,><=,>=,!=,<>,BETWEEN 值1 AND 值2 
逻辑运算符:&& ||  and  or  

聚合函数:

count (字段名称) 统计总记录数

max(字段名称) 最大值

min(字段名称) 最小值

avg(字段名称) 平均值

sum(字段名称) 求和

使用方法:select 需要一并显示的字段名称,..,聚合函数(字段名称) from 表名 

模糊查询 select 字段列表 from 表名 where 字段名称 like '%关键字%'

关键字中 %代表任意字符 _代表一个字符

SHOW VARIABLES LIKE '%character%'  查询全局的字符集的命令

select 字段名 from 表名 where 字段名 in(值,值....);代表多个or查询。

select 字段名 from 表名 where 某个字段名 is null; 查询指定的字段是null值的信息

select 字段名 from 表名 where 某个字段名 is  not null; 查询指定的字段不是null值的信息

排序查询:

select 字段名 from 表名 order by 字段名称 排序规则 对字段名进行排序

排序规则 默认是升序,asc .desc是降序。如果不标注排序规则那么默认升序。

如果需要加入条件那么where需要在order by的前面。

group by 分组查询

group by 后面跟分组字段,在select的时候-查询分组字段
聚合函数在group by的后面不能使用

select 字段名 from 表名 group by 字段名称 分组基本查询

select 字段名 from 表名 group by 字段名 where 判断条件。

先满足条件,然后再执行group by 分组。

筛选 having 

select 字段名 聚合函数 from 表名 where 条件 group by 字段名 having 条件。

列子:查询(分组信息/数学平均分/人数大于2的) 学生的数学成绩大于70分的参与分组(按照性别分组)同时,筛选出某组人数大于2的一组。

select

sex '性别', -- 查询分组字段
  AVG(math) '数学平均分',
  COUNT(id) '总人数'  -- 查询满足筛选条件的信息
FROM
  student3 
WHERE math > 70 
GROUP BY sex 
HAVING 
COUNT(id)> 2 ;

分页查询

select 字段列表 from  表名 limit 起始行数,每页显示的条数;

起始行数:从0开始 --- = (当前页码数-1)*每页显示的条数;

实际开发中:页码数currentPage/每页显示的条数pageSize (必须已知数据:前端传来的)

数据库的备份和还原:

mysqldump -uroot -p 输入密码 库名称>指定路径。

命令行方式的还原:
dos登录mysql,将之前的库删除
新建一个新的库,使用库
执行本地或者远程路径上的.sql文件 (加载指定的sql脚本文件)

约束:

default 默认约束

创建表的时候可以加入默认约束,如果用户输入的是null,无意义的值,那么可以给定默认约束设置好的值

create table 表名(

字段名 字段类型,

字段名 字段类型 default 值

);

默认约束仅对用户不插入这个字段的值的时候起效,如果用户给这个字段复制null,那么默认约束不发挥作用。

非空约束not null

create table 表名(

字段名 字段类型 not null,

字段名 字段类型 not null

);

给定非空约束后如果用户不对这个字段给值或者给定值为null,会报错。

删除字段的非空约束:

alter table 表名 modify 字段名 字段类型;

添加字段的非空约束

alter table 表名 modify 字段名 以前的字段类型 not null;

唯一约束 unique

create table 表名(

字段名 字段类型 unique,

字段名 字段类型 

);

alter table 表名 drop index 字段名 删除唯一约束。

alter table 表名 add constraint(声明) 唯一约束索引的名称  unique(给哪个字段名称) 给字段增加唯一约束。

primary key 主键约束

主键非空且唯一。一般搭配自增来使用 auto_increment

删除主键

alter table 表名 drop primaty key 这个删除主键只是将唯一这个特性移除掉,但是非空依然存在。

alter table 表名 modify 字段名 字段类型 primaty key 增加主键属性。

foreign key 外键约束

外键约束是为了解决字段冗余。

需要创建两个表,然后通过外键让这两个表之间产生联系。

create table 主表表名(

字段名 字段类型 ,

被依赖字段名 字段类型 

);

create table 从表表名(

字段名 字段类型 ,

依赖于主表的字段名 字段类型 

constraint

主表名_从表名_fk(定义名称。)

foreign key (从表依赖于主表的字段)

references

主表名(被依赖的字段名)

);

如果有了外键约束的情况下。如果直接操作主表会出现错误,因为从表的数据与主表存在关联。

删除表,先删从表,再删除主表

创建表,先创建主标,再创建从表

删除数据,先删除从表,在删除主表

插入数据,先插入主表,再插入子表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值