Java的NIO入门
Java的NIO入门
一、介绍
Java NIO是从Java 1.4版本开始引入的一个新的IO ,在传统的IO模型中,使用的是同步阻塞IO,也就是blocking IO。
而NIO指的是New IO,代指新IO模型。有些博客指的是not blocking IO,非阻塞IO,叫哪种都行,都是NIO。
在NIO中,最重要的两个东西就是缓冲Buffer和通道Channel了。继续往下看!
二、Buffer
缓冲区Buffer,可以理解成是一个含数组的容器对象,该对象提供了一组方法,可以更轻松地使用其中的数据。该对象记录了一些状态值,能够跟踪和记录缓冲区的状态变化情况。
后续的通道Channel的读取、写入操作都经过缓冲。
Buffer是一个抽象类,它的实现类有很多,但我们最常用的还是ByteBuffer,因为要和字节打交道嘛
它里面有四个最重要的状态值,分别是
mark:标记
position:当前读取或存储数据的索引位置,位置
limit:当前缓冲最大可以写入或读取到的位置,极限
capacity:当前缓冲的容量,容量
其中,mark<= position&l ...
数据库的三大范式
数据库的三大范式
一、介绍
没有规矩,不成方圆。这句话在数据库的规范中同样适用,所以就有了这几项规定,数据库的三大范式。
我相信很多人都听过三大范式,面试题中也经常会问到,什么是数据库三大范式,这太常见了。
以前我只是机械式的回复面试官,但以后不会,不仅要学会说概念说规范,还能从实际出发,要不要严格遵守三大范式。
二、概念
1)第一范式
概念:每一个列都是不可再分的列
例如下面这张表,由于region字段可以再细分为省份province和城市city,所以此表将不满足第一范式
name
sex
region
半月无霜
男
广东省广州市
将region字段拆分后,满足了第一范式
name
sex
province
city
半月无霜
男
广东省
广州市
2)第二范式
概念:在满足第一范式后,消除非主属性对主属性的部分函数依赖
先看看这张订单表,订单编号、商品ID、用户ID作为联合主键
每一个字段本身都不可再分,满足第一范式。
但其中有个字段用户名称,它依赖于用户ID,所以此表并不满足第二范式
订单编号
商品ID
用户ID
数量
金额
用户名称 ...
SpringBoot整合socket通信
SpringBoot整合socket通信
一、介绍
很多人都不太理解socket通信指的是什么,简单来讲,它是一个完成两个应用程序之间的数据传输的东西。
socket是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象,一个socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。
本次使用Java语言去实现socket通信,用的SpringBoot框架,当然直接使用main方法启用也是没有问题的。
二、实现
1)服务端
先设置一下需要用到的配置,主要就是这个端口号,我觉得放配置文件中会比较好
12socket-port: testSocket: 2333
socket服务端启动类
此处使用到了bean的初始化,如果不熟悉的话,使用静态代码块也是一样的
1234567891011121314151617181920212223242526272829303132333435363738394041424344packag ...
SpringBoot整合MyBatis多数据源
SpringBoot整合MyBatis多数据源
一、介绍
在平常的项目中,我们有连接数据库的需求。一般都是一个项目一个数据库,但也有例外需要连接多个数据库的。
那么该如何配置,可以达到多数据源的需求呢。
本次为SpringBoot与MyBatis的整合,其实掌握了需要配置什么,也很容易进行复刻。
二、配置
1)数据库准备
首先,我们先准备三个数据库吧,这边都使用MySQL了,实际可以是不同的数据库
test数据库
1234567891011create database `test` character set utf8mb4 collate utf8mb4_general_ci;CREATE TABLE `sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '用户名', `password` varchar(128) NOT NULL COMMENT '密码', PRIMARY KEY (`id`)) EN ...
SpringBoot使用矩阵传参
SpringBoot使用矩阵传参
一、介绍
在平时,我们在进行请求接口时,我们一个请求url的样子往往是下面这样子的
1http://localhost:8080/user/get?name=半月&age=18
对于上面的请求url,我们只需要使用@RequestParam注解就可以将其获取,十分简单。
那么,对于下面的这个矩阵传参的url,我们该如何进行获取呢?
123http://localhost:8080/user/get;name=半月;age=18http://localhost:8080/user/delete;id=11,12,13;status=1
这时候,我们就该使用到@MatrixVariable这个注解了,具体使用如下。
二、使用
1)基本使用
在springBoot中,默认是去掉了url分号后的内容。如此一来,我们在使用矩阵传参时,需要对其进行开启。
1234567891011121314151617package com.banmoon.test.config;import org.springframework.context.annotation ...
Java的函数式接口以及Lambda表达式
Java的函数式接口以及Lambda表达式
一、介绍
在java中,大家肯定使用过lambda表达式吧,这是适用于函数式接口的一种便捷写法。
那么什么是函数式接口,简单点来说,一个接口中有且只有一个需要实现的方法,那么这个接口就是函数式接口。
如果一个接口,你想定义为函数式接口,建议加上注解@Functionionallnterface,标注这个接口成为函数式接口,用来进行提示。
例如,多线程的Runnable接口就是一个函数式接口,如下
1234567package java.lang;@FunctionalInterfacepublic interface Runnable { public abstract void run();}
所以,我们在使用多线程时,可以使用lambda表达式进行简化
1234567891011121314151617181920212223242526package com.banmoon.test;import org.junit.jupiter.api.Test;public class SomethingTest ...
SpringBoot使用AOP详解
SpringBoot使用AOP详解
一、介绍
AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
好吧,以上来自百度百科
我知道,大家肯定是一头雾水。我们直接进入使用,用实践来进行理解。
二、使用
1)初识术语
本来很想直接上代码,但是不行,需要先过一遍AOP的概念术语,相关的专业名词。
先来看看下面这个需求,现在有一堆接口,需要统计他们耗时的一个需求,我们应该怎么做?
笨方法,在每个接口方法前后,放置起止时间进行计算。为什么说这是笨方法,自然是笨啦
一个两个还行,方法多了该怎么办
起止时间的计算是一种系统功能,原本方法中的功能是业务功能。两种不同的功能混杂在一起,非常难受
对架构,对维护不友好
那么上述的问题,可以使用AOP来解决,我 ...
Redis实现消息队列及延迟队列
Redis实现消息队列及延迟队列
一、介绍
在选择消息中间件的问题上,我们有很多解决方案,具体选择哪一种还是要根据实际的情况来进行确认。
如果直接有成熟的第三方消息中间件,能用就直接用,如rabbitMq、kafka等。
再如果,推送的消息比较简单,又恰好有个redis,那么就选择redis吧。
下面,将进行介绍,如果使用redis作为消息队列,我们该如何编写这段程序。
二、消息队列
前置工作,本次使用的工程框架直接是springBoot,其他maven依赖就不贴出来了,主要是要有这个redis的依赖
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
有了依赖,记得在application.yml配置文件中加入对应redis的配置信息
12345spring: redis: databas ...
MySQL自定义函数和存储过程
MySQL自定义函数和存储过程
一、介绍
MySQL函数是一些具有特定功能的方法,在编写sql时,可以进行使用,从而完成对数据的处理。
存储过程的话,更像是一些特定功能的sql组合而成的sql语句集合,由于它的事先编译,通过传入参数来执行这个过程,可以使得,在某些场景下利用存储过程的情况,达到一些快捷方便的功能。
一起来看看他们的定义和写法把。首先,加一下基础的表格
1234567891011-- 用户表CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL COMMENT '姓名', `sex` varchar(2) DEFAULT NULL COMMENT '性别', `age` tinyint(4) DEFAULT NULL COMMENT '年龄', `birthday` datetime DEFAULT NULL COMMENT '生日', PRIMAR ...
盘点MySQL中常用的函数
盘点MySQL中常用的函数
一、介绍
在平常使用MySQL的过程中,我们常常会使用到其中的函数。有些函数常用,就会非常熟悉,但有些不经常使用就会十分生疏。
避免使用到的时候,到处去翻博客,干脆自己总结,记录一下,顺便也加深一下自己的印象。
二、函数
1)聚合函数
聚合函数又称为组函数,一般结合分组进行使用,用来统计和计算。
聚合函数在平常的sql中十分常用,不需要查阅文档就应该保证熟练使用
12345678910111213141516171819-- avg 计算平均值select avg(age) from tb_user;-- count,计算行数select count(1) from tb_user;select count(*) from tb_user;select count(name) from tb_user;-- max,最大数select max(age) from tb_user;-- min,最小数select min(age) from tb_user;-- sum,求和select sum(age) from tb_user;-- group_conca ...