MySQL触发器学习
Java基础类库
一、与用户互动
1、运行Java程序的参数
2、使用Scanner获取键盘输入
二、系统相关
1、System类
2、Runtime类与Java9的ProcessHandle
三、常用类
1、Object类
2、操作对象的Objects工具类
3、Java9改进的String、StringBuilder和StringBuffer类
4、Math类
5、ThreadLocalRandom与Random
6、BigDecimal类
四、Java8的日期、时间类
1、Date类
2、Calendar类
3、新的日期、时间包
五、正则表达式
1、创建正则表达式
2、使用正则表达式
六、变量处理和方法处理
1、Java9增强的MethodHandle
2、Java9增强的VarHandle
七、Java11改进的国际化与格式化
1、Java国际化思路
2、Java支持的国家和语言
3、完成程序国际化
4、使用MessageFormat处理器包含占位符的字符串
5、使用类文件代替资源文件
6、Java9新增的日志API
7、使用NumberFormat格式化数字
8、使用DateFormat格式化日期、时间
9、使用SimpleFormat格式化日期
八、Java8新增的日期、时间格式器
1、使用DateTimeFormatter完成格式化
2、使用DateTimeFormatter解析字符串
九、本章小结
阅读笔记2021-05-26
一、Vocabulary
1、ballet
n.芭蕾舞
2、martial
adj.战争的,军事的
3、intangible
adj.难以形容的;n.不可捉摸的东西
4、heritage
n.遗产,传统
5、variety
n.品种,多样化
6、originate
v.起源;发端于;创立
7、innovative
adj.引进新思想的,采用新方法的
二、Phrase
1、perch on
n.(鸟的)栖木,栖息处;v.栖息于,位于
2、take advantage of
利用(时机、他人的弱点等);占···便宜;勾引
三、SpecificNoun
1、martial arts movie
武侠片
2、intangible cultural heritage
非物质文化遗产
3、Chinese Bamboo Drifting
中国竹子漂流
Java集合
Java集合大致可分为 Set、List、Queue和Map
四种体系,Java集合就像一种容器,可以将多个对象扔进去。
一、Java集合概述
为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。所有的集合类位于 java.util
包下,后来为了处理多线程环境下并发安全的问题,Java5还在 java.util.concurrent
包下提供了一些多线程支持的集合类。
集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用);而集合类只能保存对象(实际上保存的是对象的引用变量,但通常看作对象),
Java集合类主要由两个接口派生出来:
- Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口包含了一些子接口或实现类。如下图就是Collection接口、子接口及其实现类的继承树:
- 下图是Map体系的继承树,所有的Map实现类用于保存具有映射关系的数据
从下图可以看出,如果访问List集合中的元素,可以直接根据元素的索引来访问;如果访问Map集合中的元素,可以根据每项元素的key值来访问其value;如果访问Set中的元素,则只能根据元素本身来访问
二、Java11增强的 Collection
和 Iterator
接口
Collection接口是List、Set和Queue的父接口,该接口定义的方法可以自行去查Java API文档,无非就是添加对象、清空容器、判断容器是否为空等等
1 | public class CollectionTest { |
1、使用Lambda表达式遍历集合
1 | public class CollectionEach { |
2、使用Iterator遍历集合元素
Iterator接口也是Java集合框架的成员,但是他与Collection系列、Map系列的集合不一样,:Collection系列集合、Map系列集合主要用于乘装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection中的元素,Iterator对象也称为迭代器。
下面直接上代码看看Iterator遍历元素的例子:
1 | public class IteratorTest { |
- Iterator必须依附于Collection对象,它本身并不提供乘装对象的能力
- 使用Iterator对集合元素遍历时,Iterator并非将集合元素本身交给了迭代变量,而是将集合元素的值传给了迭代变量
- 使用Iterator迭代过程中,一旦发现集合被修改,会抛出异常,代码如下
1 | public class IteratorErrorTest { |
Iterator迭代器采用的是快速失败的(fail-fast机制),一旦检测到迭代过程该集合已经被修改,就会抛出 ConcurrentModificationException
异常。
3、使用Lambda表达式遍历Iterator
Java8为Itreater新增了一个 forEachRemaining(Consumer action);
方法,该方法所需的Consumer参数同样也是函数式接口。
代码如下:
1 | public class IteratorEach { |
4、使用foreach循环遍集合元
直接上代码:
1 | ``` |
虽然LinkedHashSet使用了链表记录集合元素的添加顺序,但LinkedHashSet依然是HashSet,他不允许元素重复。
3、TreeSet类
4、EnumSet类
5、各Set实现类的性能分析
四、List集合
1、改进的List接口和ListIterator
2、ArrayList和Vector实现类
3、固定长度的List
五、Queue集合
1、PriorityQueue实现类
2、Deque接口与ArrayDeque实现类
3、LinkedList实现类
4、各种线性表的性能分析
六、增强的Map集合
1、Java8为Map新增的方法
2、改进的HashMap和Hashtable实现类
3、LinkedHashMap实现类
4、使用Properties读写属性文件
5、SortedMap接口和TreeMap实现类
6、WeakHashMap实现类
七、HashSet和HashMap的性能选择
八、操作集合的工具类:Collections
1、排序操作
2、查找、替换操作
3、同步控制
4、设置不可变集合
5、Java9新增的不可变集合
九、繁琐的接口:Enumeration
十、本章小结
MySQL存储过程学习
一、变量
1、系统变量
系统变量:由系统提供,并不是用户定义的,属于服务层面,由于作用域的不同分为以下两种:
- 全局变量
- 会话变量
a、查看所有的系统变量
1 | SHOW GLOBAL | [SESSION] VARIABLES |
执行结果如下:
b、查看满足条件的系统变量
1 | SHOW GLOBAL | [SESSION] VARIABLES LIKE '%char%' |
c、查看指定系统变量的值
1 | SELECT @@GLOBAL | [SESSION].系统变量名 |
d、为某个系统变量赋值
方式一:
1
SET GLOBAL | [SESSION] 系统变量名 = 值
方式二:
1
SET @@GLOBAL | [SESSION].系统变量名 = 值
注意事项:
- 如果是全局级别,则需要加GLOBAL,如果是会话级别,则需要加SESSION,不写默认SESSION
- 全局变量对所有会话均有效,会话变量仅仅对当前会话有效
2、自定义变量
由用户自定义,非系统提供的变量
a、用户变量
使用步骤: 声明
、 赋值
、 使用(查看、比较、运算等)
;作用域:仅仅对当前会话(连接)有效,同会话变量
1、声明并初始化
赋值的操作符: =
或者 :=
,注:SELECT只能用 :=
方式一:
1
SET @用户变量名=值
方式二:
1
SET @用户变量名:=值
方式三:
1
SELECT @用户变量名:=值
2、赋值
可以由上面的三种方式赋值,也可以将查询结果赋值给变量
1 | -- SELECT 字段 INTO @变量名 FROM 表名 |
3、使用(查看用户变量)
1 | SELECT @用户变量名 |
b、局部变量
作用域:仅仅定义在它的 begin end块中有效
1、声明
1 | DECLARE 变量名 类型; |
2、赋值
与用户变量一致,只不过使用 SET
或者 SELECT INTO
时,无需用@符号
3、使用
1 | SELECT 局部变量名 |
用户变量与局部变量区别:
变量类型 | 作用域 | 定义与使用位置 | 语法 |
---|---|---|---|
用户变量 | 当前会话 | 会话中的任何位置 | 必须加@符号,不用限定类型 |
局部变量 | BEGIN END块中 | 只能在BEGIN END中,且为第一句话 | 一般不加@符号,需要限定类型 |
二、存储过程
三、函数
MySQL视图学习
MySQL5添加了对视图的支持,那么它到底是个森么东西呢?我们一起来看看吧!
一、视图的介绍
1、什么是视图?
所谓视图(View),其实是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。意思就是:他存的是你写的SQL查询语句。
2、使用视图有什么好处?
- 重用SQL语句
- 简化复杂的SQL查询
- 使用表的组成部分而不是整个表
- 保护数据,可以给用户授予表的特定访问权限而不是整个表的访问权限。
- 更改数据的格式和表示
而且在视图创建之后,可以用与表基本相同的方式利用它们(查询、过滤、排序···),并且可以将视图联结到其他视图或表,甚至能添加或更新数据。
性能问题:因为视图不包含任何数据,所以每次使用视图,都必须处理查询执行时所需的任一个检索。如果使用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能下降的很厉害。
二、视图的使用
- 创建:
CREATE VIEW AS
- 查看:
SHOW CREATE VIEW viewname
- 删除:
DROP VIEW viewname
- 更新:先删除再创建,或者
CREATE OR REPLACE VIEW
三、视图的使用案例
先建表:
1 | SET NAMES utf8mb4; |
1、创建视图
1 | CREATE VIEW pro_cate AS |
2、查看视图
1 | SHOW CREATE VIEW pro_cate |
查询结果如下所示:
View:
pro_cate
Create View:
CREATE ALGORITHM=UNDEFINED DEFINER=
root@
%SQL SECURITY DEFINER VIEW
pro_cateAS select
product.
product_nameAS
product_name,
category.
category_nameAS
category_name,
product.
product_priceAS
product_pricefrom (
productjoin
categoryon((
product.
product_category=
category.
id)))
collation_connection:
utf8mb4_general_ci
character_set_client:
utf8mb4
3、更新视图
1 | CREATE OR REPLACE VIEW pro_cate AS |
4、删除视图
1 | DROP VIEW pro_cate |
四、在视图里增删改数据
不建议!
阅读笔记2021-05-23
Java多线程编程
Java语言提供了非常优秀的多线程支持,程序可以通过非常简单的方式来启动多线程,接下来就让我们一起来学习Java多线程编程的相关知识吧,包括:创建、启动、控制线程,以及多线程的同步操作,还有通过Java内建支持的线程池来提高多线程的性能。
一、线程概述
每个运行的程序就是一个进程,而当一个程序运行时,内部可能有多个顺序执行流,每个顺序执行流就是一个线程。
1、线程和进程
a、进程
程序进入内存运行时,就变成了一个进程(process),进程是处于运行过程中的程序,并且具有一定的独立性,进程是系统进行资源调度和分配的一个独立单位。一般而言,进程具有如下三个特征:
- 独立性:
- 动态性:
- 并发性:
并发行和并行性是两个不同的概念:
- 并行:同一时刻,多个指令在多个处理器上同时处理
- 并发:同一时刻只能有一条指令执行,但是多个进程指令被快速轮换执行,适得其在宏观上具有多个进程同时执行的效果
2、多线程的优势
二、线程的创建和启动
1、继承Thread类创建线程类
1 | public class FirstThread extends Thread { |
2、实现Runnable接口创建线程类
1 | public class SecondThread implements Runnable { |
3、使用Callable和Future创建线程
1 | public class ThirdThread { |
4、创建线程的三种方式对比
三、线程的生命周期
1、新建和就绪状态
2、运行和阻塞状态
3、线程死亡
四、控制线程
1、join线程
1 | public class JoinThread extends Thread { |
2、后台线程
1 | public class DaemonThread extends Thread { |
3、线程睡眠:sleep
1 | public class SleepTest { |
4、改变线程优先级
1 | public class PriorityTest extends Thread { |
五、线程同步
1、线程安全问题
a、定义账户类:
1 | public class Account { |
b、定义取钱线程类:
1 | public class DrawThread extends Thread { |
c、取钱逻辑:
1 | public class DrawTest { |
2、同步代码块
将上面的 DrawThread
修改成如下形式:
1 | public class DrawThread extends Thread { |
3、同步方法
4、释放同步监视器的锁定
5、同步锁(lock)
6、死锁及常用处理策略
1 | class A { |
六、线程通信
1、传统的线程通信
a、定义账户类:
1 | @Data |
b、定义取钱线程
1 | public class DrawThread extends Thread { |
c、定义存钱类:
1 | public class DepositThread extends Thread { |
2、使用Condition控制线程通信
1 | public class Account { |
3、使用阻塞队列(Blocking Queue)控制线程通信
阻塞队列简单使用:
1 | public class BlockingQueueTest { |
使用 BlockingQueue(阻塞队列)
实现线程通信
1 | //生产者,往队列里放元素 |
七、线程组和未处理的异常
1 | //线程类 |
下面程序为主线程设置了异常处理器,当主线程运行抛出未处理异常时,该异常处理器将会起作用:
1 | //定义自己的异常处理器 |
八、线程池
1、使用线程池管理线程
1 | public class ThreadPoolTest { |
2、使用ForkJoinPool利用多CPU
1 | //继承RecursiveAction来实现"可分解"的任务 |
下面程序示范使用了 RecursiveTask
对一个长度为100的数组元素值进行累加
1 | //继承RecursiveTask来实现"可分解"的任务 |
九、线程相关类
1、ThreadLocal类
1 | class Account { |
2、包装线程不安全的集合
1 | //使用 Collections 的 synchronizedMap 方法将一个HashMap包装成线程安全的类 |
3、线程安全的集合类
4、Java9新增的发布-订阅框架
1 | //创建我自己的订阅者 |
十、本章小结
spring发送异步消息
一、使用JMS发送消息
JMS是一个Java标准,定义了使用消息代理(message broker)的通用API。Spring通过基于模板的抽象为JMS的功能提供了支持,这个模板就是JmsTemplate。借助JmsTemplate,我们可以非常容易地在消息生产方发送队列和主题消息,在消费者那一方,也能够非常容易的接收消息。Spring还提供了消息驱动POJO的理念:这是一个简单的Java对象,能够以异步的方式响应队列或主题上到达的消息。
1、搭建JMS环境
首先在项目中添加依赖:
1 | <dependency> |
接下来在yml配置文件里添加:
1 | spring: |
这会让Spring创建到 Artemis
的代理连接,让 Attemis
代理监听 47.107.73.216
的端口61617,他还为应用代理设置了代理交互的凭证(可选)。
2、使用JmsTemplate发送消息
将 JMS start
依赖添加到构建文件之后,Spring Boot会自动配置一个JmsTemplate,我们可以将它注入到其他bean中,使用它来发送和接收消息。