day28

1常见中间操作

1.1概述

一个中间操作链,对数据进行处理,一个流可以有0~N个中间操作
 他们每一个都返回新的流,方便下一个进行操作
但是只能有一个终止操作

1.2常见中间操作
  filter : 对元素进行过滤筛选,不合符的就不要了
  distinct : 去掉重复元素
 skip : 跳过多少元素
 limit : 取最大条数(前几条)
 map : 对集合中的元素进行遍历并操作
  sorted : 排序

1.3常见异常

Stream使用之后,必须生成新的流,不能使用原来的stream
 所以可以进行链式调用,因为中间操作返回值都是一个新的stream

 1.4使用方式

List<String> strings = Arrays.asList("a", "b", "c", "a");
        Stream<String> stream = strings.stream();
        // stream.filter(x -> false);
        // Stream使用之后,必须生成新的流,不能使用原来的stream
        // 所以可以进行链式调用,因为中间操作返回值都是一个新的stream
        // stream.filter(x->false);
        /**
         * filter : 对元素进行过滤筛选,不合符的就不要了
         */
        // x->!x.equals("a") : 如果返回false,就不要该数据了,如果返回true,就要这个数据
        // collect(Collectors.toList()) : 终止操作,把stream转换为集合
        List<String> value = stream.filter(x -> !x.equals("a")).collect(
                Collectors.toList());
        System.out.println(value);

        /**
         * skip : 跳过 本来是 abca 跳过两个 还剩下 ca
         */
        stream = strings.stream();
        value = stream.skip(2).collect(Collectors.toList());
        System.out.println(value);
        /**
         * map : 对集合中的元素进行遍历并操作
         */
        List<Integer> list = Arrays.asList(1000, 1200, 1100, 900, 5500);
        Stream<Integer> stream2 = list.stream();
        // 涨薪百分之十
        List<Integer> result = stream2.map(x -> x + x / 10).collect(
                Collectors.toList());
        System.out.println(result);

        /**
         * distomct : 去除重复
         * 
         * 本来是 abca现在是[a, b, c]
         */
        stream = strings.stream();
        value = stream.distinct().collect(Collectors.toList());
        System.out.println(value);
        /**
         * limit : 前几条
         * 
         * 本来是abca 前两条是[a, b]
         */
        stream = strings.stream();
        value = stream.limit(2).collect(Collectors.toList());
        System.out.println(value);
        /**
         * sorted : 排序
         */
        
        stream2 = list.stream();
        // [900, 1000, 1100, 1200, 5500] 默认升序
        // result = stream2.sorted().collect(Collectors.toList());
        
        // 匿名内部类  更改为降序
        // [5500, 1200, 1100, 1000, 900]
        // result = stream2.sorted(new Comparator<Integer>() {
        // @Override
        // public int compare(Integer o1, Integer o2) {
        // return o2-o1;
        // }
        // }).collect(Collectors.toList());
        // lambda写法
        result = stream2.sorted((x, y) -> y - x).collect(Collectors.toList());
    
        System.out.println(result);
    }

2常见终止操作

2.1概述

一旦执行终止操作,中间操作才会真正执行 并且 stream也就不能再被使用了

2.2常见的终止操作

forEach : 遍历
  collect : 收集器
  min,max,count,agerage 计算相关
 anyMatch 匹配数据,比如是否包含

 2.3使用方式

