自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (2)
  • 收藏
  • 关注

原创 (二)Java NIO 网络编程:Netty框架专题

Netty并没有使用NIO中提供的ByteBuffer来进行数据装载,而是自行定义了一个ByteBuf类。那么这个类相比NIO中的ByteBuffer有什么不同之处呢?写操作完成后无需进行flip()翻转。具有比ByteBuffer更快的响应速度。动态扩容。...//index被分为了读和写,是两个指针在同时工作//mark操作也分两种//最大容量,没错,这玩意能动态扩容可以看到,读操作和写操作分别由两个指针在进行维护,每写入一次,向后移动一位,每读取一次,也是向后移动一位,当然。

2023-11-16 08:54:33 129

原创 (一)Java NIO 网络编程:基础内容

虽然这样看起来比较合理,但是随着客户端数量的增加,如果要保持持续通信,那么就不能摧毁这些线程,而是需要一直保留(但是实际上很多时候只是保持连接,一直在阻塞等待客户端的读写操作,IO操作的频率很低,这样就白白占用了一条线程,很多时候都是站着茅坑不拉屎),但是我们的线程不可能无限制的进行创建,总有一天会耗尽服务端的资源,那么现在怎么办呢,关键是现在又有很多客户端源源不断地连接并进行操作,这时,我们就可以利用NIO为我们提供的多路复用编程模型。这样就不会因为占着茅坑不拉屎导致线程无限制地创建下去了。

2023-11-16 08:53:48 105

原创 (三)Java JUC 并发编程:并发编程进阶

这里我们创建了一个核心容量为2,最大容量为4,等待队列长度为2,空闲时间为3秒的线程池,现在我们向其中执行6个任务,每个任务都会进行1秒钟休眠,那么当线程池中2个核心线程都被占用时,还有4个线程就只能进入到等待队列中了,但是等待队列中只有2个容量,这时紧接着的2个任务,线程池将直接尝试创建线程,由于不大于最大容量,因此可以成功创建。一个大任务分割为若干个互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应。

2023-11-16 08:52:33 98

原创 (二)Java JUC 并发编程:并发编程核心

AtomicInteger:原子更新intAtomicLong:原子更新longAtomicBoolean:原子更新boolean那么,原子类和普通的基本类在使用上有没有什么区别呢?int i = 1;//如果想实现i += 2这种操作,可以使用 addAndGet() 自由设置delta 值。

2023-11-16 08:51:42 273

原创 (一)Java JUC 并发编程:再谈多线程

锁消除和锁粗化都是在运行时的一些优化方案,比如我们某段代码虽然加了锁,但是在运行时根本不可能出现各个线程之间资源争夺的情况,这种情况下,完全不需要任何加锁机制,所以锁会被消除。中学习过,在我们的CPU中,一般都会有高速缓存,而它的出现,是为了解决内存的速度跟不上处理器的处理速度的问题,所以CPU内部会添加一级或多级高速缓存来提高处理器的数据获取效率,但是这样也会导致一个很明显的问题,因为现在基本都是多核心处理器,每个处理器都有一个自己的高速缓存,那么又该怎么去保证每个处理器的高速缓存内容一致呢?

2023-11-16 08:50:49 41

原创 (三)Java JVM 虚拟机:类与类加载

紧接着,就是类的常量池了,这里面存放了类中所有的常量信息(注意这里的常量并不是指我们手动创建的final类型常量,而是程序运行一些需要用到的常量数据,比如字面量和符号引用等)由于常量的数量不是确定的,所以在最开始的位置会存放常量池中常量的数量(是从1开始计算的,不是0,比如这里是18,翻译为10进制就是24,所以实际上有23个常量)实际上,最关键的一步是编译,因为只有经历了编译之后,我们所编写的代码才能够翻译为机器可以直接运行的二进制代码,并且在不同的操作系统下,我们的代码都需要进行一次编译之后才能运行。

