java&MySQL-day-28

2021.11.3

Stream API

 概念说明

数据渠道、管道,用于操作数据源(集合、数组等)所生成的元素序列。

集合讲的是数据,流讲的是计算

即一组用来处理数组,集合的API。

 特点

Stream 不是数据结构,没有内部存储,自己不会存储元素。

Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。

Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

不支持索引访问。

延迟计算

支持并行

很容易生成数据或集合

支持过滤,查找,转换,汇总,聚合等操作。

 应用场景

流式计算处理,需要延迟计算、更方便的并行计算

更灵活、简洁的集合处理方式场景

代码实现

运行机制说明

Stream分为源source,中间操作,终止操作。

流的源可以是一个数组,集合,生成器方法,I/O通道等等。

一个流可以有零个或多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用,一个流只会有一个终止操作。

中间操作也称为转换算子-transformation

Stream只有遇到终止操作,它的数据源会开始执行遍历操作。

终止操作也称为动作算子-action

因为动作算子的返回值不再是 stream,所以这个计算就终止了

只有碰到动作算子的时候,才会真正的计算

常见中间操作: 

package study;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 一个中间操作链,对数据进行处理,一个流可以有0~N个中间操作
 * 
 * 他们每一个都返回新的流,方便下一个进行操作
 * 
 * 但是只能有一个终止操作
 * 
 * filter : 对元素进行过滤筛选,不合符的就不要了
 * 
 * distinct : 去掉重复元素
 * 
 * skip : 跳过多少元素
 * 
 * limit : 取最大条数(前几条)
 * 
 * map : 对集合中的元素进行遍历并操作
 * 
 * sorted : 排序
 * @author 落华见樱
 *
 */
public class Part01_Stream {
	public static void main(String[] args) {
		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);
	}
}

 常见终止操作

package study;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * 一旦执行终止操作,中间操作才会真正执行 并且 stream也就不能再被使用了
 * 
 * forEach : 遍历
 * 
 * collect : 收集器
 * 
 * min,max,count,agerage 计算相关
 * 
 * anyMatch 匹配数据,比如是否包含
 * @author 落华见樱
 *
 */
public class Part02_Stream_02 {
	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;
	}
	
}

MySQL

 概述

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,

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

SQL分类

DQL 数据查询

DDL : 数据定义

DML : 数据操作

TCL : 事务机制

DCL : 权限控制

 

DCL-用户创建和授权

在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';

​​​​​​​ DDL-数据库创建和删除

# 注释

-- 单行注释

/*

多行注释

*/

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

select version();

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

show databases;

-- 切换到test数据库下

use test;

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

show tables;

-- CREATE 创建 DROP 删除

-- USER 用户  database 数据库 table 表

-- 创建数据库

create database day01;

-- 删除数据库

drop database day01;

​​​​​​​DDL-表创建和删除

-- 创建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)

 );

​​​​​​​DML-数据操作

Insert : 添加数据

Update : 更新数据

Delete : 删除数据

​​​​​​​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;

​​​​​​​DQL-数据查询

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、付费专栏及课程。

余额充值