- 博客(109)
- 资源 (10)
- 收藏
- 关注
原创 雪花算法详解
网盘分享地址一、分布式ID🛵1、为什么需要分布式ID🍬(1)、高并发场景分布式高并发的环境下,常见的就是12306节日订票,在大量用户同是抢购一个方向的票,毫秒级的时间下可能生成数万个订单,此时为确保生成订单ID的唯一性变得至关重要,此时秒杀环境下,不仅要保障ID唯一性,还得确保ID生成的优先度现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生对于水平分表就需要保证表中 id 的全局唯一性对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之
2025-10-27 13:58:38
976
原创 3.聊天室示例
测试项目SimpleChat01(2)、定义配置类(3)、定义bean(4)、定义核心处理程序(5)、定义拦截器(6)、定义客户端在resources/static目录下创建index.html(7)、测试启动项目在浏览器1中访问http://localhost:8080/在浏览器2中访问http://localhost:8080/在任一浏览器中发送消息,其他浏览器中都能收到消息登录的用户名是任意的,密码是123用户登录成功之后,就会把session数据(也就是用户数据),其中写
2025-10-26 11:47:16
977
原创 2.Websocket详解
定义一个配置类实现WebSocketConfigurer接口添加@EnableWebSocket注解,让Spring boot项目知道启用了spring的WebSocket功能/*注入websocket的核心处理器*/@Resource/*注入自定义的拦截器*/@Resource@Overrideregistry.addHandler(myWsHandler, "/my/websocket")// 设置主处理程序与监听的连接地址。
2025-10-26 11:28:25
826
原创 1.MyBatis概述
MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUDMyBatis在三层架构中负责持久层的,属于持久层框架github地址中文官网。
2025-09-08 09:17:18
893
原创 2.MyBatis入门程序
在MyBatis当中,负责执行SQL语句的那个对象叫做SqlSession,SqlSession是专门用来执行SQL语句的,是一个Java程序和数据库之间的一次会话。对于我们当前的单纯的只有mybatis的情况下,如果配置为:MANAGED,那么事务这块是没人管的,没有人管理事务表示事务压根没有开启。这个配置文件的名字必须叫做:logback.xml或者logback-test.xml,不能是其它的名字。这种实现也是可以的,可以看到一些信息(比如:连接对象什么时候创建,什么时候关闭,sql语句是怎样的)
2025-09-08 09:13:31
646
原创 3.MyBatis核心配置文件
MyBatis核心配置文件整理结构如下1、properties配置测试项目mybatis-03-001在properties标签中可以配置很多属性设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值格式说明【使用示例】(2)、类路径加载配置属性properties标签可以从类路径下加载配置文件中的属性注意:properties标签是从类路径下开始查找资源格式说明【使用示例】(3)、绝对路径加载配置属性properties可以使用绝对路径加载配置文件,但是这种写法相当于把路径写死,移植
2025-09-03 18:28:52
801
原创 4.MyBatis框架底层原理
实现功能使用技术:WEB应用的名称:创建数据库表4.1.1.2、创建WEB应用模版中的web.xml中的版本比较低可以从tomcat安装包中的conf目录下的web.xml中复制新的web.xml配置到这里4.1.1.4、配置POM依赖注意:如果使用的是tomcat9以下,则使用包;这里使用的是tomcat11,需要使用包4.1.1.5、配置tomcat配置热部署包删除index.jsp在webapp目录下创建页面success.html页面error1.htmlerr
2025-09-03 18:09:38
1041
原创 5.集成MyBatis
第一步:准备数据库表使用t_car表(汽车表)第二步:IDEA中创建一个模块并引入依赖mysql驱动mybatismybatis-spring:mybatis提供的与spring框架集成的依赖德鲁伊连接池Junit第三步:基于三层架构实现提前创建好所有的包mapperservicemapper第四步:编写beanCar属性私有化提供公开的setter getter和toString第五步:编写mapper接口CarMapper接口定义方法。
2025-09-03 17:59:04
910
原创 6.SQL映射文件
MyBatis 的真正强大在于它的语句映射,这是它的魔力所在,由于它的异常强大,映射器的 XML 文件就显得相对简单如果拿它跟具有相同功能的 JDBC 代码进行对比会发现省掉了将近 95% 的代码MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码XxxMapper.xml整体结构共分为三层头部元素XxxMapper.xml映射文件的头部元素是固定的内容如下schema约束Mybatis3版本的Schema约束如下所示映射文件根节点mappermapper根节点里面只有一个属性,属
2025-09-03 17:54:31
680
原创 7.MyBatis传参形式
参数的类型大体可以分为三种基本类型当参数是一个基本类型的时候,它在XML文件中对应的SQL语句只会使用一个参数例如delete方法JavaBean类型当参数是一个JavaBean类型的时候,它在XML文件中对应的SQL语句会有多个参数例如insert、update方法在实际应用中经常会遇到使用多个参数的情况:将多个参数合并到一个JavaBean中,并使用这个JavaBean作为接口方法的参数这种方法用起来很方便,但并不适合全部的情况,因为不能只为了两三个参数去创建新的JavaBean类集合类型对于参数比较少
2025-09-03 14:20:41
1076
原创 8.MyBatis动态SQL
MyBatis的强大特性之一便是它的动态SQL使用过JDBC或其他类似框架的人都会知道,根据不同条件拼接SQL语句时不仅不能忘了必要的空格,还要注意省略掉列名列表最后的逗号,处理方式麻烦且凌乱MyBatis的动态SQL则能让我们摆脱这种痛苦在MyBatis3之前的版本中,用动态SQL需要学习和了解非常多的标签,现在MyBatis采用了功能强大的OGNL表达式语言消除了许多其他标签以下是MyBatis的动态SQL在XML中支持的几种标签创建测试模块mybatis-dynamic-001pom依赖logb
2025-09-03 14:11:05
801
原创 9.MyBatis缓存
缓存的作用是通过减少IO的方式来提高程序的执行效率mybatis的缓存是将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不再查数据库mybatis缓存包括一级缓存将查询到的数据存储到SqlSession中二级缓存将查询到的数据存储到SqlSessionFactory中或者集成其它第三方的缓存比如EhCache【Java语言开发的】、Memcache【C语言开发的】等缓存只针对于DQL语句,也就是说缓存机制只对应select语句。
2025-09-03 14:00:32
880
原创 10.MyBatis的注解式开发
使用注解就是在接口方法基础上添加需要的注解,并写上相应的SQL语句优点对于需求比较简单的系统,效率较高缺点当SQL有变化时都需要重新编译代码,一般情况下不建议使用注解方式在MyBatis注解SQL中,最基本的就是@Select、@Insert、@Update和@Delete四种,这4个基本注解的参数可以是字符串数组类型,也可以是字符串类型。
2025-09-02 14:49:23
920
原创 11.MyBatis逆向工程
所谓的逆向工程是:根据数据库表逆向生成Java的pojo类、SqlMapper.xml文件、Mapper接口类等要完成这个工作需要借助别人写好的逆向工程插件使用这个插件需要给这个插件配置如下信息。
2025-09-02 14:33:08
1650
原创 14.MySQL锁机制
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性元数据锁(meta data lock),简写MDLMDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上在事务A中执行DML语句时会对操作的数据添加行锁,在事务B中想要添加表锁时,会检查所有记录是否有行锁,以防止行锁与表锁的冲突。
2025-07-07 23:47:33
836
原创 15.MySQL事务
尽管数据库为用户提供了锁的DML操作方式,但直接使用锁管理是非常麻烦的,因此数据库为用户提供了自动锁机制只要用户指定会话的事务隔离级别,数据库就会分析事务中的SQL吾句,然后自动为事务操作的数据资源添加适合的锁此外数据库还会维护这些锁,当一个资源上的锁数目太多时,自动进行锁升级以提高系统的运行性能,而这一过程对用户来说完全是透明的数据库定义了4个等级的事务隔离级别,在相同的数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可能导致不同的结果。
2025-07-07 23:35:44
613
原创 16.性能优化
select count(*) from 表名;在之前的测试中发现如果数据量很大,在执行count操作时是非常耗时的MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;但是如果是带条件的count,MyISAM也慢InnoDB 引擎它执行 count(*) 的时候需要把数据一行一行地从引擎里面读出来,然后累积计数。
2025-07-07 23:17:54
647
原创 1.初始JAVA
用它编写的程序可以在任何计算机、操作系统和支持Java的硬件设备上(比如手机)运行Java语言特点① 简单易学:Java语言的语法和C语言很相似,但是它去掉了C中的复杂的指针和多重继承等特性,使得Java语言更加简单易学② 面向对象:Java语言是一种纯面向对象的编程语言,它支持对象的封装、继承和多态等面向对象的特性。
2025-06-09 09:54:12
725
原创 2.JAVA基础
变量就是用来存储数据的一块内存区域,里面存储的数据是可以变化的,是计算机中存储数据的最基本的单元在程序运行过程中如果内存空间内的值是变化的,那么这个内存空间就被称为变量名,而内存空间内的值就是变量值可以把变量理解成为一个"容器"例如一个空烧杯,给变量赋值就相当于给烧杯倒水如图所示的那样,变量可以不断更换值,就像烧杯可以反复使用一样常量就是程序运行期间固定不变的量,是不可以改变的在程序中指使用"public static final"修饰的成员变量就是常量。
2025-06-09 09:34:27
839
原创 4.面向对象1(上)
语法[修饰符] 返回值类型 方法名(形参列表){方法体代码(需要执行的功能代码)return 返回值;注意事项方法的修饰符主要用来控制方法的访问权限;权限修饰符可以是private、public、protected、default中的任意一个,也可以不写方法的返回值类型有返回值可以是java语言中任何一种数据类型。包括基本数据类型、引用数据类型例如:byte short int long float double boolean char String…
2025-05-28 08:33:16
1079
原创 4.面向对象2(中)
super代表的是当前对象中的父类型特征this与super都不能使用在静态方法中:this代表当前对象因此不能出现在静态方法中;super代表当前对象的父类型特征,因此也不能出现在静态方法中在Java语言中只要new对象,Object的无参数构造方法一定会执行。因为不管子类中的构造方法中如何使用this或者super调用,最后被调用的那个构造方法中都不会有this或者super,因此最后被调用的构造方法一定会调用父类的无参构造方法this本质上是一个引用,可以单独输出。
2025-05-27 08:54:16
1144
原创 4.面向对象3(下)
包本质来说就是文件夹,用来管理类文件的使用包有利于程序的管理和维护在Java中包名设计应与文件系统结构相对应如一个包名为"com.mingrisoft",那么"com.mingrisoft"包中的类就会被保存至com文件夹下的mingrisoft子文件夹下没有定义包的类会被归纳在预设包(默认包)中在实际开发中应该为所有类设置包名,这是良好的编程习惯创建包的语法格式: package 包名1.包名2.包名3…包名n.技术名称。
2025-05-27 08:28:58
787
原创 5.数据结构
树型结构是一类重要的非线性数据结构其中以树和二叉树最为常用直观看来树是以分支关系定义的层次结构把它叫做"树"是因为它常看起来像一棵倒挂的树,也就是说它常是根朝上,而叶朝下的为了避免出现排序二叉树一边倒的存储科学家提出了"平衡二叉树"在平衡二叉树中任何结点的两个子树的高度最大差别为1,所以它也被称为高度平衡树红黑树是一种自平衡的二叉查找树红黑树的每一个节点上都有存储位表示节点的颜色每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的。
2025-05-27 08:20:47
1828
原创 6.JAVA数组
数组分为一维数组、二维数组、多维数组、不规则数组数组是相同数据类型的一组数据数组是一种用于存储多个相同数据类型元素的容器,不仅可以存放基本数据类型的数据,也可以存放引用类型的数据例如一个存储整数的数组:int[] nums = {100, 200, 300};例如一个存储字符串的数组:String[] names = {“jack”,“lucy”,“lisi”};数组是一种引用数据类型,隐式继承Object,因此数组也可以调用Object类中的方法数组对象存储在堆中根据维数进行分类一维数组二维数组多维数组不
2025-05-26 09:02:09
977
原创 7.常用类(上)
equals() 的作用是用来判断两个对象是否相等通过判断两个对象的引用地址是否相等(即是否是同一个对象)来区分它们是否相等既然Object.java中定义了equals()方法,这就意味着所有的Java类都实现了equals()方法,所有的类都可以通过equals()去比较两个对象是否相等通常理解的相等:即两个对象其内容是否相等而程序上来看这里的作用是判断两个对象是否是同一个对象(即比较其内存地址)Java语言对equals()的要求如下对称性。
2025-05-26 08:35:52
894
原创 7.常用类(下)
Java是一种面向对象的编程语言,但是Java中的基本数据类型却是不面向对象的为了能把基本数据类型当作对象处理Java提出了包装类的概念包装类分别把Java中8个基本数据类型包装成相应的类,这样就可以通过对象调用各自包装类中许多实用的方法Java中8个基本数据类型各自对应的包装类如表所示在这八个类名中,除了Integer和Character类以外,其它六个类的类名和基本数据类型一致,只是类名的第一个字母大写即可【示例】7.3.2、自动拆装箱Byte、Short、Integer、Long、Float、Do
2025-05-26 08:12:38
665
原创 8.异常体系
Java中的异常是指程序运行时出现了错误或异常情况导致程序无法继续正常执行的现象比如:数组下标越界、空指针等语法错误不算在异常体系中异常一旦出现如果没有提前处理程序就会退出JVM虚拟机而终止异常在Java中以类和对象的形式存在8.1.3、异常抛出过程默认会在出现异常的代码那里创建一个异常对象异常会从方法出现的点这里抛给调用者,如果上一级调用者不想处理该异常,那么可以继续向上抛出,如果最终没有程序处理异常,则会抛给main方法。如果main方法也不知道如何处理,也可以使用throws将异常抛给虚拟机
2025-05-25 22:46:07
1110
原创 9.常用算法
用T(n)来表示算法中基本操作(例如比较、赋值、运算等)的重复执行次数n是程序需要处理的数据量(专业术语叫做问题规模n)若有某个趋势函数f(n)【f(n)代表了时间复杂度的趋势】,使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数记作T(n)=O(f(n)),我们称O(f(n))为时间复杂度也把它叫做大O表示法。
2025-05-25 22:26:00
911
原创 10.集合1(集合简介)
从接口的定义可以看到接口定义使用了泛型,在操作时必须指定具体的操作类型这样可以保证类集操作的安全性,避免发生ClassCastException其中有5个default修饰的方法(default 是 java 8新引入的关键字,是指在接口内部包含了一些默认的方法实现,也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制,从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码)
2025-05-25 22:02:46
664
原创 10.集合2(List集合体系)
List集合包括List接口以及List接口的所有实现类用户可以根据元素的整数索引访问元素并搜索列表中的元素List家族特点是有序可重复有序:每个元素有下标,从0开始,以1递增可重复:可以存储重复的元素List接口下常见的实现类有ArrayList:数组Vector、Stack:数组(线程安全的)LinkedList:双向链表List接口特有方法:(在Collection和SequencedCollection中没有的方法,只适合List家族使用的方法,这些方法都和下标有关系) ① void add(i
2025-05-25 21:59:30
712
原创 10.集合3(Set-Map集合体系)
Set接口继承Collection,没有任何新增任何方法Set集合由Set接口和Set接口的实现类组成Set接口没有重写Collection接口的方法,其方法和Collection接口中的一样由于Set集合中的元素不能重复,因此在向Set集合中添加元素时,需要先判断新增元素是否已经存在于集合中,再确定是否执行添加操作因此往set集合中添加的元素要同时重写"hashCode+equals"方法根据源码可以看到向Set集合中add时底层会向Map中putvalue只是一个固定不变的常量,只是起到一个占位符的作用
2025-05-25 21:51:11
662
原创 10.集合4(集合迭代与工具类)
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象迭代器通常被称为"轻量级"对象,因为创建它的代价小使用方法iterator()要求容器返回一个Iterator使用next()获得序列中的下一个元素 第一次调用Iterator的next()方法时,它返回序列的第一个元素使用hasNext()检查序列中是否还有元素使用remove()将迭代器新返回的元素删除。
2025-05-21 15:48:39
832
原创 11.多线程1(简介-创建-源码-常用方法)
线程是进程执行过程中的一个执行流程所谓多线程是指在进程执行过程中可以产生多个线程,这些线程可以同时存在、同时运行线程是cpu调度的最小单位同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈多线程在Windows操作系统中的运行模式如图所示 下图是 Java 内存区域,通过下图从JVM的角度说明线程与进程之间的关系一个进程可以有多个线程多个线程共享进程的堆和方法区(JDK 1.8 之后的元空间,JDK1.8之前的永久代)资源。
2025-05-21 14:48:30
925
原创 11.多线程2(通信-LockSupports-生命周期)
LockSupport 是 java.util.concurrent.locks 包下的一个类,是用来创建锁和其他同步类的基本线程阻塞工具类,它里面的方法都是静态方法前面介绍了等待/唤醒机制 wait/notify,那么这个 LockSupport 可以说是它的改良版LockSupport 主要就是用 park(等待)和 unpark(唤醒)方法来实现等待唤醒park 方法是将当前 Thread 阻塞1 秒等于 1000 毫秒,等于 100 万微秒,等于 10 亿纳秒。
2025-05-21 12:46:22
765
原创 11.多线程3(线程池)
诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 HTTP、FTP 或 POP)、通过 JMS 队列或者可能通过轮询数据库。不管请求如何到达,服务器应用程序中经常出现的情况是单个任务处理的时间很短而请求的数目却是巨大的构建服务器应用程序的一个简单模型是:每当一个请求到达就创建一个新线程,然后在新线程中为请求服务。实际上对于原型开发这种方法工作得很好,但如果试图部署以这种方式
2025-05-21 12:32:49
974
原创 11.多线程4(线程安全)
线程安全问题指的是多个线程同时操作同一个共享资源导致出现不正确的结果或者抛出异常的问题,这种问题通常发生在并发编程中,因为多个线程在执行过程中它们的执行顺序和执行时间是不确定的,如果不加以控制就有可能数据安全问题底层核心原因主要有三个原子性多线程并发编程的原子性是指一组指令被执行时,不受其他指令的干扰,比如我们说 CAS (Compare & Set)是原子的,java.util.concurrent.atomic 下的原子操作类等,这里的原子性其实指的是隔离性,也就是一组操作不能被别的线程干扰有序性可见性
2025-05-21 10:52:39
1115
原创 11.多线程5(并发编程安全类)
单例设计模式是 GoF23 种设计模式中的一种,也是最常用的一种设计模式一个类只能够产生一个实例对象,这就是单例设计模式单例设计模式提供了一种在多线程情况下保证只创建唯一一个实例对象的解决方案很饥渴, 类一加载就初始化创建了对象不会存在线程安全问题, 多线程环境 100%不会出现创建两个对象的问题类一加载就初始化创建了单例对象也有弊端, 如果创建了对象但是很久都不需要使用, 那就会浪费内存空间, 如果对象属性很少, 对象很小那还可以, 如果对象很大, 那不建议使用该方式测试代码可以实现懒加载, 在需要的
2025-05-21 10:28:21
622
原创 12.Lambda表达式
主要内容Lambda表达式的概述Lambda表达式的使用Lambda表达式的方法引用Lambda表达式的在集合中的使用Lambda表达式是JDK1.8的一个新特性,可以取代大部分的匿名内部类以便写出更优雅的Java代码,尤其在集合的遍历和其他集合操作中可以极大地优化代码结构想要实现对List集合的排序操作就需要使用匿名内部类来实现这样的代码非常的复杂和繁琐【示例】使用Lambda表达式的代码非常优雅并且还非常的简洁【示例1】【示例2】Java从诞生之日起就一直倡导"一切皆对象",在Java语言中面向对
2025-05-21 10:09:10
999
Git与Github.docx
2020-03-23
Redis.docx
2020-03-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