2023-11-16 08:48:51 57

原创 (二)Java JVM 虚拟机:内存管理

这时,老年代肯定担保人是当不成了,那么这样的话,首先会判断一下之前的每次垃圾回收进入老年代的平均大小是否小于当前老年代的剩余空间,如果小于,那么说明也许可以放得下(不过也仅仅是也许,依然有可能放不下,因为判断的实际上只是平均值,万一这一次突然非常大呢),否则,会先来一次Full GC,进行一次大规模垃圾回收,来尝试腾出空间,再次判断老年代是否有空间存放,要是还是装不下,直接抛出OOM错误,摆烂。这是一款单线程的垃圾收集器,也就是说,当开始进行垃圾回收时,需要暂停所有的线程,直到垃圾收集工作结束。

2023-11-16 08:47:49 333

原创 (一)Java JVM 虚拟机:走进JVM

首先我们要了解虚拟机的具体定义,我们所接触过的虚拟机有安装操作系统的虚拟机,也有我们的Java虚拟机,而它们所面向的对象不同,Java虚拟机只是面向单一应用程序的虚拟机,但是它和我们接触的系统级虚拟机一样,我们也可以为其分配实际的硬件资源,比如最大内存大小等。并且Java虚拟机并没有采用传统的PC架构,比如现在的HotSpot虚拟机,实际上采用的是基于栈的指令集架构,而我们的传统程序设计一般都是基于寄存器的指令集架构,这里我们需要回顾一下计算机组成原理中的CPU结构:其中,

2023-11-16 08:46:22 192

原创 JavaSE 基础内容 - JavaSE 笔记(八)GUI程序开发

在Java正式推出的时候,它还包含一个用于基本GUI程序设计的类库,名字叫 Abstract Window Toolkit,简称AWT,抽象窗口工具包,我们可以直接使用Java为我们提供的工具包来进行桌面应用程序的开发。只不过这套工具包依附于操作系统提供的UI,具体样式会根据不同操作系统提供的界面元素进行展示。

2023-11-14 08:36:32 114

原创 JavaSE 基础内容 - JavaSE 笔记(七)多线程与反射

我们发现,现在得到的结果就是我们想要的内容了,因为在同步代码块执行过程中,拿到了我们传入对象或类的锁(传入的如果是对象,就是对象锁,不同的对象代表不同的对象锁,如果是类,就是类锁,类锁只有一个,实际上类锁也是对象锁,是Class类实例,但是Class类实例同样的类无论怎么获取都是同一个),但是注意两个线程必须使用同一把锁!实际上,Java程序中的每个线程并不是平均分配CPU时间的,为了使得线程资源分配更加合理,Java采用的是抢占式调度方式,优先级越高的线程,优先使用CPU资源!

2023-11-10 14:10:56 422

原创 JavaSE 基础内容 - JavaSE 笔记(六)集合类与IO

JDK提供了一套用于IO操作的框架,为了方便我们开发者使用,就定义了一个像水流一样,根据流的传输方向和读取单位,分为字节流InputStream和OutputStream以及字符流Reader和Writer的IO框架,当然,这里的Stream并不是前面集合框架认识的Stream,这里的流指的是数据流,通过流,我们就可以一直从流中读取数据,直到读取到尽头,或是不断向其中写入数据,直到我们写入完成,而这类IO就是我们所说的BIO,同理,当向外部设备写入数据时,也是由缓冲区处理,而不是直接向外部设备写入。

2023-11-10 14:09:50 65

原创 JavaSE 基础内容 - JavaSE 笔记(五)泛型程序设计

首先还是一路向左,到达结点D,此时结点D没有左子树了,接着看结点D还有没有右子树,发现也没有,左右子树全部遍历完成,那么此时再打印D,同样的,D完事之后就回到B了,此时接着看B的右子树,发现有结点E,重复上述操作,E也打印出来了,接着B的左右子树全部OK,那么再打印B,接着A的左子树就完事了,现在回到A,看到A的右子树,继续重复上述步骤,当A的右子树也遍历结束后,最后再打印A结点。题干很明确,就是需要我们去对这些括号完成匹配,如果给定字符串中的括号无法完成一一匹配的话,那么就表示匹配失败。