public static void main(String[] args) {
        List<String> strings = Arrays.asList("a","b","c","a","c","a");
        Stream<String> stream = strings.stream();
        // forEach
        stream.limit(2).forEach(x->System.out.println(x));
        
        stream = strings.stream();
        // 获取条数,这种不如直接调用集合的size方法简单一些
        long count = stream.count();
        System.out.println(count);
        // 所以 这样很难体现出count的优势,一般需要结合中间操作执行,优势更大
        // 统计 有多少a
        stream = strings.stream();
        count = stream.filter(x->x.equals("a")).count();
        System.out.println(count);
        
        // 获取最大值 max
        List<Integer> integers = Arrays.asList(1,2,3,4,5);
        Stream<Integer> stream2 = integers.stream();
        Integer i1 = stream2.max((x,y)->x-y).get();
        System.out.println(i1);
        
        // 匹配数据 anyMatch
        stream2 = integers.stream();
        boolean flag = stream2.anyMatch(x->x==5);
        System.out.println(flag);
        // 上面 这种 使用集合的contains也可以解决,但是也有contains解决不了的问题
        System.out.println(integers.contains(5));
        
        // 比如 好多学生 判断是否有19岁的学生,使用contains的话,Student中就要覆写equals方法了
        List<Student> students = new ArrayList<Student>();
        students.add(new Student("张三1", 18));
        students.add(new Student("张三2", 19));
        students.add(new Student("张三3", 17));
        students.add(new Student("张三4", 16));
        
        Stream<Student> stream3 = students.stream();
        flag = stream3.anyMatch(u->u.age==19);
        System.out.println(flag);
    }
}
class Student{
    String name;
    int age;
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
3数据库

3.1数据库概述

在操作系统中使用文件进行数据存储,跨平台性能 要差一些,而数据库是可以解决数据跨平台问题的

数据库 : 望文知义 就是遵循一定数据格式的数据集合,可以认为是对文件系统的改进 ,解决了操作系统跨平台问题

只要是同一个数据库文件,即使在Windows迁移到linux中 也是可以正常处理的

3.2数据库分类

画红框的是我们重点关注的。

Oracle

这是一种关系型数据库。它的特点是闭源收费,但是功能强大稳定,而且有一支专业的技术支撑团队。使用这种数据库的一般是大型企业、银行业、金融业。

MySQL

它也是关系型数据库。它的特点是开源免费,功能还是不错的,也比较稳定。通常使用这种数据库的,是中小企业等。因为它是开源的,所以我们有些企业可以对它做定制化、二次开发,以支持自己特殊的业务。比如阿里。说它是目前应用最广泛的DBMS,是MySQL的订制二次开发,也是比较好用。

DataBaseManagerSystem

Memcached、Redis

这2者是非关系型数据库(Not Only SQL)。它们通常用K-V键值对的形式存储数据,使用场景为缓存(可做为关系型数据库的补充)。它俩都是基于内存存储的,它们的数据都是在内存中,所以访问速度要快。Redis还提供了定期向磁盘中进行序列化的机制,它的IO性能也是非常高的。

MongoDB

这个也是NOSQL数据库。它使用文档形式存储数据。它使用文档形式存储数据。使用场景,通常是大数据量高并发访问。它的性能也非常高。

 3.3关系型和非关系型

关系型数据库 

查询来数据,得到对象,而非关系型数据库,保存键值对 查询处理数据,得到数组

简单理解

而关系型数据库 对于java而言,一个类就可以对应一个表,一个类对象就可以对应表中一行数据,一个成员变量可以对应表中的一个列(字段),能够做到一一的映射,数据库中是以表作为基本单位的

非关系型数据库

是存储键值对的,即有关系型数据库处理数据的方便性,也能处理大量数据,比较火的就是Redis、mongoDB了,各有千秋

关系型数据库这里一个名词是ORM : Object Relationl Mapping 对象关系映射,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了,更加面向对象

 

