自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(130)
  • 资源 (2)
  • 问答 (2)
  • 收藏
  • 关注

原创 ThreadPoolExecutor线程池的keepAliveTime的具体含义

keepAliveTime含义ThreadPoolExecutor 的 javadoc 对 keepAliveTime 参数的解释:keepAliveTime when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.大致意思是:keepAliveTime 就是 当

2021-02-11 21:04:45 3898

转载 MyBatis的SQL执行流程

MyBatis的SQL执行流程,逻辑超清晰,总结得也太全了吧!

2021-08-17 20:12:59 267

原创 Mybatis 获取Mapper对象

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml"));SqlSession sqlSession = sqlSessionFactory.openSession();User userMapper = sqlSession.getMapper(Use

2021-08-17 20:11:31 2122

原创 Mybatis 获取自动生成的键值

不同的数据库,获取自动生成的(主)键值的方式是不同的MySQLMySQL 有两种方式获取自动生成的键值,如下:在 <insert /> 标签中添加useGeneratedKeys="true"等属性<insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id" parameterType="person" > INSERT INTO person(name, p

2021-08-17 20:03:36 602

原创 Mybatis 插件的运行原理

核心对象MyBatis 插件的运行是基于 JDK 动态代理 + 拦截器链实现Interceptor 是拦截器,可以拦截 Executor, StatementHandle, ResultSetHandler, ParameterHandler 四个接口实际就是利用 JDK动态代理,生成对应的代理类实例,通过 InvocationHandler#invoke 实现拦截逻辑InterceptorChain 是拦截器链,对象定义在 Configuration 类中, 实际是一个 List集合,元

2021-08-17 20:02:58 1310

原创 Mapper接口和映射文件是何时关联的

2021-08-17 20:02:04 215

原创 #{} 和 ${} 的区别

两者在 MyBatis 中都可以作为 SQL 的参数占位符,在处理方式上不同#{}:在解析 SQL 的时候会将其替换成 ? 占位符,然后通过 JDBC 的PreparedStatement 对象添加参数值,这里会进行预编译处理,可以有效的防止 SQL 注入,提高系统的安全性${}:在 MyBatis 中带有该占位符的 SQL 片段会被解析成动态 SQL 语句,根据入参直接替换掉这个值,然后 通过 Statement 执行数据库相关操作,存在 SQL注入 的安全性问题...

2021-08-17 20:00:16 79

原创 Mapper 接口的如何起作用

在 MyBatis 的初始化过程中,每个一个 XML 映射文件中的<select />、<insert />、<update />、<delete />标签,会被解析成一个 MappedStatement 对像,对应的 id 就是 XML 映射文件配置的 namespace+’.’+statementId,这个 id 跟 Mapper 接口中的方法进行关联,这里就引申了另外一个问题:同一个 Mapper 接口中为什么不能定义重载方法?因为 Mapper

2021-08-17 19:59:29 2020

原创 BeanDefinitionRegistryPostProcessor 和 ImportBeanDefinitionRegistrar

这两个接口都可以用于动态注册bean对应BeanDefinition到容器中。BeanDefinitionRegistryPostProcessorBeanDefinitionRegistryPostProcessor 实现了BeanFactoryPostProcessor接口,是Spring框架的 BeanDefinitionRegistry的后处理器,用来注册额外的 BeanDefinition。postProcessBeanDefinitionRegistry方法会在所有的BeanDefini

2021-08-17 19:58:37 1207

原创 开启 MyBatis 的 SQL 执行日志

在配置文件的 <setting> 标签上设置 logImpl 参数值(SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING),指定 MyBatis 所用日志的具体实现,未指定时将自动查找。如 MyBatis 实现的标准输出的配置:<configuration> <settings> <!--指定 MyBatis 所用日志的

2021-08-17 19:57:57 902

原创 mybatis对于一段时间内的数据查询

