目录
网络
网络通信
ip地址
域名
网络通信协议
TCP和UDP
InetAddress类
Socket
Tcp编程
当客户端连接到服务端后,实际上客户端也是通过一个端口和服务端进行通讯的,这个端口是TCP/IP来分配的,是不确定的,随机的。
// 客户端 , 上传字节流
public class testClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(Inet4Address.getLocalHost(), 9999);
System.out.println("客户端 socket返回="+socket.getClass());
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello,server".getBytes());
outputStream.close();
socket.close();
System.out.println("客户端退出......");
}
}
// 服务器端, 接受字节流
public class testServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端 在9999端口监听,等待连接......");
Socket socket = serverSocket.accept();
System.out.println("服务端 socket = "+socket.getClass());
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int readLen = 0;
while((readLen = inputStream.read(buf)) != -1){
System.out.println(new String(buf,0,readLen));
}
inputStream.close();
socket.close();
serverSocket.close();
System.out.println("客户端退出...");
}
}
// 客户端上传字符流,并接受服务端发送的字符流
public class testClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(Inet4Address.getLocalHost(), 9999);
System.out.println("客户端 socket返回="+socket.getClass());
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello,server".getBytes());
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello , server ,字符流");
bufferedWriter.newLine();
bufferedWriter.flush();
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
bufferedWriter.close();
bufferedReader.close();
socket.close();
System.out.println("客户端退出......");
}
}
// 服务端接受客户端的字符流,并且向客户端发送字符流
public class testServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端 在9999端口监听,等待连接......");
Socket socket = serverSocket.accept();
System.out.println("服务端 socket = "+socket.getClass());
InputStream inputStream = socket.getInputStream();
// 输入字符流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello,client".getBytes());
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello , client , 字符流");
bufferedWriter.newLine();
bufferedWriter.flush();
socket.shutdownOutput();
bufferedWriter.close();
bufferedReader.close();
socket.close();
serverSocket.close();
System.out.println("服务端退出...");
}
}
netstat指令
UDP网络编程(了解)
// UDP通讯编程
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9999);// 准备在9999端口接受数据
// 构建一个 DatagramPacket 对象,准备接受数据
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf,buf.length);
datagramSocket.receive(datagramPacket);
int length = datagramPacket.getLength();
byte[] data = datagramPacket.getData();
String s = new String(data, 0, length);
System.out.println(s);
data = "hello,client!".getBytes();
datagramPacket = new DatagramPacket(data, data.length,
InetAddress.getByName("192.168.0.141"), 9900);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
// UDP通讯编程
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9900);// 准备在9900接口接受数据
byte[] bytes = "hello , serve!".getBytes();
DatagramPacket datagramPacket =
new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("192.168.0.141"), 9999);
datagramSocket.send(datagramPacket);
byte[] byteSend = new byte[1024];
datagramPacket = new DatagramPacket(byteSend,byteSend.length);
datagramSocket.receive(datagramPacket);
int length = datagramPacket.getLength();
byteSend = datagramPacket.getData();
String s = new String(byteSend,0,length);
System.out.println(s);
datagramSocket.close();
}
反射
反射机制
反射相关的主要类
反射的优缺点
反射调用优化
Class类
Class类的常用方法
获取Class对象
有Class对象的类型
类加载
类加载三阶段
类加载各阶段完成任务
加载阶段
连接阶段-验证
连接阶段-准备
连接阶段-解析
初始化阶段
通过反射获取类的结构信息
通过反射创建对象
爆破:使用反射可以访问private构造器/属性/方法。
通过反射访问类中的成员
MySQL数据库
在cmd管理员模式下:
1.启动数据库:net start mysql
2.停止数据库:net stop mysql
3.进入mysql管理终端:mysql -u root -p (-u:代表用户。-p代表密码。当前root用户密码为空)
4.修改密码:
(1)use mysql; (这里分号必须有)
(2)update user set authentication_string=password('111')where user='root' and Host='localhost'; (这里分号也必须要有)
(3)flush privileges; (刷新权限,分号也必须要有)
5.删除安装好的mysql服务:sc delete mysql(慎用)
连接到数据库
数据库三层结构
数据在数据库中的表示形式
SQL语句分类
创建数据库
创建数据库、表的时候,为了规避关键字,可以使用反引号解决
例如:创建名称叫DROP的数据表
CREATE DATABASE 'DROP';
查看、删除数据库
备份恢复数据库
恢复数据库:也可以复制数据库的内容,复制到SQLyog新查询编辑器。然后全选运行。
创建表
注意:这里的 ` ` :代表的是英文半角模式下左上角波浪键。不是单引号。
Mysql常用的数据类型(列类型)
列类型-整形
数值型(bit)
数值型
字符串
字符串类型使用细节
日期类型
表的修改、创建、删除操作
数据库的CRUD语句
Insert语句
Insert语句使用细节
Update语句
Update语句使用细节
Delete语句
Delete使用细节
Select语句(重要)
合计/统计函数
count函数
sum函数
sum函数仅对数值起作用。对多列求和“,”不能少。
avg函数
max和min函数
group by函数
字符串函数
数学函数
时间日期相关函数
在mysql中,日期类型可以直接比较。但是需要注意格式。
例如:'2023-11-06' > '1998-01-01'
加密函数
流程控制函数
判断是否为空用 ‘is‘例如:colm is null
select查询加强
where语句
order by子句
分页查询
分组函数和分组子句
数据分组的使用顺序(多子句查询)
多表查询(重点)
多表查询是指基于两个和两个以上的表查询。
多表查询--自链接
自连接是指在同一张表的连接查询(将同一张表看做两张表)。
子查询
mysql中判断是否相等用“=”。判断不相等用“!=”或者“<>”。
all和any操作符
多列子查询
表复制
合并查询
外连接
mysql约束
primary key(主键)
主键使用细节:
主键不能重复且不能为null。
一张表只能有一个主键,但可以是复合主键。
主键的指定方式:
使用“DESC 表名”可以查看主键。
not null(非空)和unique(唯一)
foreign key(外键)
外键使用细节
check
自增长
自增长的使用细节
索引
索引机制
索引的类型
索引的使用
使用索引的规则
mysql事务
事务细节
事务隔离级别
事务的ACID特性
表类型和存储引擎
主要的存储类型、表类型特点
视图(view)
视图的使用
视图细节
视图最佳实践
MySQL管理
mysql用户管理
MySQL中的权限
给用户授权
MySQL管理细节
JDBC
JDBC基本介绍
JDBC原理示意图
JDBC概述
JDBC程序编写步骤
JDBC5种连接方式
方式1:直接使用com.mysql.jdbc.Driver()。属于静态加载,灵活性差,依赖强。
方式2:
方式3:
方式4:(推荐使用)
方式5:(添加配置文件,让连接mysql更加灵活)
ResultSet(结果集)
Statement
SQL注入
因为1 = 1恒成立。所以数据库就被注入了。
预处理
PreparedStatement
预处理的优点
预处理DML
JDBC API
JDBC工具类
在jdbc操作中,获取连接和释放资源是经常使用到的,可以将其封装JDBC连接的工具类JDBCUtils(JDBC工具类)。
事务
批处理
数据库连接池
C3P0l连接池
方式一:
方式二:使用配置文件模板来完成
c3p0.config.xml内容
Druid(德鲁伊)连接池
配置文件druid.properties
使用方法
Apache----DBUtils
BasicDao
正则表达式(RegExp)
正则表达式是对字符串执行模型匹配的技术。
正则表达式基本介绍
正则表达式语法
转义号
字符匹配符
选择匹配符
限定符
java默认贪婪匹配,优先匹配次数多的。如果后面加上“?”就为非贪婪匹配。
定位符
分组