总结

在学习过程中学习很大,每天都是新的内容如果对前一天的内容没有很好的理解消化
第二天的内容学起来就很吃力,理论知识是重点但是敲代码更重要,如果不经常去敲代码
那很多知识点是无法理解并记住的对本周知识点做以下总结:

TCP方式来发送和接受数据

1)创建TCP协议这种方式的客户端的Socket对象
2)写数据--写给服务器
3)关闭资源

TCP服务器端

1)创建服务器端的Socket对象-->绑定端口
2)服务器端监听客户端连接-->获取到指定客户端的Socket对象
3)获取通道的内输入流-->读数据
4)关闭服务器端的Socket对象

客户端发送数据,服务器端接受数据,展示客户端发送的数据,并同时反馈客户端数据,客户端读取反馈的数据

TCP客户端不断的去发送消息,服务器端不断的去接受数据,展示数据(服务器端不关闭)

TCP和UDP的区别

1)是否建立连接通道
    TCP需要建立连接通道
    UDP不需要建立连接通道
2)是否是可靠连接
    TCP是可靠连接, --同步的 --执行效率低
    UDP是不可靠数据  --不同的--执行效率高
3)是否传输数据大小有限制
    TCP是无限制传输,以一种"字节流"的方式
    UDP有数据大小限制(理论64kb),以一种"数据报包"的方式

TCP客户端和服务器进行数据传输的代码实现

//客户端
//1)创建客户端的Socket
Socket s = new Socket("10.35.165.44",8888);
//2)获取通道内的字节输出流
OutputStream out = s.getOutpiutStream() ;
//3)写数据
out.wrrite("hello,TCP".getBytes()) ;
//4)释放资源
s.close() ;

//服务器端
//1)创建服务器端的Socket
ServerSocket ss = new ServerSocket(6666) ;
//2)监听客户端连接
Socket s = ss.accept() ;
//3)获取通道的字节输入流对象
INputStream in = s.getInputStream() ;
//4)一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int len = in.read(bytes) ;
String message = new String(bytes,0,len) ;
//获取ip
String ip = s.getInetAddress().getHostAddress() ;
//展示数据
System.out.println("date from-->"+ip+",内容是:"+message) ;
//释放资源
ss.close() ;

获取一个类的字节码文件对象的形式

三种方式
    1)object类的getClass()方法-->使用对象访问这个方法
    2)任意java类型的class属性
    3)calss-->字节码文件对象(类对象)
        public static Class forName(String classPathname) :参数是当前类或者接口的全限定名称
                                包类.类名

IO流的分类

BIO:阻塞式流
流的方向:
    输入/输出
类型:
    字节
        字节输入流
            InputStream
                FileInPutStream 文件字节输入流
                BufferedInputStream 字节缓冲输入流
                
                ObjectInputStream:反序列化
        字节输出流
            OutputStream
                FileOutputStream 文件字节输出流
                BufferedOutStream 字节缓冲输出流
                
                ObjetOutputStream:序列化
字符
    字符输入流
        Reader 
            InputStreamReader(InputStream in)-->将字节输入流转换成字符输出流
    字符输出流
        Writer
            OutputStreamWriter(OutputStream out)-->将文字输出流转换成字符输出流
        便捷类-->FileWriter
        BufferedWriter:字符缓冲输出流
        
        printWriter:字符打印流
NIO-->非阻塞式流-->
    dobbo框架(发现服务/治理服务)-->地产NIO方式

如何读取src下面的exx.properties文件的内容

class Demo{
    public static void main(String[] args){
        //arc下面--类路径下user.properties (xx.proprties配置文件)
            zhangsan=30
        //获取配置文件所造字节输入流
        InputStream in =
Demo.class.getClassLoader().getResourceAsStream("user.properties") ;
        //创建属性集合列表
        Properties prop = new Properties() ;
        //将配置文件的内容"以字节输入流"的方式加载到属性集合列表中
        prop.load(in) ;
    }
}

什么是单例设计模式,有哪两种,分别什么有特点

单例设计模式:
    始终在内存只有当前这个类或者接口的一个实例;
分为:
    饿汉式和懒汉式
    
饿汉式的特点(不会出现安全的单例模式)
    1)当前类具体类
    2)这个一加载,就创建当前类的静态实例(私有的)
    3)构造方法私有化--外界不能new
    4)对外提供静态的公共方法,返回值是当前类本身!
懒汉式的特点(可能出现线程安全问题的一种单例设计模式)
    1)当前类具体类
    2)当类的成员位置:声明私有的当前类的变量 (静态的) 
    3)构造私有化--外界不能new
    4)对外提供静态的公共方法,返回值是当前类本身
            需要对当前类的变量进行判断,如果为null, 才创建当前类实例
            返回当前类实例;
            
class Student{
    private static Student s ; 
    private Student(){}
    
    public synchronized static Student getInsance(){//静态的同步方法,解决线程安全问题!
        if(s==null){//需要用的时候才创建对象
            s = new Student() ;
        }
        return s ;
    }
}

什么是反射?

