Day25:
1.IO流的分类
按流的方向划分:
1)输入流
2)输出流
按流的类型划分:
1)字节流
字节输入流:InputStream(抽象类)
FileInputStream:针对文件操作的字节输入流(读)
字节缓冲输入流(字节高效输入流):BufferedInpuStream
字节输出流:OutputStream(抽象类)
FileOutputStream:针对文件操作的字节输出流(写)
字节缓冲输出流(字节高效输出流):BufferedOutputStream
2)字符流:
字符输入流:Reader:读
字节输入流通向字符输入流的桥梁(转换输入流):InputStreamReader
为了书写简单:FileReader
字符缓冲输入流(字符高效输入流):BufferedReader
特有功能:String readLine() :一次读取一行
字符输出流:Writer:写
字节输出流流通向字符输出流的桥梁(转换输出流):OutputStreamWriter
字符缓冲输出流(字符高效输出流):BufferedWriter
特有功能:
public void newLine():写入一个行的分隔
字节流:
字节输出流:OutputStreamStream抽象类
提供具体的子类:FileOutputStream
2.字节输出流:写的功能
public void write(int b) throws IOException:给当前字节输出流中写入一个字节
public void write(byte[] b) throws IOException:写入一个字节数组
public void write(byte[] b,int off,int len)throws IOException:写一个字节数组的一部分
3.构造方法
public FileOutputStream(String name,boolean append) throws FileNotFoundException
创建一个文件输出流对象,第二个参数为true,在文件字节末尾处追加!
问题:输出一句内容,如何换行?
在windows操作系统中,使用换行符号"\r\n"
4.流中异常操作
流中加入异常操作
解决方案:try...catch...finally 标准格式
使用代码实现:
package com.zyc.io_01;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo {
public static void main(String[] args) {
method3() ;
}
private static void method3() {
FileOutputStream fos = null ;
try {
fos = new FileOutputStream("fos4.txt") ;
fos.write("hello,i'm coming...".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5.复制文件操作
需求:将当前项目下的FileOutputStreamDemo.java 复制到D:\JavaEE_2104\EE_day25\code
代码实现:
public class CopyFileDemo {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java") ;
FileOutputStream fos = new FileOutputStream("D:\\JavaEE_2104\\EE_day25\\code\\Copy.java") ;
long start = System.currentTimeMillis() ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
long end = System.currentTimeMillis() ;
System.out.println("共耗时:"+(end-start)+"毫秒");
fos.close();
fis.close();
}
}
6.抽象类的概念及其使用
抽象类:InputStream:表示字节输入流的所有类的超类
提供的针对文件操作的输入流:FileInputStream
使用步骤:
1)创建文件操作输入流对象
public InputStream()
2)通过 文件字节输入流对象,读取指定的文件中的内容
读取数据的功能:
public int read() throws IOException:一次读取一个字节
public int read(byte[] b) throws IOException: 读取一个字节数组,返回的是读取的实际字节数
public int read(byte[] b,int off,int len) throws IOException:读取一部分字节数组
3)释放资源
一次读取一个字节:
读取一些文件,中文会出现乱码,原因就是将实际的字节数强制转为char类型
7.缓冲流
BufferedOutputStream
BufferedOutputStream(OutputStream out) :指定默认的缓冲长度
写操作
public void write(int b)
public void write(byte[] b,int off,int len)
BufferedInputStream
BufferedInputStream(InputStream in)
读操作
public int read()
public int read(byte[] bytes)
public int read(byte[] bytes,int offset,int len)
内部只是提供一个字节数组(缓冲区):长度8192个长度
构造方法都是默认的缓冲区大小,文件的操作还需要通过最底层的基本的字节流操作
缓冲流都是不直接操作文件,仅仅是提供内部缓冲区(提高读写效率!)
8.文件读写的复制方式
基本的字节流:一次一个字节
基本的字节流:一次一个字节数组
字节缓冲流:一次一个字节
字节缓冲流:一次一个字节数组
9.字符缓冲输入流和字符缓冲输出流
字符缓冲输入流和字符缓冲输出流:提供默认的缓冲区大小,读写的操作还需要交给底层字节流
为了针对文本文件操作,提高执行效率!
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
构造方法
BufferedWriter(Writer out)
成员方法:
public void newLine():换行功能
字符缓冲输入流:BufferedReader
构造方法:
public BufferedReader(Reader in)
特有功能:
public String readLine()
10.键盘录入的三种方式
(1)main方法的参数
(2)jdk5以后提供的Scanner
(3)BufferedReader
package com.zyc.io_04;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
InputStream in = System.in ;
Reader r = new InputStreamReader(in) ;
BufferedReader br = new BufferedReader(r) ;
System.out.println("请您输入一个int类型的内容:");
String line = br.readLine();
int i = Integer.parseInt(line);
System.out.println("您输入的数据是:"+i);
}
}
Day26
1.Properties
Properties 继承自Hashtable<K,V>---->实现Map<K,V>接口
表示了一个持久的属性集
Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
构造方法
public Properties()
关于属性集合类的特有功能:
添加方法
public Object setProperty(String key,String value)
遍历:
public Set<String> stringPropertyNames()
通过键获取值
public String getProperty(String key)
关于属性集合类的应用;
1)因为键和值都是String,所以可能将键和值的保存在文本文件或者配置文件中 :加载过程
public void load(Reader reader)throws IOException
public void load(InputStream in)throws IOException
2)将属性集合类中的内容写出到某个文件中:保存过程
public void store(OutputStream out,String comments) throws IOException
参数1:当前字节输出流
参数2:给当前属性列表中写入完毕之后,注释的内容
public void store(Writer writer,String comments) throws IOException
将当前项目下的name.txt内容加载到属性集合类中
2.UDP协议
UDP协议接收端实现
1)创建接收端的Socket
public DatagramSocket(int port) throws SocketException:绑定端口号
2)数据一个数据报包对象:DatagramPacket
接收容器
public DatagramPacket(byte[] buf, int length) :获取的是缓冲区的数据(不是真实数据)
一般情况:byte[] bytes = new byte[1024] ; 自定义字节缓冲区
3)接收
public void receive(DatagramPacket p):阻塞式方法:在接收数据之前,一直处于阻塞状态,直到
当前接收端监听客户端口号了
4) 获取缓冲区的传递的真实数据
public byte[] getData():获取真实的字节数组
public int getLength():获取实际长度
将获取的字节数据---->String(byte[] bytes,int offset,int length)
获取哪个发送端传递的数据:ip 文本形式:
public InetAddress getAddress()
IntegerAddss--->public String getHostAddress()
5)使用完毕,关闭接收端
注意:接收端不能运行多次,否则出现异常了,端口号被占用!
3.UDP协议发送端的实现步骤
DatagramSocket表示用来发送和接收"数据报包"的套接字
1)创建发送端的Socket: DatagramSocket
public DatagramSocket() throws SocketException{}
2) 创建 "数据报包"对象
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
3)发送数据报包
public void send(DatagramPacket p) throws IOException
4)释放资源
close()关闭socket对象
代码实现:
public class SendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket() ;
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
String messageStr = "hello,UDP,我来了" ;
byte[] bytes = messageStr.getBytes();
int length = bytes.length ;
InetAddress inetAddress = InetAddress.getByName("10" + ".12.152.129");
int port = 10086 ;
DatagramPacket dp = new DatagramPacket(bytes, length, inetAddress, port);
ds.send(dp);
System.out.println("当前数据已经发送...");
ds.close();
}
}
Day27
1.什么是反射?
反射就是获取一个类的字节码文件,然后加载该类的所有的成员
成员变量所在类---->Field
成员方法所在类---->Method
构造方法所在类--->Constructor
给成员变量赋值通过Field,调用成员方法Method,通过构造器创建的对象...
MySQL部分
什么是数据库?
存储数据的仓库!
特点:
永久存储
可以支持一些事务
(数据库的事务----将整个业务操作看成一个整体)
执行效率高(通过sql语句)
之前存储方式:
1)临时变量 存储在内存中,方法结束 局部变量就消失了
2)数组 存储同一种类型元素,但是长度固定的!
3)StringBuffer: 字符串缓冲区 :里面存储的可变的字符序列
4)集合 存储任意类型元素,必须引用类型
取元素: 遍历 (单例集合:Iterator)
增强for循环
存储大量大数据,效率太低
5)IO流:也能存储数据
太耗时(读写过程)
常见的数据库:
关系型数据库:Oracle,MySQL,SqlServer
非关系型数据库:NoSQL,MangoDb
DL语句(重点):
操作数据库
查询当前服务器软件中的所有的数据库
show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |-- mysql服务器相关的配置
| mysql |-- 存储很多相关的用户表user(权限用户)
| performance_schema |-- 跟mysql性能优化相关的表信息
| test |-- 测试数据库
+--------------------+
创建新的数据库
create database 数据库名称;
create database if not exists 数据库名称;
mysql> create database if not exists EE_2104;
Query OK, 1 row affected (0.01 sec)
查看创建的数据库的默认字符集
show create database 数据库名称;
mysql> show create database ee_2104;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| ee_2104 | CREATE DATABASE `ee_2104` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)
修改数据库的默认字符集
alter database 数据库名称 DEFAULT(可以省略) CHARACTER SET 字符集;
mysql> alter database ee_2104 character set gbk;
Query OK, 1 row affected (0.00 sec)
mysql> show create database ee_2104;
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| ee_2104 | CREATE DATABASE `ee_2104` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-----------------------------------------------------------------+
删除数据库
drop database 数据库名称;
drop database if exists 数据库名称;
mysql> drop database if exists ee_2104;
Query OK, 0 rows affected (0.00 sec)
切换数据库(数据库本身就是一个文件夹,进入到某个文件夹中)
use 数据库名称;
mysql> use ee_2104;
Database changed
DDL语句:来操作表
mysql> show tables; 查询当前指定数据库中的所有表
Empty set (0.01 sec)
创建表的语法:
create table 表名(
字段名称1 字段类型1,
字段名称2 字段类型2,
字段名称3 字段类型3,
....
字段名称n 字段类型n
);
mysql常见的字段类型
int:整数类型(推荐):默认11位
当给定的值,它获取到当前整数的实际长度(自动获取)
age int,----age = 50
int(位数):不推荐
int(4) ---age = 5 0005
varchar(指定长度):就是java类的String 字符串类型:推荐使用'',也可以双引号 ,也可以不带引号
举例
name varchar(20):name字段最大能支持20个字符
date:日期 : 仅仅只是表示日期,没有时间
datetime:日期+当前时间
timestap:时间戳 (就当前被访问/操作具体:当前系统时间)
double(5,3):小数类型,可以5位数据,小数点后3位...
double 小数类型:100 --->100.0
mysql> create table student(
-> sid int,
-> name varchar(10),
-> age int,
-> address varchar(10),
-> gender varchar(5),
-> birthday date
-> );
Query OK, 0 rows affected (0.02 sec)
查询表的结构:desc 表名;
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| address | varchar(10) | YES | | NULL | |
| gender | varchar(5) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.03 sec)
修改表:
给表中添加一列(添加一个字段)
alter table 表名 add 字段名称 字段类型;
mysql> alter table student add hobit varchar(20);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| address | varchar(10) | YES | | NULL | |
| gender | varchar(5) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hobit | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
修改表的字段名称
alter table 表名 change 以前的列名称 新的列名称 以前的字段类型;
mysql> alter table student change gender sex varchar(5);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| address | varchar(10) | YES | | NULL | |
| sex | varchar(5) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hobit | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.02 sec)
修改表的字段类型
alter table 表名 modify 字段名称 更改后的字段类型;
mysql> alter table student modify sex varchar(3) ;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| address | varchar(10) | YES | | NULL | |
| sex | varchar(3) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hobit | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.02 sec)
修改的表的名称
alter table 以前表名 rename to 新表名;
mysql> alter table student rename to stu;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-------------------+
| Tables_in_ee_2104 |
+-------------------+
| stu |
+-------------------+
1 row in set (0.02 sec)
创建表的时候复制一张相同的表
create table 新表名 like 存在的表名;
mysql> create table teacher like stu;
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
+-------------------+
| Tables_in_ee_2104 |
+-------------------+
| stu |
| teacher |
+-------------------+
2 rows in set (0.00 sec)
mysql> desc teacher;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| address | varchar(10) | YES | | NULL | |
| sex | varchar(3) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hobit | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.01 sec)
删除表
drop table 表名;
drop table if exists 表名;
mysql> drop table teacher;
Query OK, 0 rows affected (0.02 sec)
Day28
1.数据库的操作语句
插入语法
语法1:insert into 表名 values(字段值1,字段值2,...n:全部字段) ;
语法2:插入部分字段
inset into 表名 (字段名称1,字段名称2,字段名称3..) values(值1,值2,值3..) ;
语法3:插入全表字段或者部分字段的时候,可以一次性插入多条记录
insert into 表名 values(字段值1,字段值2,...n:全部字段),(字段值1,字段值2,...n:全部字段),(...)
注意事项
插入数据的时候,必须保证插入值对应的字段类型一致,否则会存在潜在问题(类型不匹配)
插入全表字段的值必须总数据要和字段列名的总数一致
update语句:修改
基本的用法:带条件进行修改
update 表名 set 字段名称 = 值 where xx =xx ;
删除:带条件来删除 delete from 表名 where ...
delete from 表名:
TRUNCATE TABLE 表名;
都是删除全表数据,那么有什么不同?
delete from 表名:只是删除表中的全部数据,那么当前表的结构还存在,针对自增长主键id,下次
从之前id值继续自增;
TRUNCATE TABLE 表名; 会将当前表的全部数据以及表都删除掉,
并且自动创建一张一模一样的表,直接影响自增长主键,从0继续开始自增!
2.DQL语句: 数据库查询语句(重点)
基本查询
DQL语句的基本查询
带指定字段的查询
查询student表中学生信息(id,name,age,sex,address)
SELECT
id,
NAME,
age,
sex,
address
FROM
student ;
SELECT
address
FROM
student ;
DQL语句之带where条件的查询
where 赋值运算符 =
where 比较运算符 ==,<,<=,>,>=,!=,<>(不等于)
where 其他符号:&& ,|| , and ,or , between and ...
-- where 字段名称 in(值1,值2,值3)
-- where 字段名称 是否为null (is null) :为空 is not null
DQL语句的模糊查询
select 字段列表 from 表名 字段名称 like(关键字) '%xx%'
%:表示可以匹配的任意的多个字符 一般都是 '%字符值%':包含指定的字符的信息 模糊查询出来
_:表示代替一个字符: 模糊查询 名字为三个字符的人 '___'
-- : 模糊查询姓名为两个字符的人,'_化'
-- 模糊查询当前mysql服务器中所有的字符集的编码
DQL语句聚合函数查询
count(字段名称):查询总记录数
avg(字段名称):查询当前字段的平均值
max(字段名称):查询当前字段的最大值
min(字段名称):查询当前字段的最小值
sum(字段名称):当前字段的求和值
多表查询---子查询
查询数学平均分的学生信息
select
*
from
student
where avg(math) = 70;
DQL之 排序查询
select 字段列表 from 表名 order by 字段名称 排序方式
排序方式:asc :升序(默认值) desc :降序
将的数学成绩升序排序 查询全部学生信息
分组查询:关键字:group by
针对分组查询的时候,可以查询什么?
1)可以查询分组的字段
2)查询聚合函数
select 字段列表 ,聚合函数 from 表名 group by 分组的字段;
注意:group by 后面不能跟聚合函数,否则语法通过不了
分组查询:group by 带条件查询,必须先使用条件,然后在参与分组
where 语句必须放置在group by之前;
查询时候
分析:查询哪个字段
带什么条件查
有没有分组(需要分组,where条件必须在前)
有没有筛选,如果有筛选,有分组
先where,
再分组
再筛选...
筛选:having
筛选后面可以使用聚合函数,而且如果sql语句有where条件,有group by ,有having
where必须置于group by之前,
group by 必须置于having 之前!
分页查询
-- mysql:limit 起始行数,每页显示的条数;
-- select 字段列表 from 表名 limt 起始行数,每页显示的条数;
Day29
1.数据库的约束
就是约束用户操作表的行为
针对一些字段设置用户的限制!
默认约束 :default(当用户没有插入指定的这个字段,启用默认约束--->默认值)
2.唯一约束
唯一约束 unique (限定某个字段的不能重复,必须唯一的)
CREATE TABLE emp(
id INT UNIQUE, -- 唯一约束
NAME VARCHAR(10) ,
age INT
) ;
3.删除唯一约束
删除唯一约束
atler table 表名 drop index 唯一约束所作用的字段名称
ALTER TABLE emp DROP INDEX id ;
4.添加唯一约束
添加唯一约束
ALTER TABLE emp MODIFY id INT UNIQUE ;
5.主键约束
主键约束:primary key
-- 特点:非空+唯一
CREATE TABLE emp(
id INT PRIMARY KEY, -- 主键约束
NAME VARCHAR(10)
);
6.删除主键约束
删除主键约束
-- alter table 表名 drop PRIMARY KEY ;
7.添加主键约束
添加主键约束
ALTER TABLE emp MODIFY id INT PRIMARY KEY ;
UPDATE emp SET id = 4 WHERE NAME = '周冬雨' ;
8.自增长约束
自增长约束:auto_increment和主键一块使用
-- 一般都作用于非业务字段(xxid)
-- (默认值:0开始,当前插入数据之后,自增长的主键的值会依次自增1)
9.级联操作
有外键的表--->删除和修改都比较麻烦 (操作从表---主表)
CASCADE:级联操作
on update cascade 级联修改
当修改主表字段,那么跟从表相关的信息一会被更改
on delete cascade 级联删除
添加外键的同时--添加级联修改和级联删除
ALTER TABLE employee
ADD
CONSTRAINT
fk_dept_emp
FOREIGN KEY
(dept_id)
REFERENCES
dept(id)
ON UPDATE CASCADE -- 添加级联修改
ON DELETE CASCADE ; -- 添加级联删除
10.数据库的备份和还原
方式1:
命令行的方式
数据库的备份
mysqldump.exe 指令 :备份指令
进入dos
输入 :mysqldump -uroot -p密码 数据库名 > 路径
mysqldump -uroot -p123456 ee_2104 > D:\JavaEE_2104\EE_day29\code\my.sql
将ee_2104这个库中所有表都存储在D:\JavaEE_2104\EE_day29\code\my.sql文件中
数据库还原
1)通过dos先登录mysql
2)删除原来备份过的数据库
3)创建空数据库
4)source 指定之前备份的路径的sql文件 : 自动的进行创建以及表中数据进行插入...
source D:\JavaEE_2104\EE_day29\code\my.sql
方式2:图形界面化:直观简单
sqlYog /navicat
备份:
鼠标选择指定数据库,右键--->备份--->以sql文件转存数据库---指定路径
还原:
1)删除当前数据库
2)创建新的数据库
3)选择新建的数据库名---右键--->导入--->以sql转储文件数据库
11.数据库范式
数据库范式:就是设计关系型数据库使用的一种规范要求!
常用的范式:三大范式
1NF:第一范式
在设计关系数据数据库是,最低要求必须遵循1NF
表中的每一列是不可再拆分的!(独立的原子项)
2NF:第二范式
在1NF的基础上,非主键字段(属性字段)必须完全依赖于主键字段
3NF:第三范式
在第二范式基础上,非主键字段(主键字段和非主键字段)之间不能产生传递依赖!
A字段-->B字段--->C字段
A字段--->C字段 (传递依赖)
12.多表查询
多表查询之显示内连接:就是通过where 设置条件
隐式内连接和显示内连接 :内连接查询
优先采用显示内连接 :where语句 ,然后其次使用隐式内连接
13.外连接(推荐左外)
左外:(推荐)select 字段列表 from 表名1 left outer(可以省略) join 表名2 on 表名1和表名2的连接条件
将左表中的全部数据以及交集(符号连接条件)的数据查询出来
右外:将右表的数据全部查询以及多个表之间的交集数据查询出来
格式: select 字段列表 from 表名1 right outer join 表名2 on 连接条件;
14.子查询
select语句嵌套select语句
多行单例
in语句---使用or 进行或的关系