2023-11-10 14:06:03 57

原创 JavaSE 基础内容 - JavaSE 笔记(四)面向对象高级篇

所有的包装类层次结构如下://将10包装为一个Integer类型的变量//类中实际上就靠这个变量在存储包装的值//将int类型值作为包装类型使用这是怎么做到的?为什么一个对象类型的值可以直接接收一个基本类类型的值?//上面的写法跟这里是等价的这里本质上就是被自动包装成了一个Integer类型的对象,只是语法上为了简单,就支持像这样编写。int a = i;//通过此方法变成基本类型int值//直接自动拆箱成基本类型参与到计算中。

2023-11-10 14:04:59 119

原创 JavaSE 基础内容 - JavaSE 笔记(三)面向对象基础篇

前面我们介绍了什么是类,什么是对象,首先我们就来看看如何去定义一个类。比如现在我们想要定义一个人类,我们可以右键src目录,点击创建新的类:我们在对类进行命名时,一般使用英文单词,并且首字母大写,跟变量命名一样,不能出现任何的特殊字符。可以看到,现在我们的目录下有了两个.java源文件,其中一个是默认创建的Main.java,还有一个是我们刚刚创建的类。可以发现,这不是跟一开始创建的Main中写的格式一模一样吗?

2023-11-10 14:02:14 318

原创 JavaSE 基础内容 - JavaSE 笔记(二)面向过程编程

注意这里的bit跟我们生活中的网速MB/s是不一样的,小b代表的是bit,大B代表的是Byte字节(8bit = 1Byte字节),所以说我们办理宽带的时候,100Mbps这里的b是小写的,所以说实际的网速就是100/8 = 12.5 MB/s了。斐波那契数列:1,1,2,3,5,8,13,21,34,55,89...,不难发现一个规律,实际上从第三个数开始,每个数字的值都是前两个数字的和,现在请你设计一个Java程序,可以获取斐波那契数列上任意一位的数字,比如获取第5个数,那么就是5。

2023-11-10 13:57:02 51

原创 JavaSE 基础内容 - JavaSE 笔记(一)走进Java语言