 4MySQL

4.1概述

MySQL是一个关系型数据库管理系统由瑞典MySQL AB 公司开发,目前属于 Oracle旗下产品。MySQL 是最流行的关系型数据库关系系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS(Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

数据库对象

表,视图,函数,存储过程,索引等。

就是存储数据的,里面有一条条的记录,记录是由字段组成的。每个字段都有自己的字段名、字段值、字段类型(数据类型)。字段是存储数据的基本单元。类似Java中的对象,用于存储数据。

表(table)是一种结构化的文件,可以用来存储特定类型的数据,如:学生信息,课程信息,都可以放到表中。另外表都有特定的名称,而且不能重复。表中具有几个概念:列、行、主键。 列叫做字段(Column),行叫做表中的记录,每一个字段都有:字段名称/字段数据类型/字段约束/字段长度

学生信息表

学号(主键)

姓名

性别

年龄

00001

张三

20

00002

李四

20

视图

我们可以理解为一张虚表(它在物理磁盘上并不真实存在)。视图是基于select语句查询生成的结果集。当一条select语句比较复杂而且调用的频率也比较高时,我们不想再写一遍语句,这时候可以把这条select语句创建为一个视图。每次使用视图的时候,就可以把它当成一张表来用。

函数

通常是一个功能的实现,我们大部分使用的是系统函数(MYSQL提供的),我们也可以自定义函数。它的调用套路通过使用select 函数名(参数1,参数2..);来调用。它只有一个返回值。

存储过程

也是一个功能的实现。我们所说的数据库编程,SQL语句编程,就主要是指自定义一个存储过程。调用存储过程是使用exec 存储过程名 参数1等来调用。它是可以返回多个值,也可以没有返回值。

索引

我们之前接触过,它就像一本书的目录一样,是为了加快我们查询速度而建立的。

表结构

表名称:dept

描述:部门信息表

英文字段名称

中文描述

类型

DEPTNO

部门编号

INT(2)

DNAME

部门名称

VARCHAR(14)

LOC

位置

VARCHAR(13)

表名称:emp

描述:员工信息表

英文字段名称

中文描述

类型

EMPNO

员工编号

INT (4)

ENAME

员工姓名

VARCHAR(10)

JOB

工作岗位

VARCHAR(9)

MGR

上级领导

INT (4)

HIREDATE

入职日期

DATE

SAL

薪水

DOUBLE(7,2)

COMM

津贴

DOUBLE (7,2)

DEPTNO

部门编号

INT(2)

注:DEPTNO字段是外键,DEPTNO的值来源于dept表的主键,起到了约束的作用

表名称:salgrade

描述:薪水等级信息表

英文字段名称

中文描述

类型

GRADE

等级

INT

LOSAL

最低薪水

INT

HISAL

最高薪水

INT

数据类型

刚才创建创建表的时候,我们用到了数据类型,类型目的就是限制数据的类型,那么接下来我们看一下常用的几种类型

整型,浮点型,字符型,日期时间型等。

数值型

 时间类型

 

字符串型

 

数据库/SQL的数据类型也是挺多的,但是我们掌握几个常用的就是,比如整型int,浮点型decimal(18,2)(共18位,16位整数部分与2位小数部分),字符型就是字符串类型varchar(100)(可以存储100个字符),日期时间型datetime('2018-05-23 15:00:00')。当然还有其他的具体类型,但是我们在基础阶段就先知道这些就可以了。

小知识

char与varchar的区别。char(100)类型的字段一旦定义,不管里面是否真的有值,它就固定会占用100个字符对应的存储空间,这种类型对空间的利用率其实并不高。varchar(100)类型的字段定义后,它所占用的空间就是里面存储内容占用的空间,但是最大不会超过100个字符,这种类型对空间的利用率是很高的。

比如 手机号码(目前都是11位,前缀不考虑),就可以使用char定长

比如 姓名或者家庭地址,就可以使用varchar,

毕竟家庭地址和名字的长度共多少位,不好确定

(有的可能说,名字不是最多就3位吗?那你把迪丽热巴放到哪里 - - !  你把 奥斯夫托洛夫斯基放到哪里 - - !)

3.2SQL分类

DQL 数据查询

DDL : 数据定义

DML : 数据操作

TCL : 事务机制

DCL : 权限控制

3.3DCL-用户创建和授权

在mysql中,内置一个超级管理员,就是root,在安装的时候已经指定了root的密码

但是在开发的时候,不会让我们使用root用户,这样权限太大,一般都会帮我们创建一个用户,并且我们这个用户只能操作我们相关的数据

# 创建用户语句

# CREATE USER '用户名'@'host' IDENTIFIED BY '密码';

CREATE USER 'zrz'@'127.0.0.1' IDENTIFIED BY 'zrz';

# 授权

# GRANT 权限 on 数据库.表 to '用户名'@'host' IDENTIFIED BY '密码';

# 刷新权限

#FLUSH PRIVILEGES;

# test.* 是test数据库下所有表  *.* 表示所有数据库下所有表

# 权限 : all privileges 所有权限 select 查询 update 更改 insert 添加 delete 删除 drop 删除表 create 创建表

GRANT SELECT on test.student to 'zrz'@'127.0.0.1' IDENTIFIED BY 'zrz';

FLUSH PRIVILEGES;

# 撤销授权

# grant 授权 revoke 撤销授权 , 语法一样 把to换成from即可

revoke SELECT on test.student from 'zrz'@'127.0.0.1' IDENTIFIED BY 'zrz';

# 删除用户 DROP

# DROP USER '用户名'@'host';

drop user 'zrz'@'127.0.0.1';

3.2DDL-数据库创建和删除

# 注释

-- 单行注释

/*

多行注释

*/

-- 查看当前连接mysql服务的版本号

select version();

-- 查看当前连接的mysql中所有数据库

show databases;

-- 切换到test数据库下

use test;

-- 查看当前数据库下所有的表

show tables;

-- CREATE 创建 DROP 删除

-- USER 用户  database 数据库 table 表

-- 创建数据库

create database day01;

-- 删除数据库

drop database day01;

3.3DDL-表创建和删除

-- 创建day01数据库

create database day01;

-- 切换到day01数据库下

use day01;

-- 创建表

-- create table 表名 (

-- 列名 类型,

-- 类名 类型,

-- .....

-- );

 create table student_info (

-- id为整数

  id int,

-- 姓名为字符串 并且20个字符

  name varchar(20),

-- 成绩 小数,共5位 其中2位小数3位整数

score decimal(5,2)

 );

-- 删除表

drop table student_info;

-- 查看建表语句

show create table student_info;

CREATE TABLE `student_info` (

  `id` int(11) DEFAULT NULL,

  `name` varchar(20) DEFAULT NULL,

  `score` decimal(5,2) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

存储引擎 :

InnoDB

MyISAM

 create table `table` (

-- id为整数

  id int,

-- 姓名为字符串 并且20个字符

  name varchar(20),

-- 成绩 小数,共5位 其中2位小数3位整数

score decimal(5,2)

 );

drop table `table`;

建议所有的表名和列名 都加反引号 `` ~~

比如 table是建表关键字,如果我们想把表名弄成table,那么此时就需要加反引号括起来

但是不建议使用关键字,因为这样的话,我们所有对该表的操作,都必须加反引号

-- 假如已经有了这个表了,在创建就会报错  Table 'student_info' already exists

-- 可以这样解决 如果不存在就创建,存在就不创建,不创建就不会报错

create table if not exists student_info (

-- id为整数

  id int,

-- 姓名为字符串 并且20个字符

  name varchar(20),

-- 成绩 小数,共5位 其中2位小数3位整数

score decimal(5,2)

 );

3.4DML-数据操作

Insert : 添加数据

-- INSERT 用于向数据库中 添加数据

-- 格式 : insert into 表名(列名,列名....) values(值,值.....);

-- 格式 : insert into 表名 values(值,值.....);

-- 注意 : 字符串需要加引号

insert into student_info(id,name) values(1,'张三');

insert into student_info(id,name,score) values(2,'李四',90.2);

Update : 更新数据

-- update : 更改数据

-- 注意 下面这种写法,是整个表的操作,会把表中所有数据全部更改

-- 格式 : update 表名 set 列名=值,列名=值...;

-- 如果不是全表操作,就必须使用where 进行行判断

-- 格式 : update 表名 set 列名=值,列名=值... where 列名=值;

update student_info set score = 60 where id = 1;

-- 所有学生成绩+10分

update student_info set score = score+10 ;

Delete : 删除数据

-- delete : 删除数据

-- 下面代码,没有使用where,就把表中所有数据都删除

-- 格式 : delete from  表名 ;

-- 只要不是把所有数据都删除,就需要使用where 筛选要删除的数据

-- 格式 : delete from  表名 where 列名= 值;

-- 需求 : 把不及格的删掉 成绩小于60

delete from student_info where score < 60;

-- 需求 : 把没有成绩的删掉 成绩 为null  

-- 注意 判断null 不能用 =null 应该用 is null , 同理 判断不为空 用 is not null

delete from student_info where score is null;

-- 需求 : 把不及格的删掉 成绩小于60 或 成绩为null

delete from student_info where score < 60 or score is null;

3.5DQL-数据查询

Select : 查询数据

-- select : 数据查询

-- 格式 : select 列限定 from 表限定 where 行限定;

-- 表限定 : 你要查询那个表

-- 行限定 : 你要那些数据行

-- 列限定 : 你要得到那些列

-- 需求 : 查看 所有学生中,不及格的学生姓名

-- 表限定 : 学生表 , 行限定 : 不及格  , 列限定 : 学生姓名

select name from student_info where score < 60;

-- 需求 : 查询所有学生信息  * 表示所有列

select * from student_info;

-- 需求 : 查询ID为1的学生姓名和成绩

select name,score from student_info where id=1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值