java代码块积累
文章平均质量分 61
java代码块积累
乐之者v
一生编程,快乐编程。
展开
-
PropertyDescriptor动态反射setter和getter设置对象属性
BeanWrapper和BeanWrapperImpl是 Spring的接口和类,可以通过BeanWrapper和BeanWrapperImpl获取 PropertyDescriptor。使用传统的反射 Method、Field等类去处理,需要对方法名进行大量拼接,比较麻烦。我们在开发的过程中,有时会需要动态地设置属性,也就是动态getter、 setter。可以使用 PropertyDescriptor.原创 2024-06-26 14:43:39 · 312 阅读 · 0 评论 -
java开发常用代码
详情见: https://blog.csdn.net/sinat_32502451/article/details/139417740。详情见: https://blog.csdn.net/sinat_32502451/article/details/133039513。详情见: https://blog.csdn.net/sinat_32502451/article/details/138199660。原创 2024-06-05 22:54:29 · 300 阅读 · 0 评论 -
java类型转换
类型转换虽然很简单,但是还是有些小细节要多注意。原创 2024-06-03 16:07:25 · 396 阅读 · 0 评论 -
java8 日期Date、LocalDate、LocalDateTime、字符串String的转换
【代码】java8 日期Date、LocalDate、LocalDateTime、字符串String的转换。原创 2024-04-25 21:06:31 · 316 阅读 · 0 评论 -
java8 LocalDateTime
LocalDateTime: 可以设置含年月日时分秒的格式 , 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的。LocalDate: 只能设置仅含年月日的格式,表示没有时区的日期, LocalDate是不可变并且线程安全的。LocalTime: 只能设置仅含时分秒的格式,表示没有时区的时间, LocalTime是不可变并且线程安全的。Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔。after 只在大于(>)情况下才为true (相等时不会)原创 2024-04-25 21:04:33 · 606 阅读 · 1 评论 -
SonarBug修复
解决方法:不要直接抛Error,RuntimeException/Throwable/Exception这样的通用的异常,使用更具体的异常代替。解决方法:使用BigDecimal.valueOf()代替。解决方法: 重写equals()必须重写hashCode()。IDEA可以通过Alt+Insert自动生成。解决方法:使用(long)类型转换,或者在数字后面加上L转换类型。解决方法: logger.error(“错误提示字符串:”,e);解决方法: 浮点数不应该用==去比较,可能会精度丢失导致不准确。原创 2024-03-26 14:28:22 · 1365 阅读 · 0 评论 -
策略模式代码示例(二)
策略模式,针对每一个不同的类型,调用具有共同接口的不同实现类,从而使得它们可以相互替换。策略模式 ,针对实现同一接口的不同的类,采用不同的策略。比如,面对高级会员、初级会员会采用不同的折扣。策略模式,可以避免大量的if和else。原创 2024-03-01 15:45:21 · 596 阅读 · 0 评论 -
统一异常处理@ControllerAdvice及参数校验@Validated
直接throws Exception,抛的异常太过宽泛,最好能抛出准确的异常,比如throws IOException之类。Controller层的参数通常都需要检验,经常会看到大量的判空,然后返回错误提示,比如"名字不能为空"之类的提示。但是,如果在Controller层进行大量的捕获异常,可能会出现大量的非常多的try catch代码块。阿里巴巴的java规范中有一条,“最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。而且,异常一直向上抛,上层的类还是得处理这些异常。原创 2024-02-28 14:23:02 · 452 阅读 · 0 评论 -
Spring/SpringBoot 拦截器
还可以通过 addPathPatterns 匹配请求的url,excludePathPatterns 排除特定的 url。配置拦截器,需要实现 WebMvcConfigurer 接口,通过 addInterceptor 添加拦截器。Spring的拦截器,需要实现 HandlerInterceptor 接口。可以多次调用 addInterceptor,支持添加多个拦截器。拦截器,可以进行请求过滤、权限管理、打印日志、数据校验等。拦截器,可以在请求前、请求后进行处理。原创 2024-02-18 21:21:54 · 660 阅读 · 0 评论 -
java读取写入excel数据
在java开发中,有时需要使用excel读取和写入数据。可以使用 poi来处理。原创 2024-01-02 23:51:54 · 537 阅读 · 0 评论 -
AOP打印日志参数和耗时
可以通过 AOP , 以 控制层 controller 所在的包为切点, 在 controller 的方法前后打印日志,这样就能统计出接口的耗时,还能打印入参,出参,减少重复地打印日志。如果想根据代码搜索日志,那么可以选中方法后,根据idea的快捷键 ctrl+alt+shift+c,复制方法,然后搜索日志。如果想根据日志搜索代码,那么复制日志打印出来的类和方法,然后可以用idea的快捷键 双shift ,快速搜索方法.如果想统计 dao 层的入参和耗时,也可以用类似的方法。原创 2023-11-16 22:18:26 · 365 阅读 · 0 评论 -
SpringBoot集成Redis
【代码】SpringBoot集成Redis。原创 2023-11-12 21:30:01 · 71 阅读 · 0 评论 -
RateLimiter限流
限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。降级:降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开。RateLimiter限流属于单体版的限流,如果是高并发的分布式系统,需要用分布式限流。缓存:缓存的目的是提升系统访问速度和增大系统处理容量。限流是高并发的处理方法之一。原创 2023-10-29 20:23:24 · 325 阅读 · 0 评论 -
kafka代码示例
Windows安装kafka, 详情见:https://blog.csdn.net/sinat_32502451/article/details/133067851。Linux 安装kafka,详情见:https://blog.csdn.net/sinat_32502451/article/details/133080353。原创 2023-10-29 11:34:17 · 106 阅读 · 0 评论 -
kafka代码实践示例
Windows安装kafka, 详情见:https://blog.csdn.net/sinat_32502451/article/details/133067851。Linux 安装kafka,详情见:https://blog.csdn.net/sinat_32502451/article/details/133080353。在实际开发中,会有多种不同的消息,服务器也不一定一样。需要根据不同的需求,进行不同的配置。kafka 配置类。原创 2023-10-29 14:52:31 · 164 阅读 · 0 评论 -
hutool 工具类提高编码效率
此类重写了父类的 toString()方法,返回值为"yyyy-MM-dd HH:mm:ss"格式。body传参形式为json时,需要将json转成字符串,不支持JSONObejct。可以使用 JSON.toJSONString(json) 将json转化为字符串。hutool的 DateTime继承了 Date,所以可以用 Date 声明。DateUtil 日期工具类,返回的大部分日期都是 DateTime的。如果是指定日期的上个月,可以使用日期偏移相关的方法。引入 hutool 依赖包。原创 2023-10-21 18:47:09 · 721 阅读 · 0 评论 -
PageHelper基础知识
(1) 执行 PageHelper.startPage(),会初始化一个 ThreadLocal 属性变量 LOCAL_PAGE ,这个 ThreadLocal 属性变量会在后续设置线程副本变量 Page.这个拦截器会在我们的sql查询语句之前,执行 SELECT count(0) 语句进行计数,还会在startPage()之后的第一个select查询语句中加入 limit 进行分页。(3)获取 ThreadLocal 中设置的 Page 信息,获得分页的总数和结果。(1)设置页数和每页数量,开始分页。原创 2023-10-21 13:13:22 · 116 阅读 · 0 评论 -
java8 Optional理解及示例
orElseGet(lambda表达式)会在有值的时候返回值,如果没有值,它会执行作为参数传入的函数式接口(返回类型必须和Optional封装的对象是同一种类型),并将返回其执行结果。而常见的判断Optional结果的方法有,orElse()、ifPresent()、get()、empty()、map()、flatMap()。Optional的orElse()若方法不是纯计算型的,有与数据库交互或者远程调用的,都应该使用orElseGet()。值不为空时,两者都会执行参数中的函数式接口。原创 2023-10-21 13:11:25 · 229 阅读 · 0 评论 -
java常用的工具类/第三方类库
详情见: https://www.cnblogs.com/expiator/p/17347890.html。详情见: https://www.cnblogs.com/expiator/p/17276594.html。多掌握一些java常用的工具类、java常用的第三方类库,可以让我们提高效率,代码变得简洁优雅。包含集合、并发、I/O、散列、缓存、字符串等。在开发的过程中,有些代码直接用原生的语法写起来比较麻烦。jdk自带的类,用于处理对象,判空,转换字符串等。处理字符串,常用的方法有。原创 2023-10-21 12:54:02 · 512 阅读 · 0 评论 -
Google Guava常用的代码示例
Table是Guava中的一种数据结构,两个key对应一个value,相当于表格,某行某列对应一个值。谷歌出品的,非常实用。包含集合、并发、I/O、散列、缓存、字符串等。Splitter可以用来分隔字符串。Joiner可以连接字符串。原创 2023-10-21 12:46:47 · 166 阅读 · 0 评论 -
mybatis-plus-generator自动生成代码
修改包名、作者、路径、jdbc配置后,运行main()方法,输入表名即可,多个表用逗号隔开。原创 2023-10-21 12:37:59 · 156 阅读 · 0 评论 -
Spring/SpringBoot自定义线程池
在 Spring/SpringBoot 中,可以使用 @Configuration 和 @Bean 去设置线程池,用 @Value 去做线程池的参数配置。详情见:https://www.cnblogs.com/expiator/p/17140760.html。原创 2023-10-21 12:29:22 · 338 阅读 · 0 评论 -
java业务开发常用的配置表及代码
比如 订单30分钟后失效,需求变更,要改为15分钟,那么直接改配置表就行了,不用发版。某些关键的容易出错的逻辑,加上一个开关,也就是 config_value 为 0或1,为1表示打开,为0表示关掉。或者是逻辑复杂,开发环境造数据麻烦时,也可以用配置表配置开关,把前置条件关掉,方便验证数据。config_key 唯一索引,保证配置的 key 唯一。config_value,如果有多个,可以用逗号隔开。插入/更新数据后,记得删掉缓存,保持一致性。不需要的逻辑,可以及时用开关关掉。通过配置表,灵活的配置。原创 2023-10-21 12:19:44 · 360 阅读 · 0 评论 -
业务开发常用的开关
开关某些关键的容易变更的逻辑,加上一个开关。需要的时候,打开开关。不需要的逻辑,可以及时用开关关掉。或者是逻辑复杂,开发环境造数据麻烦时,也可以配置开关,把前置条件关掉,方便验证数据,也方便测试。示例:@Servicepublic class SwitchServiceImpl implements SwitchService { /** * 具体的值,可以在配...原创 2023-06-27 14:29:00 · 35 阅读 · 0 评论 -
CompletableFuture多任务异步,获取返回值,汇总结果
supplyAsync(): 异步处理任务,有返回值whenComplete():任务完成后触发,该方法有返回值。还有两个参数,第一个参数是任务的返回值,第二个参数是异常。allOf():就是所有任务都完成时触发。allOf()可以配合get()一起使用。/*** 异步,多任务。汇总返回值*///该线程池仅用于示例,实际建议使用自定义的线程池//线程安全的list,适合写多读少的场景//任务完成时执行。用list存放任务的返回值if (result!= null) {原创 2023-10-20 22:55:33 · 3360 阅读 · 0 评论 -
SpringBoot集成Redisson的分布式锁
可以在 application.properties 中添加。原创 2023-10-12 20:55:37 · 221 阅读 · 0 评论 -
Redisson使用延时队列
接着调用 addDelayQueue()方法,往队列中添加数据,观察日志,可以发现 5秒后,取到队列中的数据。调用 takeDelayQueue()方法,不断在延时队列中拉取数据,由于队列中没有数据,所以会先阻塞。如果使用 jdk自带的延时队列,那么服务器挂了或者重启时,延时队列里的数据就会失效,可用性比较差。取出延时队列中的任务,如果延时队列中没有任务,会阻塞,直到队列中添加了任务。比如,订单15分钟内未支付自动取消。可以使用Redisson的延时队列。在开发中,有时需要使用延时队列。原创 2023-10-12 22:28:14 · 785 阅读 · 0 评论 -
SpringBoot中使用@Retryable注解进行重试
可以看到,@Retryable 修饰的方法执行了3次。仍旧失败后,会执行 @Recover 修饰的方法。在Application 启动类上,添加 @EnableRetry 注解。有功能需要重试时,可以使用Spring的 @Retryable 注解.原创 2023-10-11 17:07:30 · 434 阅读 · 0 评论 -
idea自定义 postfix completion提高编码效率
初始化list:list字符串判空:ifisBlank$END$$END$字符串比较ifequals在ENDENDEND这个地方输入了 变量后,直接 shift+Enter 跳转到下一行。集合判空:ifisEmpty$END$$END$原创 2023-10-11 14:57:56 · 535 阅读 · 0 评论 -
java8多线程的lambda
Lambda表达式lambda表达式,实际上就是匿名函数。格式如下:()里面是函数的参数,中间是箭头, {}是函数的代码块,{}包含了函数的执行以及返回结果。()->{}新建线程不使用lambda:Runnable runnable = new Runnable() { @Override public void run() { ...原创 2021-05-10 17:08:00 · 42 阅读 · 0 评论 -
java8 lambda和stream的理解
(1)中间操作:filter(Predicate), map(Function(T, R), limit, sorted(Comparator), distinct,flatMap;//以下的toMap(Worker::getId, Worker::getName)表示将流转化为Map,键为Worker对象的id属性,值为Worker对象的name属性。包括filter()、map()、sorted()、forEach()等操作。(x, y) -> x + y ,表示接收参数x和y,返回x+y的和。原创 2023-09-11 23:10:41 · 124 阅读 · 0 评论 -
Java8 CompletableFuture处理多个异步任务
thenAcceptBoth(): 同样将两个任务(CompletableFuture)的执行结果作为方法入参,但是是个Void的返回值,相当于没有返回值;runAfterBoth(): 在两个任务(CompletableFuture)之后执行,但没有入参,而且是个Void的返回值,相当于没有返回值。thenRun(): 根本不关心一个任务的前一阶段的输出,它只负责运行新的Runnable任务,该方法返回值类型为Void,相当于没有返回值。还有两个参数,第一个参数是任务的返回值,第二个参数是异常。原创 2023-09-11 23:16:58 · 650 阅读 · 0 评论 -
mysql分库分表 sharding-jdbc 3.0的代码实现
一、依赖包SpringBoot 用的是 2.0.6.RELEASE 版本。<dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> ...原创 2023-06-29 23:29:00 · 85 阅读 · 0 评论 -
mysql分库分表 sharding-jdbc 5.0的代码实现 (二)
分库分表之前试过了分表不分库,详情见:https://www.cnblogs.com/expiator/p/17524493.html这次再试下分库分表。依赖包SpringBoot 用的是 2.6.13 版本。<dependency> <groupId>org.apache.shardingsphere</groupId> <a...原创 2023-07-05 23:37:00 · 223 阅读 · 0 评论 -
Mybatis常用代码
以下使用的数据库是Mysql。原创 2023-09-11 23:21:53 · 116 阅读 · 0 评论 -
java web开发中Servlet、Request、Response常用的代码
Request(请求)1.获取并打印request的body中的参数。这种获取请求中代码,一般都会封装成工具类。如果不封装,写起来比较麻烦,类似如下:JSONObject res = new JSONObject(); String postData = null; try { postData = IOUtils.toString...原创 2019-06-08 23:02:00 · 58 阅读 · 0 评论 -
BigDecimal代码示例
在平常开发中,如果涉及到计算,要求准确的精度,比如单价*数量=总价之类的计算,那么得用到BigDecimal。初始化如下:BigDecimal amount=new BigDecimal("5.33");注意,最好不要用double类型来初始化,数值并不准确。比如BigDecimal amount=new BigDecimal(0.06);那么有可能这个BigDecimal会从0....原创 2019-07-22 21:52:00 · 36 阅读 · 0 评论 -
java开发常用的基础代码
基础类型转换https://www.cnblogs.com/expiator/p/12602446.htmlBigDecimal计算:涉及金额之类的运算,不要用 Double、Float 这些类型,用 BigDecimal 才能精确计算。详情见: https://www.cnblogs.com/expiator/p/11228719.html日期字符串转换详情见: https://w...原创 2023-03-17 00:10:00 · 30 阅读 · 0 评论 -
Json常用代码
JSONField用在java对象的变量上面,这里的name表示的是转换后的JSON字段,格式则用format处理。其他的泛型对象,类似于JSON字符串转map,都可以采用以下的TypeReference泛型进行转换。JSON.toJSONString() 将 Java 对象(或集合)转换换为 JSON字符串。@JSONField用在java对象的变量上面,这里的name表示的是转换后的JSON字段。List等集合转换为JSON字符串,也可以用 JSON.toJSONString.原创 2023-09-11 23:19:24 · 470 阅读 · 0 评论 -
redis缓存的代码示例
redis是一个键值对数据库,用于缓存数据。redis是一个key-value存储系统。和Memcached数据库类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。在此基础上,red...原创 2018-01-12 10:55:00 · 82 阅读 · 0 评论