前言项目中有个场景需要查询一段时间内的记录,比如,查询指定用户今天的收藏记录测试场景重现前提数据库中数据:有一条更新时间为【2019-01-01 15:10:20】的数据查询条件开始日期:2019-01-01 14:00:00结束日期:2019-01-01 15:20:30model_id: Buw2y9CQMmc1tX7HQw9MLxscene_id: scene1查询结果0条记录问题追踪可能的原因:时区问题(排除)传参问题(参数不正确,排除)返回值问题(date和st

2021-08-17 19:56:42 943

原创 redis——持久化机制

Redis数据持久化Redis作为一个内存数据库,数据是以内存为载体存储的,那么一旦Redis服务器进程退出,服务器中的数据也会消失。为了解决这个问题,Redis提供了持久化机制,也就是把内存中的数据保存到磁盘当中,避免数据意外丢失Redis提供了两种持久化方案:RDB持久化和AOF持久化,一个是快照的方式(RDB),一个是类似日志追加的方式(AOF)RDB快照持久化(默认持久化机制)RDB持久化是通过快照的方式,即在指定的时间间隔内将内存中的数据集快照写入磁盘。在创建快照之后,用户可以备

2021-08-10 21:04:36 103

原创 mysql查找重复元素

需求编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱table and recordingCREATE TABLE `Person` ( `id` int NOT NULL AUTO_INCREMENT, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_

2021-03-27 15:22:19 336 1

原创 java.lang.NoClassDefFoundError: org/openjdk/jol/info/ClassLayout

Maven Dependency Scopes使用 jol-core 打印对象头的信息pom.xml<dependencies> <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.14</version>

2021-03-19 20:39:46 2799

转载 synchronized能防止指令重排序吗?

疑问volatile关键字和synchronized关键字。synchronized可以保证原子性、有序性和可见性。而volatile却只能保证有序性和可见性。注意:这两个有序的意思是不一样的。那么,我们再来看一下双重校验锁实现的单例,已经使用了synchronized,为什么还需要volatile?这个volatile是否可以去掉?public class SingleInstance{ // 使用 volatile 禁止 new 对象时进行指令重排 // new 对象,有三

2021-03-19 20:12:28 2105 1

原创 mysql 自定义函数错误-1418.md

自定义函数# 工资表CREATE TABLE `test` ( `id` int NOT NULL auto_increment primary key, `salary` decimal(10,2) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;# 插入数据insert into test(salary) values(100);

2021-03-13 17:27:42 285

原创 mysql 自定义函数

函数的创建语法create function 函数名([参数列表]) returns 数据类型begin 函数体 return 返回值;end;说明函数名:应该合法的标识符,并且不应该与已有的关键字冲突。一个函数应该属于某数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则 默认为当前数据库。参数列表:可以有一个或者多个函数参数,没有参数也是可以的。对于每个参数,由(参数名 参数类型)组成。返回值:指明返回值类类型函数体:自定义

2021-03-13 17:25:29 158

原创 MySQL——常用浮点类型

MySQL常用浮点类型MySQL常用的浮点类型,有单精度类型(float), 双精度类型(double),和高精度类型(decimal),在数字货币类型中推荐使用高精度类型(decimal)来进行应用。MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M和D又称为精度和标度:M表示该值的总共长度D表示小数点后面的长度如,float(7,4)的可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。注意: FLOAT和D

2021-03-08 17:00:15 5740

原创 MySQL——varchar和char的区别

默认的字符编码和排序方式为 utf8mb4和utf8mb4_0900_ai_ciCHAR 和 VARCHAR类型的区别VARCHAR(N),最多存储N个字符,有几个字符存储几个存储字节数 = 数据值的字节和 + 1字节CHAR(N),最多存储N个字符,不足4个,尾部用空格填满存储字节数 = 数据值的字节和 + 补位空格数注意:VARCHAR和CHAR都是MySQL的字符串类型,存储多个字符、可设置最大存储的字符数,存储开销都与数据长度、字符集有关。CHAR和VARCHAR具

2021-03-08 16:22:55 2354 1

原创 Ubuntu禁止服务开机自启动

systemctl is-enabled servicename.service #查询服务是否开机启动systemctl enable *.service #开机运行服务systemctl disable *.service #取消开机运行systemctl start *.service #启动服务systemctl stop *.service #停止服务systemctl restart *.service #重启服务systemctl reload *.service #重新加载服务配

2021-03-03 16:48:05 1133 1

原创 vim查找字符

用vi或者vim,在文件里查找字符,比如要查找"redis"/redis/ 后跟要查找的内容的正则表达式.

2021-03-03 16:47:12 146 1

原创 Ubuntu使用Windows字体

将windows字体文件(ttf)copy到一个文件夹中,在linux中命名为winFontswindows字体文件:C:/windows/Fonts/将copy到的字体文件夹copy到系统字体文件夹中并且修改权限sudo cp {存放winFonts的路径}/winFonts /usr/share/fonts/sudo chmod u+rwx /usr/share/fonts/winFonts/*建立字体缓存cd /usr/share/fonts/winFontssud.

2021-03-03 16:46:29 387 1

原创 ubuntu启动、关闭、重启服务service命令

查看当前所有服务service --status-all结果如下:zwl@zwl-NB50TJ1-TK1:~$ service --status-all [ + ] acpid [ - ] alsa-utils [ - ] anacron [ + ] apparmor [ + ] apport [ + ] avahi-daemon [ + ] bluetooth [ - ] console-setup.sh [ + ] cron [ + ] cups [.

2021-03-03 16:45:52 15511 2

原创 Ubuntu的几个清理命令

# 更新本地包数据库sudo apt update​# 更新所有已安装的包(也可以使用 full-upgrade)sudo apt upgrade​# 自动移除不需要的包sudo apt autoremove命令描述aptautoclean 将已删除软件包的.deb安装文件从硬盘中删除apt clean同上,但会把已安装的软件包的安装包也删除掉apt autoremove删除为了满足其他软件包的依赖而安装,但现在不再需要的软件包apt remov

2021-03-03 16:44:48 744 1

原创 redis服务启动和关闭

启动Redis服务可以执行:service redisd start关闭服务:service redisd stop重启服务:service redisd restart在控制台中进入redis客户端:redis-cli

2021-03-03 16:43:59 173 1

原创 快速删除空行及Java注释

在VS Code 或者 gedit 中我们可以通过Ctrl+h快捷键调出替换界面,正则表达式;去掉/**/ /\*(.|[\r\n])*?\*/去掉// //.*$去掉import import.*$去掉空行 ^\s*(?=\r?$)\n

2021-03-03 16:42:37 261 1

原创 常用正则表达式

目录基本匹配元字符英文句号字符集否定字符集重复星号加号问号花括号字符组分支结构转义特殊字符定位符插入符号美元符号简写字符集断言正向先行断言负向先行断言正向后行断言负向后行断言标记不区分大小写全局搜索多行匹配常用正则表达式1. 基本匹配正则表达式只是我们用于在文本中检索字符串的模式。例如正则表达式 cat,表示:字母 c 后面跟着一个字母 a,再后面跟着一个字母 t。"cat" => The cat sa

2021-03-03 16:39:07 2436 1

原创 ubuntu20.04——hdaudioC0D2: unable to bind the codec

问题不久前尝试双系统,win10+ubuntu20.04,安装比较顺利,能够正常进入系统。但是,当我更新了显卡驱动后(专有 nvidia-drivers-390),重启就无法进入系统的图形界面,一直卡在下面这个页面。如下图:解决之后,选择ubunru 高级选项,选择低版本的内核启动,却可以进入图形界面。但是,这样让我很不爽。。。最后,我找到某位大佬说进入/etc/default/grub编辑:可以使用低版本的内核启动图形界面进入编辑,也可以 Ctr+Alt+F2 进入命令行编辑;# 原

2021-03-02 12:35:57 12047 6

原创 ubutnu的idea输入法候选框无法跟随光标移动的问题

问题定位具体问题官方其实七年前就有了(参考),但是比较坑的是官方也一直没有解决这个问题。简单来说就是Idea的jre运行环境一个bug,导致输入法无法定位到鼠标位置。因此,我们要解决该问题必须要修改JetBrainsRuntime的运行代码。解决办法修改 JetBrainsRuntime下载已经修改好的JRE环境https://pan.baidu.com/s/1S6cEKQS9w9dKqCrlO4QJwg提取码: 21mr更改IDEA的启动环境改成自己的JRE目录修改文件:

2021-02-24 14:44:07 654

转载 AbstractQueuedSynchronizer(AQS) 的原理简述

简述AQS(抽象同步器) 就是 AbstractQueuedSynchronizer 抽象类的简称,可以通过继承该类快速的实现同步多线程下的同步容器。如:ReadWriteLock、ReentrantLock,或者 CountDownLatch 与 Semaphore,甚至是线程池类 ThreadPoolExecutor 都继承了 AQS。可以一句话概括它的作用,AQS的实现依赖内部的同步队列,也就是FIFO的双向链表,如果当前线程竞争锁失败,那么AQS会把当前线程以及等待状态信息构造成一个No

2021-02-20 23:38:13 433

原创 new 一个对象时,发生了啥?

确认类元信息是否存在:当 JVM 接收到 new 指令时,首先在 metaspace 内检查需要创建的类元信息是否存在。 若不存在,那么在双亲委派模式下,使用当前类加载器以 ClassLoader + 包名+类名为 Key 进行查找对应的 class 文件。 如果没有找到文件,则抛出 ClassNotFoundException 异常 , 如果找到,则进行类加载(加载 - 验证 - 准备 - 解析 - 初始化),并生成对应的 Class 类对象。分配对象内存: 首先计算对象占用空间大小,如果实例成员变量.

2021-02-18 22:23:59 218

原创 什么情况下,会触发类的初始化

引用引用 《深入理解java虚拟机之jvm高级特性与最佳实践》的理解:遇到new、getstatic 和 putstatic 或 invokestatic 这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。对应场景是:使用 new 实例化对象、读取或设置一个类的静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法。对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。当初始化类的父类还没有进行过初始化,则需要先触发其父

2021-02-18 22:19:12 615

转载 类加载进JVM的大致过程

编译和运行一个 Java 文件从编码完成到最终执行,一般主要包括两个过程:编译,即把我们写好的 Java 文件,通过javac 命令编译成字节码,也就是我们常说的 .class文件。运行,则是把编译生成的.class文件交给 Java 虚拟机( JVM )执行。而类加载过程,即是指 JVM 虚拟机把 .class文件 中类信息加载进内存,并进行解析生成对应的 Class 对象的过程。大白话:JVM 在执行某段代码时,遇到了class A, 然而,此时内存中并没有class A的相关信息,于是

2021-02-18 21:36:31 354

原创 类继承链上的初始化(属性和静态代码块的执行顺序)

类的初始化顺序类的初始化:在类链接的准备阶段时,类属性会被赋予默认值;类链接阶段之后,类属性赋值和静态代码块才会被执行(类初始化)。现在探究 类继承链上的类属性赋值和静态代码块的执行顺序 ?预期了解初始化顺序,静态代码块和静态属性(按自上而下的排列顺序);如果父类没有被初始化,就会先初始化父类,初始化完父类,才会轮到自己;注:由 final 修饰的静态属性,只有使用 new 关键字赋值, 才会触发类的初始化(只是属性特例,方法没影响)// new 关键字 触发 类的初始化sta

2021-02-18 17:06:07 98

转载 Java 运行时数据区和内存模型(JMM)

首先说明,Java 运行时数据区域和内存模型是不一样的东西。运行时数据区域:是指 JVM 运行时将数据分区域存储,强调对内存空间的划分。内存模型:(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java 运行时数据区域JDK8 之后的 JVM 内存布局JDK8 之前的 JVM 内存布局在 HotSpot JVM 中

2021-02-17 21:20:39 445 1

原创 Java 中finally和return的执行顺序

前言在 Java 的异常处理中,try、catch 和 finally 是按顺序执行的。如果 try 中没有异常,则顺序为 try→finally;如果 try 中有异常,则顺序为 try→catch→finally。但是,当 try、catch、finally 中都加入 return 之后,return 和 finally 的执行顺序是咋样的?注:finally 代码块是一定会被执行的。我总结为以下几条:执行 try 代码块或 catch 代码块中的 return 语句之前,都会先执行

2021-02-16 15:32:59 567 2

原创 Linux chmod命令

简单介绍chmod 用3个数字来表达对 用户(文件或目录的所有者),用户组(同组用户),其他用户 的权限:chmod 777 /test使用数字表示数字7是表达同时具有读,写,执行权限:读取–用数字4表示;写入–用数字2表示;执行–用数字1表示;使用字符表示u代表所有者user;a代表所有用户;o代表其他用户;x代表执行权限;r表示读权限,w表示写权限+表示增加权限,-表示移除权限例如:a+x 是给所有人加上可执行权限,包括所有者,所属组,和其他人;o+x 只是给其他人

2021-02-16 13:47:43 694

原创 笔试:Map转JavaBean的方法

public class Map2BeanUtil { /** * Map转换成JavaBean * * @param map Map集合 * @param beanClass bean的Class对象 * @param <T> bean的类型 * @return 包含bean属性字段的Map */ public static <T> T mapToObject(Map<String, Ob

2021-02-15 18:09:04 142

原创 笔试:两个线程循环打印奇数和偶数

方式一:Lock+Condition+whilepublic class Test { public static void main(String[] args) { Data data = new Data(); new Thread(() -> { for (int i = 0; i <= 5; i++) { data.printOs(); } }

2021-02-15 18:06:44 273

原创 生产者和消费者的三种实现方式(Java)

什么是生产者消费者问题 ?生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。注:该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。要解决该问题,就必须让生产者在缓冲区满时休眠(要

2021-02-15 17:28:21 1565

staruml.tar.xz

StarUML 4.0 官方正版 Linux,下载安装即可用,相信偶,得永生,重要的话重复多遍 StarUML 4.0 官方正版 Linux,下载安装即可用,相信偶,得永生,重要的话重复多遍 StarUML 4.0 官方正版 Linux,下载安装即可用,相信偶,得永生,重要的话重复多遍 StarUML 4.0 官方正版 Linux,下载安装即可用,相信偶,得永生,重要的话重复多遍

2020-11-30

HTML用户充值页面充值中心模板.zip

原生HTML,实现用户充值页面充值中心模板

2020-07-07

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

TA关注的人

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