*注意:**如果你已经完成了《C语言程序设计》视频教程的学习,可以直接跳过此部分。前面我们了解了一下计算机的大致原理和组成结构,但是光有这一套硬件可不行,如何让这一套硬件按照我们想要的方式运作起来,也是非常重要的,这时我们就需要介绍操作系统了。操作系统(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互操作的界面。

2023-11-10 13:49:50 44

原创 (十四)消息中间件MQ详解及四大MQ比较

一、消息中间件相关知识1、概述消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。2、消息中间件的组成 2.1 Broker消息服务器,作为server提供消息核心服务 2.2 Producer消息生产者,业务的发起方,负责生产...

2021-02-03 08:41:41 467

原创 (十三)RabbitMQ使用详解

RabbitMQ是基于AMQP的一款消息管理系统。AMQP(Advanced Message Queuing Protocol),是一个提供消息服务的应用层标准高级消息队列协议,其中RabbitMQ就是基于这种协议的一种实现。常见mq:ActiveMQ:基于JMS RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好 RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会 Kafka:分布式消息系统,高吞吐量Java Client生产者和消费者都属于客户端,

2021-02-03 08:31:58 331 1

原创 (十二)C3P0连接池使用教程

一般我们在项目中操作数据库时,都是每次需要操作数据库就建立一个连接,操作完成后释放连接。因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉。而每次新建连接都需要140毫秒左右的时间,所以耗费时间比较多。若使用C3P0连接池来池化连接,随时取用,则平均每次取用只需要10-20毫秒。这在高并发随机访问数据库的时候对效率的提升有很大帮助。 C3P0连接池会根据你的配置来初始化N个数据库连接,空闲T时间后连接过期又会自动新建K个连接使得连接池总有空闲的数据库连接...

2021-02-02 10:14:25 734

原创 (十一)MyBatis的动态SQL:trim元素

trim标记是一个格式化的标记,可以完成select,update,insert语句的格式化操作。trim元素的主要功能有四个:(1)可以在包含的内容前加上某些前缀,与之对应的属性是prefix;(2)也可以在包含的内容后加上某写后缀,与之对应的属性是suffix;(3)可以把包含内容的首部某些内容覆盖,即忽略,对应的属性是prefixOverrides(4)也可以把包含内容的尾部的某些内容覆盖,对应的属性是suffixOverrides。以下举例说明一下trim元素的应用场景:例子1:.

2021-02-02 09:56:07 693

原创 (十)IDEA添加mybatis-mapp.xml文件

1.点击file–Settings–Editor–file and Code Templates2.配置mybatis-mapper.xml的网址,点击file–Settings–ages& Frameworks–Schmas and DTDs3.创建mapper.xml文件

2021-02-02 09:35:14 159

原创 (九)IDEA便捷配置MyBatis.xml文件

在使用IDEA新建mybatis.xml经常需要手动复制粘贴之前的xml配置。这样也比较麻烦。我们可以IDEA进行关于xml的配置1.创建MyBatis Config的模版1.打开新增2.查看编辑页面查看编辑页面我们看到Name:为我们新增模版的文件名称。Extension:为我们新增文件的类型3.新增MyBatis全局xml配置新增MyBatis全局xml配置<?xml version="1.0" encoding="UT...

2021-02-02 09:23:10 500

原创 (八)IT_开发常用单词大全

开发单词 单词 音标 注释 a collection of… 一组… a couple of… 几个 a kind of 一种 a number of… 许多… ...

2021-01-31 10:36:23 5579 3

原创 15-多对多做左连接查询(查询老师,并且把关联的学生也查出来)

多对多左连接查询左连接查询老师对学生是多对多的关系,把中心放在老师上,一个老师可以教多个学生,实际上老师对学生也可以理解为一对多的关系。左连接查询场景:查询老师,并且把关联的学生也查出来。Teacher.java 映射文件:@Getter@Setter@ToStringpublic class Teacher { private Integer teacher_id; private String teacher_name; List<Stud.

2021-01-30 23:27:12 638 1

原创 14-多对多关系建表

多对多关系建表多对多关系 多对多关系建表原则 domain多对多关系一个老师可以教多个学生,一个学生可以被多个老师教。 一个学生可以选择多门课程,一门课程可以被多个学生选择。 一个用户可以选择多个角色,一个角色可以被多个用户选择。多对多关系建表原则原则:创建一个中间表,中间表至少有两个字段,分别作为外键指向多对多双方的主键。实例分析:一个老师可以教多个学生,一个学生可以被多个老师教。首先,建立学生表:然后建立老师表:还需要建立一个中间表:给关系表设置外键,分别指.

2021-01-30 23:26:43 9562

原创 13-一对多左连接查询&分步查询(查询所有客户及客户对应的订单)

查询所有客户以及对应的订单左连接查询(不支持懒加载) 分步查询(支持懒加载)左连接查询(不支持懒加载)场景:我们想要查询出所有的客户,并且把每个客户对应的订单也查出来。这时候可以使用左连接查询。那么如何在 MyBatis 中实现左连接查询呢?给客户的 domain 增添一个字段来表示对应的订单:private List<Order> orders = new ArrayList<>();@Setter@Getter //使用注解生成 get 与 s.

2021-01-30 23:26:14 1225 3

原创 12-多对一添加操作(添加新客户及对应的新订单)

多对一添加操作场景:现在想要添加一个新客户对应一个新订单,那么要怎么来添加呢?分析:由于添加订单时,客户对订单是一对多的关系,所以添加订单的时候必须要指明一位客户。要同时添加新客户以及一个新订单,并且两者是对应关系,那么应当先将客户添加进来,再添加订单,同时这个订单的外键(cust_id)指向了刚刚添加的客户的主键(cust_id)。CustomerMapper 接口中添加一个方法:/*保存客户*/public void insertCustomer(Customer custo.

2021-01-30 23:25:43 422

原创 11-分步查询懒加载

分步查询——懒加载模式懒加载模式示例 不使用懒加载 使用懒加载 aggressiveLazyLoading lazyLoadTriggerMethods所谓懒加载,也称延时加载,是指不一下子加载完全部资源。需要用到哪些资源才去加载这些资源,用不到的资源,就不去加载他,以达到节约资源,优化的目的。分步查询中存在懒加载现象。懒加载模式示例不使用懒加载首先看一下不使用懒加载的情况下,是如何运行的。我们执行的代码,不涉及到 customer 的资源,但是如果不适用懒加.

2021-01-30 23:25:26 225

原创 10-多对一左连接查询&分步查询(查询所有订单及订单对应的客户)

左连接查询(级联查询)回顾一下:左连接查询,将左边表(order)里的全部内容查出,右边表(customer)查满足条件的。SELECT * FROM `order` AS o LEFT JOIN `customer` AS c on o.cust_id = c.cust_id;1那么在 MyBatis 中如何查询呢?首先我们已经将 domain 类与数据库属性对应,并且创建好了 Mapper 工程,主要来看看 Mapper 的内容:在 OrderMapper 接口中我们定义了

2021-01-30 23:24:56 833 1

原创 09-一对多关系建表

多表操作表之间关系 一对多关系建表原则表之间关系 一对一关系:一夫一妻。 一对多关系: 一个部门有多个员工,一个员工只能属于某一个部门。 一个班级有多个学生,一个学生只能属于一个班级。 多对多关系: 一个老师可以教多个学生,一个学生可以被多个老师教。 一个学生可以选择多门课程,一门课程可以被多个学生选择。 一个用户可以选择多个角色,一个角色可以被多个用户选择。 一对多关系建表原则原则:在多的一方创建一个外键,指向一的一方的主键。实例分析:一个客户.

2021-01-30 23:24:25 2671

原创 08-输出类型

输出类型输出简单类型 输出 Map 类型 key:列名 value:列名对应的值 key:自己指定的列 value:自定义对象 resultMap输出简单类型CustomerMapper.java:返回值为简单类型。public interface CustomerMapper { /*查询总数*/ public Integer getAccountCustomer();}CustomerMapper.xml :返回值 resultType 为.

2021-01-30 23:23:49 289

原创 07-MyBatis 核心配置文件

MyBatis 核心配置文件properties 定义属性及读取属性文件 settings 设置运行时行为 typeAliases 类型别名 定义单个别名 批量定义别名 typeHandlers 类型处理器 Plugins(后续有文章专门介绍这个) Environments 运行环境 databaseIDProvider 定义数据库厂商 mappers 加载映射文件 mapper resource=" " mapper class=" " package nam

2021-01-30 23:22:44 121

原创 06-Mapper动态代理

Mppaer 动态代理创建 Mapper 工程 定义接口的要求 测试类 Mapper 中参数传递 单个参数 多个参数 @param命名参数 多个参数封装成 Map 多个参数之 POJO 参数处理源码分析之前我们一直都使用传统开发模式DAO,即定义接口,然后定义实现类。这个其实是较为繁琐的,MyBatis 中提供了 Mapper 动态代理的方法,操作起来十分简洁,只需要定义满足要求的接口,然后通过 sqlSession 获取到 Mapper对象,便可通过.

2021-01-30 23:21:44 223

原创 05-传统开发模式DAO

传统开发模式DAO定义接口 CustomerDao.java 实现接口 CustomerDaoImpl.java 测试类在传统开发模式DAO下,我们自己先定义好接口,然后再去定义实现类,在实现类中实现接口的操作。到时候只需要创建一个 dao 对象,即可调用其中的方法。定义接口 CustomerDao.java在 dao 包下,创建一个接口文件 CustomerDao.java,在其中写上数据库的各种操作的抽象方法。public interface CustomerDao { .

2021-01-29 17:11:40 352

原创 04-插入操作&更新操作&删除操作

保存更新删除插入操作 获取插入的最后一个id 更新操作 删除操作查询操作在之前的笔记中~插入操作映射文件 Customer.xml :插入数据的标签为 insert,与查询 select 区分开来。parameterType 是输入参数类型,这里指定为 Customer 对象,即需要传入一个 Customer 类型的参数。由于传入参数不是单个简单类型值,#{} 中的名字必须与类的属性对应。映射文件中的代码如下:<?xml version="1.0" en.

2021-01-29 17:10:43 1989 4

原创 03-映射文件的sql语句中 #{} 和 ${} 的区别以及实现模糊查询

映射文件的sql语句中 #{} 和 ${} 区别以及实现模糊查询sql 语句中的 #{} #{} 模糊查询错误用法 #{} 实现模糊查询 sql 语句中的 ${} ${} 实现模糊查询 #{} 与 ${} 对比sql 语句中的 #{}表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值。 自动进行 java 类型和 jdbc 类型转换。 可以有效防止 sql 注入。 可以接收简单类型值或 pojo 属性值。 如果 .

2021-01-29 17:09:28 571

原创 02-MyBatis配置SQL打印

MyBatis 配置SQL打印在 SqlMappingConfig.xml 中配置以下代码:<!--配置sql打印--><settings> <setting name="logImpl" value="STDOUT_LOGGING"/></settings>运行效果:会显示 SQL 语句,查询结果,总共几条数据,最后把数据封装成对象。Opening JDBC ConnectionCreated connection .

2021-01-29 17:08:18 148 3

原创 01-MyBatis入门程序

MyBatis入门程序1. 下载 Mybatis 核心包 2. 创建工程,引入 MyBatis 核心包及依赖包 3. 创建 customer 表,建立与表对应的 domain 使用 lombok,开启注解 创建 Customer 类 4. 创建 MyBatis 核心配置文件 SqlMappingConfig.xml 5. 创建表对象的关系映射 Mapping 文件编写 sql 语句 6. 在核心配置文件当中引入 Mapping 7. 创建工厂,执行 sql 语句 抽取工具类

2021-01-29 17:07:06 168 4

原创 0-MyBatis简介

MyBatis简介简介 MyBatis 历史 MyBatis特点 为什么要使用 MyBatis? JDBC 缺点 Hibernate 缺点 MyBatis 简介MyBatis 历史MyBatis 原是 apache 的一个开源项目 iBatis;2010年6月这个项目由 apache software foundation 迁移到了 google code,并且改名为MyBatis 。iBATIS 一词来源于 “internet” 和 “ab.

2021-01-29 17:03:05 70

原创 (十一)Spring 基础注解(对象创建相关注解、注入相关注解)

注解编程注解基础概念 注解的作用 Spring 注解的发展历程 Spring 基础注解(Spring 2.x) 对象创建相关注解 @Component @Repository、@Service、@Contoller @Scope @Lazy 生命周期注解 @PostConstruct、@PreDestroy 注入相关注解 用户自定义类型 @Autowired @Autowired 细节 JDK 类型

2021-01-29 16:58:11 392

基于SpringBoot实现扫码支付.rar

众多的App或Web网站,一个二维码扫码支付功能是必备 的,那么如何实现支付功能呢?这里有详细的教程包括代码!

2021-02-02

Java_基于人脸识别的登录与注册.rar

通过java开发人脸识别方式的项目的登录与注册模块

2021-02-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除