某一个类在运行状态中,可以动态的获取类的字节码文件同时创建当前类实例,可以调用成员方法,去动态去给成员变量进行赋值;--满足Java语言特点 "动态性"----->就可以在运行过程某个类或者接口的成员方法,来完成一种
"动态代理"
        jdk动态代理--->前提必须有接口
        cglib动态代理

如何获取一个类的构造器并去创建对象?

//1)获取这个类的字节码文件对象
Class c = Class.forName("类的完全限定名称-就是包名.类名") ;
//2)获取私有的构造方法所在的Constructor类对象---带有两个参数:String和int类型
Constructor con = c.getDeclaredConstructor(String.class,int.class) ;
//3)防止出现非法访问异常--->取消Java语言访问检查
con.setAccessiable(true) ;
//4)创建当前类实例:使用Constructor类对象
Object obj = con.newInstance("高圆圆",44) ;

数据库定义语句DDL之创建库/删除库/修改库字符集/查询库字符集语法

/*
    多行注释
*/
-- 单行注释
# 特殊注释

-- 创建库
create database 库名; 
create database if not exists 库名;

-- 删除库
drop database 库名;
drop database if exists 库名;
-- 查询库的字符集
show create database 库名;
-- 修改库的字符集
alter database 库名 (default) character 字符集格式;
-- 查询msyql服务器中已知存在的所有的库
show databases ;
-- 使用哪一个库
use 库名;
-- mysql自带的函数--查询正在使用的库的名称
select database() ;

创建表/删除表/修改表相关语法/删除表

-- 创建表
create table 表名(
    字段名称1 字段类型1,
    字段名称2 字段类型2,
    字段名称3 字段类型3,
    ...
    字段名称n 字段类型n
);
-- 删除表
drop table 表名;
drop table if exists 表名;
-- 修改表的字段
alter table 表名 change 字段名称 新的字段名称 以前的字段类型;
-- 修改表的字段类型 modify
alter table 表名 modify 字段名称 新的字段类型;
-- 修改表:添加新的字段
alter table 表名 add 字段名称 字段类型;
-- 修改表:删除某一列(字段)
alter table 表名 drop 字段名称;
-- 查询表的结构
desc 表名;
-- 查询指定库的所有表
show tables ;
-- 复制表
create table 新表名 like 旧表名;

线程的创建方式

1)继承关系
    a)自定一个类继承自Thread
    b)重写run方法
    c)在用户线程中创建当前类对象(设置线程名称),启动线程
2)实现Runnable接口
    a)自定义一个类实现Runnable接口
    b)重写run
    c)在用户线程main创建Runnable接口实现类对象(资源类),创建Thread类对象,将资源类对象作为参数传递,启动线程
3)线程池
    ExecutorService pool = Executors.newFixedThreadPool(几条线程) ;--->创建固定可重用的线程数的线程池
    //提交异步任务
    要么pool.submit(Runnable接口对象) ;--->计算异步的结果---Future
    要么pool.submit(Callable接口对象) ;---->Future
    
    关闭线程池
    pool.shutdown() ;

delete from表名和truncate table表名的区别?

共同点:
    两个都是将整个表的所有记录数全部删除
不同点:
1)是否会删除表
    delete from表名 ;仅仅是将表的所有记录数删除,不会删除这张表
    truncate table表名;会将表直接删除(所有数据清空)
2)是否会影响自增主键id值
    detele from表名,由于不会删除表,表的结构还在,只是表的数据清了,再次去插入数据,会在上次的基础上id继续自增
    truncate table表名,由于删除表,自动一张一模一样的空表,将之前的结构就删除了,直接影响了自增长主键id的值;

DQL语句中的聚合函数列举

-- 查询某列最大的值
select max(字段名称) from 表名; 
-- 查询某列的平均分
select avg(字段名称) from 表名;
-- 某列的总数:求和
select sum(字段名称) from 表名;
-- 统计表的总记录数(总条数)
select count(非业务字段) from 表明;

关于数据库的备份和还原

备份和还原
    图形界面化方式备份 和还原(简单易于上手)
    命令行的备份和还原(记住一些指令)
    
    DBA(数据库管理员)设计完数据库,对库中的所有的数据以及结构进行备份;
    防止数据库的信息丢失等等
    数据库还原:就是将备份库 加载已知存在的库中(使用备份好.sql脚本文件,执行这个sql脚本)
    备份和还原:
        1)命令行方式的备份(dos管理员的身份运行)
            mysqldump -uroot -p输入密码 库名称>指定磁盘路径"d:\\mysql_dump\\xx.sql文件"
        1)命令行方式的还原:
            1.1)dos登录mysql,将之前的库删除
            1.2)新建一个新的库,使用库
            1.3)source 执行本地或者远程路径上的.sql文件
        2)使用图形界面化工具去备份
            如何的图形界面化工具都是一样的'
            备份:
                在已知的库上右键->backup-->backup SQL备份到本地磁盘上的sql脚本
            还原:删除已知库,新建库,使用库,在图形界面化工具右键-->选择执行 execute SQL script 本地sql文件

数据库的约束(约束用户操作库中的某张表的行为)

每一张表的id,不重复(唯一),非空,设置自增长

约束:限制用户操作数据库的行为
举例:插入数据的时候,直接插入null值
通过约束将上面的用户插入非法数据的行为进行限制!
默认约束:default