- 博客(54)
- 收藏
- 关注
原创 Java浅拷贝、深拷贝
新对象和旧对象的成员变量的值一致,新对象中的引用变量指向的对象也是被复制了新对象,其中一个对象改变引用变量指向的对象内容,另一个对象中同样的变量不会跟着改变,即对于引用变量,深拷贝复制的对象本身。新对象和原对象的成员变量一致,引用变量也指向同一个对象,其中一个对象改变引用变量指向的对象内容,另一个对象中同样的变量也会跟着改变,即对于引用变量,浅拷贝复制的是其地址,并非对象本身。
2023-12-19 10:05:53
161
原创 mybatis-plus @SqlParser(Failed to process, please exclude the tableName or statementId)
自定义sql会经过mybatis-plus的某些语法解析插件的语法判断,如果包含某些关键字、格式、语法会认为sql有问题,从而抛出异常,而@SqlParser(filter = true)则是告诉mybatis-plus跳过这些语法解析判断。使用mybatis-plus写复杂sql时错误,但把sql在复制到mysql中执行又没问题,例如。
2023-12-11 17:42:25
897
1
原创 面试题库之JAVA基础篇(三)
将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。新对象和旧对象的成员变量的值一致,新对象中的引用变量指向的对象也是被复制了新对象。新对象和旧对象的成员变量的值一致,引用变量指向的也是同一个对象。
2023-11-30 14:17:55
337
原创 面试题库之JAVA基础篇(二)
集合的fail-fast机制:迭代器遍历的每次循环开始时候,expectModCount会和modCount比较,如果不相等,就认为有别的线程修改了集合,则会抛出ConcurrentModificationException异常。expectModCount:迭代器内部记录集合的修改次数,初始化时会将集合当前的修改次数记录下来,迭代器修改集合元素时,modCount、expectModCount均+1。新对象和旧对象的成员变量的值一致,新对象中的引用变量指向的对象也是被复制了新对象。
2023-11-29 16:51:07
313
原创 面试题库之JAVA基础篇(一)
万物皆对象,将解决问题的各个元素抽象成对象,对象中包含解决单个或某类问题的属性、行为(方法),将需要的对象组合到一起,达到解决问题的目的;面向对象有封装、继承、多态的特性,所以有很好的维护性、复用性、扩展性。
2023-11-28 17:21:30
451
原创 mysql之sql优化总结(二)
因为InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁,影响并发事务性能。入下面sql的name字段没有创建索引,那么mysql会自动把行锁升级为表锁。,避免一条一条的提交,转换为一次性提交多条sql,建议没次的sql数量控制在1000条以内。,避免一条一条的插入数据,应,每次建议在1000条数据以内,如下。根据索引字段修改,避免行锁升级为表锁。,如自增主键,能够避免也分裂现象。,避免误删过多的数据,如下。多表关联删除时使用join。,尽量不使用子查询。
2023-11-14 16:36:41
176
原创 mysql之sql优化总结(一)
使用前缀索引(短索引),短索引不仅可以提高查询性能而且可以节省磁盘空间和I/O操作,减少索引文件的维护开销,但缺点是不能用于 ORDER BY 和 GROUP BY 操作,也不能用于覆盖索引。比如有一个varchar(255)的列,如果该列在前10个或20个字符内,可以做到既使前缀索引的区分度接近全列索引,那么就不要对整个列进行索引。为了减少key_len,可以考虑创建前缀索引,即指定一个前缀长度,可以使用。count(distinct leftIndex(列名, 索引长度))/count(*)
2023-11-14 16:08:54
208
原创 mybatis嵌套查询子集合只有一条数据
如果遇到这种情况,可以在子集合的映射里面把id放进去,这样mybatis就会避免上述的情况。很明显,这不是我们期望结果。
2023-11-09 15:09:37
717
原创 mysql优化之索引
索引就像书的目录一样,能够让我们快速的找到想要的内容。索引是一个有序列表,每个索引包含这个索引的值和对应数据的物理地址,通过索引能快速定位对应数据,从而提高查询的效率。索引并非越多越好,要根据实际情况合理建立索引,否也会对数据库的性能造成一定的负面影响。mysql常用的索引类型包含:普通索引、唯一索引、主键索引、联合索引。
2023-11-03 11:11:52
119
原创 mysql优化之explain详解
mysql的explain(执行计划)用于解释sql的执行的过程,然后把sql的执行过程用一张表格表示出来,它并不真正的执行sql,如下图。explain能够为我们优化sql提供很好参考作用。下面我来看下执行计划表中各个字段是什么意思id(select的序号)每一行数据代表一个select,id越大越先执行,id相同则从上往下执行,id为null的最后执行。select_type(查询的类型)SIMPLE:简单查询,没有子查询等等,简单YYDS。
2023-10-20 14:45:58
145
原创 poi判断excel单元格内容是否为日期
通过cell.getCellType()拿到单元格的数据类型,CellType是一个枚举类型详情如下,能够看到并没有日期类型的code,poi读取到的日期类型的单元格时会认为是NUMERIC类型,然后,poi提供了HSSFDateUtil.isCellDateFormatted(cell)方法来判断单元格里面的数据是否为日期类型。所以,要判断是否为时间类型的单元格,按如期代码即可。
2023-09-21 15:11:12
2464
原创 springboot导出(POI)
我们结合自定义注解,让导出使用起来更方便简洁且更容易扩展。/*** 字段名*//*** 字段顺序*//*** 单元格宽度*//*** 日期格式*//*** 文件名称* @return*/String fileName() default "导出文件";/*** sheet页名称* @return*//*** 表头是否加粗* @return*//*** 表头颜色* @return*/
2023-09-13 10:33:11
515
1
原创 java自定义注解(Annotation)
interface:表示是一个注解@ Target:注解的作用对象TYPE:类、接口、枚举FIELD:属性METHOD:方法@Retention:注解的被保留的阶段SOURCE:保留在源文件中,编译时被丢弃CLASS:由编译器记录在类文件中,但在运行时VM不必保留注解。这是默认行为。RUNTIME:保留到class字节文件中,运行时可被jvm读取到,一般自定义注解指定这个。
2023-09-08 15:23:57
246
原创 redisson分布式锁
*** 获取锁* @return*//*** 获取锁* @param waitTime 阻塞时间(秒)* @return*/try {if(resp){/*** 释放锁*/return;if(!return;除此,官网还有其他几个所对想,具体参考redisson。
2023-09-05 17:06:01
1368
原创 redisson常用api
*** @description: redisson工具类 * @author: 小花卷的Dad */@Component/*** 锁默认释放时间*/@Autowired/*** key是否存在* @return*//*** 获取生命周期* @return*//*** 设置生命周期* @param time(毫秒)* @return*/if(!/*** 保存字符串*//*** 保存字符串。
2023-09-05 16:36:36
2028
原创 Failed to start bean ‘documentationPluginsBootstrapper‘
的时候,遇到过同样的问题,原因是Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.7.X使用的是PathPatternMatcher,所以改了相关配置。在集成redisson-spring-boot-starter时,项目启动时报如下错误。但是在集成redisson-spring-boot-starter的时候,依然会报同样的错误。在swagger的配置类中添加如下内容。
2023-08-24 16:52:54
309
原创 springboot集成redisson
springboot集成有两种方式,分别是集成redisson-spring-boot-starter或redisson-spring-data。由于作者的项目和redisson-spring-boot-starter有冲突,所以选择集成redisson-spring-data,下面介绍集成集成步骤,已单机版redis为列。
2023-08-24 15:32:12
1472
原创 mysql Range checked for each record (index map: 0x4)
mysl查询执行explain,关联查询字段出现以下提示,尽管被关联字段建了索引也没用。两张表的关联字段的排序规则不一致,改成一致的即可。
2023-08-22 17:13:07
461
原创 springboot集成flyway
flyway是一款数据库版本控制工具,它能够按照开发人员编排的数据库版本有序的自动完成数据库升级,数据库版本可以是sql脚本(推荐),也可以是java代码。基本原理是flyway在第一次启动时会生成一张历史记录表(),用于记录已执行的脚本,一个sql脚本为一条记录,然后每次项目启动时会扫描历史记录表和指定的sql脚本目录,两者做对比,把没有执行的脚本按版本号依次执行。
2023-08-16 10:38:21
119
原创 spring security自定义AccessDeniedHandler不生效问题
spring security过滤器的执行顺序默认是先登录认证再授权认证,并且登录认证模块默认是开启匿名登录的,如果请求没有携带登录认证信息,那么默认的登录认证结果就是匿名登录,匿名登录的授权失败时回调用sendStartAuthentication方法,而不是accessDeniedHandler。所以要使授权失败时调用accessDeniedHandler,则要保证当前用户不是匿名和记住我登录的。实际情况是,作者自定义了AccessDeniedHandler后,但是在授权失败时,并没有被调用。
2023-08-10 11:10:30
896
2
原创 DHL 对接退货面单
退货面单是客户在寄回商品时要用到的快递面单,面单里面的有两个关键信息发件人(客户)信息:客户决定,包括姓名、电话、地址等收件人(商家)信息:收件人由商家提供给你客户,供客户再寄件时填写。DHL中,不同国家的面单的样式是不一样的,例如:从德国发货的面单长这样从意大利发货的面单长这样。
2023-06-27 15:50:19
981
原创 DHL Basic Auth(基本认证)
当我们调用的某些API时,会要求我们在请求头上添加Basic Auth(基本认证)的凭证。比如调用时,API是这样描述的,翻译过来就是:您的活动业务客户的用户名和密码值必须通过基本身份验证(basic Auth)提供。
2023-06-27 15:17:24
435
原创 DHL 申请开发者账号
DHL是一家德国的物流公司,从事跨境电商行业的小伙伴们,如果有德国的销售渠道,那么就很可能会需要对接DHL的API,下面,我们来说说再使用DHL的API之前,如何创建开发着账号。
2023-06-25 15:46:24
931
2
原创 myabtis-plus 代码生成器自定义模板
mybatis-plus代码生成器默认生成的controller是下面这样的,一个空的controller。为了方便编码,可以给controller模板添加自定义内容,重复编码,其他类文件一样,看个人需求。1、找到原生模板,我们选择ftl类型的模板。2、复制原生模板到我们的自定义目录。4、在代码生成器中配置自定义模板路径。3、给模板添加自定义内容。
2023-06-21 10:40:35
2816
2
原创 spring AOP
在传统的面向对象编程中,我们通常把某个功能集中在某个类的某个方法中,并且java代码的执行顺序是从上至下(纵向)的,AOP则通过在纵向代码的特定位置植入额外的代码(横切关注点),实现面向切面编程。Spring AOP基于代理模式实现,它使用动态代理技术在运行时为目标对象创建一个代理对象,以拦截和处理与横切关注点相关的方法调用。切点定义了在何处应用通知,而通知则定义了在切点处执行的操作。通知(Advice): 通知是在切点处执行的具体操作。方法在切点匹配的方法成功执行并返回结果后执行,输出方法名和结果。
2023-06-20 09:57:48
86
原创 spring IOC
它是一种设计模式,传统模式中,对象负责创建、管理它们所需要的依赖。IOC能够很好的促进对象间的松耦合和系统的灵活性。需要注意的是,@Autowired默认是按照类型进行注入的。另外,除了@Component,springboot中@Service,@Controller等注解也是标记它作为一个Spring的Bean,应为他们都包含了@Component注解。springIOC容器通过使用描述对象如何创建、连接和管理的元数据来实现这一目标,此处的源数据可以是xml文件、java注解或基于java的配置类。
2023-06-19 17:44:26
86
原创 mybatis-plus 批处理
批处理操作通常在一个事务中执行,因此确保方法调用层上存在事务管理(例如使用。注解)以保证批处理操作的一致性和原子性。
2023-06-07 16:37:13
495
原创 springboot 事务(@Transactional)
外部类调用:如果一个有事务的方法被另一个类的方法调用,事务传播可能会受到影响。自调用方法:如果一个带有事务的方法在同一个类中通过普通的方法调用自己,事务传播可能会失效。外部调用:如果一个有事务的方法被另一个没有事务的方法直接调用,事务传播可能会受到影响。在这种情况下,被调用的方法会在自己的事务中执行,而不是加入到外部方法的事务中。在springboot中,在方法或类上添加@Transactional注解,将会把该方法或类中的数据库操作放到一个事务中,中途发生异常时,则事务会回滚,代码如下。
2023-06-07 16:23:00
1513
原创 mysql之事务简介
数据库事务是包含一个或多个数据库操作的有序集合,事务里面的操作要么全部执行成功,要么全部执行失败,且事务中的数据库操作是有序执行的。数据库事务是为了保证业务系统在操作数据库时,数据和业务系统的运行结果最终保持一致。为解决上述问题,SQL标准制定了4个事务隔离级别,由低到高,隔离级别越高,性能越低, mysql的默认隔离级别: REPEATABLE-READ(可重复读)如果没有事务隔离,在多个事务并发的情况下,可能会产生以下问题。不同的事务隔离,能解决的事务并发问题如下表。
2023-06-07 10:28:13
127
原创 mybatis 缓存
mybatis的二级缓存是namespace级别的缓存,sqlSession在commit的时候,会将缓存刷新到二级缓存,二级缓存在一同namespace中是全局的,同样,任何的insert、update、delete操作都会清空二级缓存。根据一级缓存的特性,我们可以看出用处不多,因为同一sqlSession或同一方法中,执行相同的sql查询的场景是非常少的,另外,在分布式应用中,一级缓存容易造成读取脏数据,因为它的缓存范围是sqlSession。如果数据被更改,则相清除相关缓存,直到下次查询再进行缓存。
2023-05-17 09:43:25
313
原创 mybatis-plus 分页
如果返回类型是Page则入参的Page不能为null,因为返回的Page==入参的Page;Page对象是IPage的实现类,是mybatis-plus提供的一个分页对象,如果有个性化需求,可自定义实现了IPage接口的分页对象。mybatis-plus要实现分页查询,得先向mybatis-plus的插件集合中添加分页插件,mybatis-plus已经提供了成熟的分页插件,我们简单配置下就行,以springboot为例,代码如下。dbType:数据库类型(根据类型获取应使用的分页方言),
2023-05-11 15:17:06
1017
原创 springboot 集成mybatis-plus
mybatis-plus的默认配置已经能够满足开箱即用,如需要个性配置,参考。生成代码,然后测试即可。
2023-05-11 10:06:34
186
原创 springboot 集成swagger3
如果启动时发生报以下错误,修改springboot的url匹配规则配置。在下图位置添加全局授权,会在所有请求的header上自动加上所填参数。security配置,主要是对swagger的相关请求不做拦截。swagger配置,生产环境记得关闭swagger,节省性能。应用启动后,在浏览器访问。
2023-05-10 14:16:10
276
原创 springboot 数据库连接池配置(hikari)
顾名思义,数据库连接池就是存放很多数据库连接的池子。它的原理就是在系统初始化的时候创建一定数量的数据库连接并存放在池子中,当应用程序需要访问数据库时,直接从池子里面拿空闲连接使用,使用完成连接也不用关闭,给后续要访问数据库的线程继续使用。JABC是JAVA访问关系型数据库的标注API,它为各种关系型数据的访问提供统一的接口标准,然后,各个关系型数据库厂商按照JBDC的标准,提供能使JAVA访问的驱动包。由此看出,执行一个sql的开销是比较大的,因此,为了节省资源提高效率,使用数据库连接池是很有必要的。
2023-05-09 14:29:39
13783
原创 @MapperScan @Mapper采坑记录
使用@MapperScan会在启动时将配置路径下的所有接口类自动创一个实现类,使用@MapperScan的初衷是自动给Mapper接口创建实现类,结果由于路径问题,给ISysUserService也创建了一个实现类,所以一个产生了上述错误。2、不使用@MapperScan,而是在mapper的接口类型上使用@Mapper注解,在编译之后会生成相应的接口实现类,如果使用了mybatis的代码生成器,按照如下配置,生成mapper接口类或自动打上@Mapper注解。
2023-04-23 18:00:55
214
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人