- 博客(41)
- 收藏
- 关注
原创 java中事务中遇到锁会造成什么问题,以及该如何解决?
当代码执行完毕,也就是finally里面的锁都释放了,去提交事务,但是提交事务也是需要时间的,有可能还没提交事务完,由于锁释放了,其他客户端就会拿到锁了,但是此时该用户感知不到此时DB数据库中的数据是最新的,也就是所谓的可见性,什么是可见性?在spring中实现事务有多种方式,主要是两种:一种是声明式事务,一种是编程式事务,今天我们就讲声明式事务中的一种,使用注解@Transactional,这个注解的作用就是帮助我们在代码执行完毕之后自动提交事务,在发生异常时进行回滚。而非释放锁之后再提交事务。
2024-06-05 11:24:06 1189
原创 巧用java8的stream流的.collect(Collectors.toMap(arg1,arg2))
按照java的sql思路,我们直接通过left join去关联表就行了,但是该低代码平台有对sql连表查询有限制,就是有些表它是存在一个domainKey的,实体表的domainKey如果不相同的话连表是不允许的。所以就无法使用连表了。巧用java8的stream流的.collect(Collectors.toMap(arg1,arg2))适用于通过返回结果的id查对应表的某一个数据。所以最终的想法,就是单独查询xxx_id对应表名的数据,查询xxx_id对应表名的数据,查询ddd_id对应表名的数据。
2024-05-28 17:58:56 249
原创 java同步大量数据到本地数据库方法总结
由于同步任务是一个非常耗时的操作。所以我们可以用一个调度任务然后在夜间某个时间点进行同步,当然由于三方接口返回的数据也会进行更新的,所以我们可以进行增量同步,但是我们并不知道更新的是哪些数据,当然你可以去挨个数据对比,但是比较麻烦,所以我们只能先做全部删除,然后再做全量同步。但是全部删除delete from 实则也是一个耗时操作,实际也是一行一行删除的,相对比全量同步可能稍微会快点,所以我们也需要对全部删除分批次+同步串行 或者是分批次+异步并行,也就是帮我们上面的同步串行改成删除就可以了。
2024-05-01 12:06:38 856 2
原创 赞:java使用easy-excel导入模板下载提供用户进行导入
是相同的思路,只是我们导出数据是对前端表格页面上勾选的数据导出到excel,此时excel里面的数据就是前端表格页面上的数据行记录,但是我导入模板下载说白了也是导出一个excel,只不过excel里面的数据是我们自己定义的固定模板表头(封装实体)一般就是一行。导入模板下载其实就是导出,只不过导出到excel的数据是我们自己自定义的数据。就是我们在点击导入的时候,一般都是有一个模板的,我们需要下载这个模板,然后再按照这个excel模板填充数据之后,再导入。那么导出模板下载,说白了和前面一篇。
2024-04-18 17:48:23 315
原创 赞:java使用easy-excel导入数据的通用模板思路
1、需要一个输入流(当然也可以读取一个固定路径盘符的文件filename+'.xls');我们在项目中都会有导入导出的功能,这篇文章主要是讲导出的,导入我会在另外一篇博客文章中讲解。1、需要一个输入流(当然也可以读取一个固定路径盘符的文件filename+'.xls');这个方法仅仅是从外部excel文件导入后解析进行返回数据给前端展示,但并未保存到数据库。这个方法就有了,就是从外部的excel文件导入接续之后,保存到数据库。首先:需要在项目中的pom.xml中导入easy-excel的依赖。
2024-02-21 11:39:24 448
原创 赞:java使用easy-excel导出数据的通用模板思路
4、准备存放导出的路径,fileName+‘.xls’,但是一般我们是在测试的时候才会写特定的存放路径,在系统里面,我们一般是直接用outputStream输出流,让用户自己选择导出的盘符路径。4、准备存放导出的路径,fileName+‘.xls’,但是一般我们是在测试的时候才会写特定的存放路径,在系统里面,我们一般是直接用outputStream输出流,让用户自己选择导出的盘符路径。我们在项目中都会有导入导出的功能,这篇文章主要是讲导出的,导入我会在另外一篇博客文章中讲解。
2024-02-20 18:05:42 638
原创 java中实体pojo对于布尔类型属性命名尽量别以is开头,否则 fastjson可能会导致属性读取不到
假如我们有一个场景,就是需要将一个对象以字符串的形式,也就是jsonString存到一个地方,比如mysql,或者redis的String结构。success还是success,valid还是valid,证明可能是fastjsob框架在解析的时候会默认把is去掉。现在我导入fastjson依赖,创建一个CusPojo对象,然后序列化为jsonString,我们打印结果如何。有两个属性是布尔类型的,一个属性是有is开头,一个是没有is开头的,我们就可以做个对比。
2024-02-19 17:06:12 823
原创 一般系统的请求认证授权思路【gateway网关+jwt+redis+请求头httpheader】
redis中有两个key,一个key就是刚刚关于认证token的,另一个就是授权的。gateway:网关,我们都知道网关的作用就是对系统的所有请求,网关都会进行拦截,然后做一些操作(例如:设置每个请求的请求头httpHeader,身份认证等等)此时一般会使用到网关过滤器,创建一个过滤器去实现GlobalFilter接口。登录接口是不需要进行拦截的,我们在登录接口的时候,如果登录成功,才会生成一个token,还有查询该用户对应的菜单权限API列表,然后会把相关信息存到redis中去。
2024-02-05 14:32:13 1466
原创 spring中生成jwtToken字符串以及解析手写通用工具类
我画一个jwt的对象结构图出来,其实只要按照这个结构来就很容易理解上面的工具类中的生成和解析代码。当前使用JWT,肯定得提前准备jwt相关的导入依赖。-- 关于jwt 生成令牌-->
2024-02-01 18:23:34 470
原创 系统登录的时候的密码如何做到以加密的形式进行登录【java.security包下的api】工具类。
所以以后在登录的时候呢,前端会对界面输入的明文密码进行公钥加密成密文密码,然后再传给后端,后端就会利用私钥进行解密解密出明文密码,然后与数据库的进行比较。如果大家觉得这篇文章对大家有所帮助的话,希望能给个免费的赞赞,也祝各位码农在未来的IT道路上能越走越远。我们写一个测试方法,看看明文加密之后的密文,在经过解密后的明文是否一致。使用java.security包下的api进行密码的加密传输(公加私解)四个方法我直接贴出来,两个方法是关于公钥的,两个方法是关于私钥的。
2024-01-24 17:56:48 800
原创 如何在一个集合对象中A排除另外一个集合对象B中A中拥有的数据通用思路,很精妙!
所以模板思路就是以后我们要在哪一个集合对象里面排除另一个集合对象,那么我们就将要排除的做map映射,然后对另一个集合对象做filter过滤掉contains为false的,就是最终的结果,以这个题目就是A排除B,那么就将B做map映射,将A做filter过滤掉contains为false的。只是我们需要将里面的那个contains过滤掉为true的,然后最终结果如果返回的集合存在数据,就代表有交集了,有交集,肯定就是出现重复的了。外层循环遍历集合对象B,内层循环遍历集合对象A,也是可以的。
2024-01-23 17:03:24 698
原创 springboot实现文件上传与下载的通用思路模板流程
一般我们的参数是一个文件名或者是一个文件编号ID,因为可能存储在一些非关系型数据库,比如MongoDB,那么我们上传时保存到MongoDB就会有一个文件编号ID,所以我们下载的时候,就通过ID找到实际的File,是这样获得的。这就是springboot实现文件上传与下载的通用思路模板流程,具体可以根据自己的业务场景进行修改。需要将参数设置成为MultipartFile类型。
2024-01-09 14:53:48 619 1
原创 为什么需要在bean上使用@EqualsAndHashCode(callSuper = true)这个注解
所以一开始两个child虽然他们的code是不同的,name是相同的,但是由于没加上这个注解,忽略了父类的code,只会关注子类Child的name,就会就是true了。创建了两个Child,属性code是不一样的,一个是c1,一个是c2,但是name是相同的,都是“小毛孩”,然后我们现在也没有在子类Child类上加注解@EqualsAndHashCode(callSuper = true),我们看看运行结果是如何,通过运行结果来分析。那么他们的内容值是不同的,为什么最终结果还是true呢?
2024-01-04 11:56:27 436 2
原创 面试官问:你知道try...catch放for循环外面和里面有什么区别吗?什么时候放外面,什么时候放里面?
如果我们就是要统计这一批货物的不合格数是多少,不想终止的话,那么我们就将try..catch放在for循环里面。对比两种运行结果,我们来看看。try...catch在for循环里面的话,不会终止整个for循环,会执行完整个for循环。try...catch在for循环里面的话,不会终止整个for循环,会执行完整个for循环。我们看运行结果,最终还是走完了整个for循环,还是可以统计出不合格数是50。
2024-01-03 18:06:37 772
原创 @Autowired和@Resource注解的区别是什么?
因为@Resource注解默认是按照name名称注入,那么@Resource注解是可以在括号中声明name的,比如@Resource(name = "xxx"),那么它就会按照声明的去找对应的bean,能找到的话就会去找,找不到的话就会按照类型去找吗,那么如果你没有在括号中声明name,直接是@Resource,那么它就会将你声明的变量名作为name,比如第①种情况。而@Autowired默认就是按照类型去找的,所以能找到StringRedisTemplate的bean。可以看到此时控制台是没有报错的。
2023-12-28 16:05:46 381
原创 mysql字段声明的长度是否就是最大长度?比如int(2)最大长度就是2吗,值最大是99吗?
也就是如果你sno设计的是sno int(4) zerofill,那么当你插入1,10,100,1000会是什么结果呢?我们先不着急看答案是什么。①mysql字段括号声明的值并不是字段的值的最大长度,mysql的int占据4个字节,1个字节是8位,最大值是2^32-1 =这三个字段都是int类型的,id和test_number是没有指定长度的,sno是有指定的,我们用sql语句添加该列。所以括号声明的值并不是字段的值的最大长度,mysql的int占据4个字节,1个字节是8位,最大值是2^32-1 =
2023-12-27 15:08:48 433
原创 CompletableFuture底层支撑的是一个线程池嘛?
如果ForkJoinPool.getCommonPoolParallelism() > 1 的话,USE_COMMON_POOL就是true了,如果为true的话,ASYNC_POOL的值就是ForkJoinPool.commonPool()。值是15,> 1 ,说明USE_COMMON_POOL是true,那就证明调用了ForkJoinPool.commonPool()的方法,我们看看这个方法又是如何样的。supplyAsync(),发现这个值是ASYNC_POOL,我们去追溯一下。
2023-12-12 11:13:55 521 1
转载 SpringBoot 项目 Jar 包运行启动加密,防止反编译
最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来。第一种方案使用代码混淆采用proguard-maven-plugin插件在单模块中此方案还算简单,但是现在项目一般都是多模块,一个模块依赖多个公共模块。那么使用此方案就比较麻烦,配置复杂,文档难懂,各模块之间的调用在是否混淆时极其容易出错。第二种方案使用代码加密采用classfinal-maven-plugin插件此方案比对上面的方案来说,就简单了许多。
2023-12-11 10:57:38 324
原创 jdk21新发布的一种插入有序的Map集合好用之处
然后此时如果我们想获取和数组一样第index下的entry,我们此时用map是解决不了的,那么现在我们用上jdk21的时候,我们可以使用一个新的Map,叫做SequencedMap接口。我们都知道map是一个无序不可重复key的,为什么是无序的,可以自己查看源码去理解,本质原因在于key的hash值,所以现在java21新出了一种可以得到插入有序的map。我现在模拟一个场景就是,我现在要对订单删除的时候,做一些记录,把这些删除的订单记录到系统操作日志里面去,然后我要获取第一条删除的订单记录数据。
2023-12-07 18:16:27 1608
原创 面试常出的关于catch...finally中return的返回结果的题!!
所以,如果finally中有return的话,那么最终返回的值是在finally中确定的,如果finally中没有return的话,那么最终返回的值就是在catch中确定的。直接看finally中有没有return,如果有的话,那么最终返回的值就是在finally中确定的,如果没有的话,就是在catch中确定的。有人说是12,有人说是13,那到底是多少呢?大家觉得最终val的运行结果是多少呢?
2023-12-06 17:14:26 382 1
原创 Optional判断非空的巨大优势!!
的话,value就不为空,那么在调用map映射的时候,此时map()方法会判断Optional成员变量value是否为null,此时不是null,那么不为null的话,就给成员变量value赋值getName()的结果,此时getName()的结果有可能为null的,继续走后面的orElse("Not Found"),orElse会去判断Optiaonal成员变量value的值是否为null,如果前面getName()返回的结果为null的话,就会返回Not Found。待会看看代码就知道了。
2023-11-30 18:01:39 467
原创 灵魂拷问:注解括号中不声明变量,直接赋值,这个值是属于注解类中的哪一个变量?
注解括号里面,不注明变量,直接赋值字符串,这个值代表的是注解中变量value的值,而且也只能是value,因为如果注解中没有声明变量value的话,也不可以直接赋值,当出现在注解的括号中声明超过1个变量的时候,就不能省略value了,必须按照"name=value"键值对的方式存在了。然后也添加几个变量,直接在某个测试类比如:CusAnnotationTest声明一个字段username,直接用上该注解,然后赋值一个值,假如是下面这样叫做"张三"也就是说如果你要直接省略赋值字符串,必须包含value变量。
2023-11-30 11:00:34 406
原创 java8的Stream流接口的allMatch()好用之处,赞!!
代码是不是优雅简洁了很多。其实Stream中也有好多api,比如还有一个和allMatch()相似的,叫做anyMatch(),它的意思代表流中只要有任意一个元素满足断言Predicate,那么就会返回true。我需要判断studentDTOS集合中的每一个studentgDTO的enabled是不是都是true,如果都是true,才执行下一个逻辑就是添加到学生数据表中。我的想法思路很简单,就是一个for循环,然后只要判断是false的直接break出去,然后在break出去之前,赋值给一个变量flag。
2023-11-28 18:18:33 1250
原创 java中使用Arrays.asList(T ... a)容易踩add(T t)的坑!!
所以我们就知道了,喔~原来是因为Arrays.asList()返回的是Arrays类里面静态内部类ArrayList对象,这个内部类里面没有对add()方法进行重写,所以调用的是父类AbstractList的add()方法,而父类AbstractList的add()方法就是会直接throw new UnsupportedOperationException();那么它调用的add()就是调用父类AbstractList的add()方法,我们看看AbstractList的add()方法。我们同样也是看源码。
2023-11-28 11:27:58 474
原创 nacos多环境配置的标准流程分为哪些步骤
所以当我们在右侧maven中勾选哪一个的时候,pom.xml中的这个profile就会选择哪一个runtime下的profile,profile一切换的话,@nacosServer@ 和@nacosNamespace@和@runtime@就会找到对应的profile下的<nacosNameSpace>和<nacosServer>和<runtime>,这样就可以实现多环境切换了。不同的环境有自己的namespace下的配置内容,所以以后切换哪个环境,就会找到通过环境找到对应的namespace。
2023-11-21 15:10:31 233 1
原创 xxl-job手把手教你开发的标准流程
xxl-job分布式任务调度平台一般的操作步骤:①从官网github上,链接如下:一个是gitee,一个是github拉取初始化数据库sql文件②调度中心(application.yml或application.properties)配置,我们可以直接参照官方的xxl-job-admin的application.properties进行修改调整。说说几个重要的属性:server.port 就是代表调度中心启动的时候的端口号,因为调度中心实则也是一个app。server.serv
2023-11-20 15:37:40 225 1
原创 是否可以将任何接口都写成lamda表达式?一定得加注解@FunctionalInterface才可以吗?
因为这个方法要接收一个接口对象参数嘛,接口又不能直接new,只能创建一个实现类然后再new这个实现类,但是我们不想这么麻烦,我们其实也可以使用匿名内部类的方法,在前面面我也说到过,再者就是这种lamada表达式的方法,其实他就是匿名内部类的优雅简化法,它其实说白了,花括号里面的代码就是实现类的方法。它只是一种声明,必须只能有一个abstrac方法,同时给开发人员一种,“喔,这个接口我等一下使用的时候,我就可以使用lamda表达式。只有一个queryAll方法,返回对象是Customer实体。
2023-11-18 11:14:19 126 1
原创 面试高频问题:请问你知道创建线程有多少种方式吗?
首先我们看一下Thread的构造器:我们可以通过在IDEA中使用快捷键CRTL+SHIFT+N搜索,输入Thread,我们会发现,看了一圈下来,Thread的构造器都是接收的Runnable接口对象,没有能直接接收Callable接口对象的。那么我们还是从Runnable接口对象入手,看看Callable接口和Runnable接口是否存在父子继承关系,如果是Callable接口继承Runnable接口的话,那么我们也可以直接传入Callable接口对象。在另外一篇博客,我也会详说的。
2023-11-17 17:07:55 49 4
原创 项目总共有三个module A、B、C,那么为什么B和C可以直获取到A的配置文件的内容?
那这时候在A的pom文件里面如果依赖了B和C,也就是将B和C的gav放到A的pom文件里面,那么这时候B和C就是A的一部分,A依赖B以及A依赖C,那么按照“被依赖模块可以共享依赖模块的配置文件的内容”,这句话,那么B和C就可以读到A的配置文件的内容了。总结:如果一个module引用了其他module的gav到当前的pom.xml文件中,那么其他模块便可以共享该模块的配置文件的内容。这里要讲到一个概念叫做,模块之间的依赖,被依赖模块可以共享依赖模块的配置文件的内容。
2023-11-17 15:02:19 62 1
原创 springboot什么时候需要用到@componentScan注解呢?
比如@Autowired @ Qualifier @Resource ,但是如果不在这个指定的目录前提下,你要直接使用@Autowired @ Qualifier @Resource这些注解注入bean对象的话,或者使用@Component、@Bean、@Service、@Mapper这些注解交给spring容器的话,都是不行的。首先springboot注解的名称的命名都是见名知意的,component是组件的意思,scan是扫描的意思,合起来就是组件扫描。那什么时候需要用到呢?
2023-11-16 14:59:28 257 1
原创 mysql的left...join 左连接使用右表的某个字段进行过滤可能容易踩的坑!
比如我现在有两张表:①t_storage_order 代表产品入库订单②t_approval 代表单据的审批数据t_storage_order的字段有:t_code t_storage_date t_storage_number t_creator t_created_datetimet_approval的字段有:t_approval_id t_order_code t_approval_status
2023-11-14 16:43:39 527 2
原创 Ⅱ 版本二、 html强大的“点击左侧栏目,右侧对应的内容显示的模板思路”一套一个准。
②获取当前点击的document的index,然后进行判断,如果是不相同的,就让已经显示的show_tag对应的隐藏,当前自己index显示,不要忘了更新show_tag的值为当前的index;如果有这个需求的话,那么必须在if当前的index与已经显示的show_tag 不相同的时候,再次判断show_tag为-1的情况(原因已经在上面说了),然后直接让当前对应的index显示,再更新show_tag的值为当前的index。我们在上一篇的代码中的else继续编写代码,看注释。
2023-11-13 14:48:25 213 1
原创 Ⅰ版本一、html强大的“点击左侧栏目,右侧对应的内容显示的模板思路”一套一个准。
所以我们得稍微想一下,就是在点击事件之前,我用不用先判断是否已经有显示过的,如果有的话,我们拿到那个已经显示的index,然后先让这个已经显示的index隐藏掉,然后你当前点击的index才显示出来。先定义一个变量show_tag代表已经显示的,然后给左边每一个document写点击事件,在点击事件里面,就先判断shw_tag是否等于当前$(this).index(),如果不相等,直接让已经显示的show_tag对应的right隐藏,当前自己$(this).index()对应的right显示。
2023-11-11 09:40:24 882 2
原创 mysql对数据表中的日期(datetime或者是timestamp)进行between...and容易踩的坑。
因为咱们现在between的日期是yyyy-mm-dd,而mysql的日期类型是timestamp或者是datetime,他们的形式是yyyy-mm-dd hh:mm:ss,类型不匹配,所以mysql就会将between...and的日期当做yyyy-mm-dd 00:00:00来看待,所以between "2023-09-23" and "2023-09-25"就会看作是。"2023-09-23 00:00:00" 和 "2023-09-25 00:00:00"
2023-11-10 15:34:45 949 1
原创 mybatis-plus包下的boolean StringUtils.isBlank(Charsequenc cs)和boolean isEmpty(Charsequenc cs)的区别?
③如果不是null,length也不是0,那么就会进入for循环,在for循环里,会调用Character.isWhiteSpace(char c)方法,这个方法点进去可以自己去看一下,这里就不贴上来了,字面意思就是判断是否是白色空格,也就是是否是" "这种情况。结果都是返回true。StringUtils.isEmpty(Charsequenc cs),如果参数是null,是空字符串"",算空,会返回true,但是如果你是第三种空白字符串" ",那么是不算空的,结果就会返回false。
2023-11-10 14:34:20 155 1
原创 mysql的not in函数存放的是一个子查询结果集,有limit会出现的问题
pro_id , pro_name , pro_type , created_datetime , creator , modified_datetime , modifier 2 aa 1 2023-11-02 10:00:00 张三 null null。10 dd 6 2023-11-09 11:00:00 张三 null null。
2023-11-10 11:44:39 102 1
原创 使用mybati-plus的条件构造器QueryWrapper的eq(boolean condition, R column, Object val) 容易踩的坑!
如果是基本数据类型可以。现在看一个具体例子:比如现在我有一个接口,查询数据库中一张数据表里面的所有数据,假如叫做sys_operation_log系统操作日志,并且搜索条件是时间范围,有开始时间和结束时间,然后现在前端说有一个vue组件是date-picker,该组件默认传数组,问我是否方便接收数组,我说可以。所以现在的接口就是这样子的。//本来这个判断如果不成立,是不会走下面的,但是现在后面的datePicker.get(0),datePicker.get(1)还是会走到,这样就会导致空指针异常!
2023-11-09 18:27:01 2475 7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人