自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

风尘博客

我有一杯酒,可以慰风尘。

  • 博客(59)
  • 收藏
  • 关注

原创 【代码优化】Bean映射之MapStruct

【代码优化】Bean映射之MapStruct一、背景领域模型相互转换就只能靠手工的 get()/set()?普遍的做法有以下几种:手工 get()/set();构造器;BeanUtils 工具类(Apache 和 Spring 都包含该工具类,使用方式稍稍不同);Builder 模式。这些方式都存在一些缺点:耦合性强,手工 get()/set() 经常丢参数,或者搞错参数值…本文推荐一种效率较高的方式:MapStruct二、理论基础MapStruct 是一个自动生成 Bean

2022-01-14 09:59:00 591

原创 【代码优化】List.remove() 剖析

一、犯错经历1.1 故事背景最近有个需求大致的背景类似:我已经通过一系列的操作拿到一批学生的考试成绩数据,现在需要筛选成绩大于 95 分的学生名单。善于写 bug 的我,三下五除二完成了代码的编写:@Testpublic void shouldCompile() { for (int i = 0; i < studentDomains.size(); i++) { if (studentDomains.get(i).getScore() < 95.0) {

2021-12-14 09:00:00 558 1

原创 【Git 系列】基础知识全集

Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用 Git 来做自己的文档版本管理工具。一、Git 基础1.1 Git 与 SVN 区别Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。Git 与 SVN 区别点:Git 是分布式的,SVN 不是:这是 Git 和其它非分

2021-11-19 07:00:00 377

原创 【Git 系列】一个超好用的命令你会用吗?

【Git 系列】git stashstash在英文意思是隐藏。git stash 的作用也是隐藏没完成的代码,防止它干扰别人或者新分支的工作。一、背景1.1 我们经常会遇到这样的情况正在 dev 分支开发新功能,做到一半时有人过来反馈一个 bug ,需要马上解决,但是新功能做到了一半你又不想提交。这时就可以使用 git stash 命令先把当前进度保存起来,然后切换到另一个分支去修改bug;修改完提交后,再切回 dev 分支,使用git stash pop来恢复之前的进度继续开发新功能。看到

2021-11-11 23:32:36 261

原创 【JDK】分析 String str=““ 与 new String()

一、基础概念为了讲清楚他们的差异,这里先介绍几个概念。1.1 常量池所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。1.2 字符串常量池在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。当我们需要使用字符串时,首先会在该字符串常量中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。1.3 在编译期间创建

2021-09-18 07:01:47 141

原创 【MyBatis】几种批量插入效率的比较

【MyBatis】几种批量插入效率的比较一、前期准备1.1 表结构1.2 项目配置文件1.3 实体类1.4 `UserInfoBatchMapper`1.5 `UserInfoBatchMapper.xml`1.6 预备数据二、反复执行单条插入语句2.1 对应 mapper 接口2.2 测试方法2.3 执行时间三、`foreach` 拼接`SQL`3.1 对应mapper 接口3.2 测试方法3.3 执行时间四、批处理4.1 `rewriteBatchedStatements` 参数4.2 批处理准备4.3

2021-09-14 09:28:39 528

原创 Maven系列(二):Maven 核心概念

Maven系列(二):Maven 核心概念一、仓库1.1 Maven 仓库仓库是一个位置(place),可以存储所有的工程 jar 文件、library jar 文 件、插件或任何其他的工程指定的文件。严格意义上说,Maven 只有两种类型的仓库:本地(local)远程(remote)1.2 本地仓库Maven 的本地仓库是机器上的一个文件夹。它在你第一次运行任何 Maven 命令的时候创建。Maven 的本地仓库保存你的工程的所有依赖(library jar、plugin jar

2020-10-14 14:56:45 386

原创 Maven系列(一):Maven 介绍与安装

虽然现在Gradle已经是主流,但是使用Maven维护的项目绝不占少数,刚好整理了下,整理成一个系列分享给大家。

2020-09-13 20:24:21 157

原创 Java 泛型详解:泛型类、泛型接口和泛型方法

Java 泛型一、概述Java 泛型(generics)是 JDK 1.5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。1.1 什么是泛型?泛型,即参数化类型。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是为了参数化

2020-07-05 06:06:18 3249 1

原创 正则表达式全解析

正则表达式定义了字符串的模式,可以用来搜索、编辑或处理文本。一、正则基础知识点1.1 元字符元字符是构造正则表达式的一种基本元素。几个常用的元字符:元字符说明.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始$匹配字符串的结束1.2 重复限定符正则表达式中一些重复限定符,把重复部分用合适的限定符替代。语法说明.

2020-06-23 14:20:03 5663

原创 Java 科学计算之 BigDecimal 全集

一、BigDecimal的产生背景首先我们先来看如下代码示例:@Testpublic void countDemo() { logger.info("result:{}", 0.06 + 0.01); logger.info("result:{}", 1.0 - 0.42); logger.info("result:{}", 4.015 * 100); logger.info("result:{}", 303.1 / 1000);}结果如下result:0.06

2020-06-17 11:32:14 636

原创 Java 获取本地IP地址和主机名

拿到本机 IP不是一件困难的事,但是拿到正确的就比较难了。一、一般方式【菜鸟教程】中直接通过 java.net.InetAddress类获取,如下:import java.net.InetAddress; public class Main { public static void main(String[] args) throws Exception { InetAddress addr = InetAddress.getLocalHost(); Sy.

2020-06-13 14:56:12 2410

原创 Mybatis 系列:Pagehelper + 拦截器实现分页

一、分页插件 PagehelperPageHelper是Mybatis的一个分页插件,非常好用!1.1 Spring Boot 依赖<!-- pagehelper 分页插件--><dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <v

2020-05-11 23:03:58 1420

原创 Spring Boot 系列:整合 Apache Dubbo

Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。注意,是 Apache Dubbo,不再是 Alibaba Dubbo(老版本的)。简单来说就是 Alibaba 将 Dubbo 移交给 Apache 开源社区进行维护。参见 dubbo-spring-boot-project...

2020-05-06 22:08:36 1468 2

原创 Spring系列:对象属性拷贝方式总结

当`get/set`太繁琐时;当`BeanUtils`无法拷贝集合时;当。。。可能,你需要好好看看这篇文章,文末附完整示例代码。

2020-04-23 00:39:04 7464 2

原创 Spring Boot 系列:发送邮件

发送邮件应该是网站的必备拓展功能之一,注册验证、忘记密码或者是给用户发送营销信息。一、邮件协议在收发邮件的过程中,需要遵守相关的协议,其中主要有:发送电子邮件的协议:SMTP;接收电子邮件的协议:POP3和IMAP。1.1 什么是SMTP?SMTP全称为Simple Mail Transfer Protocol(简单邮件传输协议),它是一组用于从源地址到目的地址传输邮件的规范,通过...

2020-03-30 21:39:07 1337

原创 从BWM生产学习工厂模式

工厂模式应用非常之广,在JDK底层源码以及各大主流框架中随处可见,一般以Factory结尾命名的类,比如Mybatis中的SqlSessionFactory,Spring中的BeanFactory等,都是工厂模式的典型代表。一、简单工厂模式1.1 概念简单工厂模式又称为静态工厂模式,属于设计模式中的创建型模式。简单工厂模式通过对外提供一个静态方法来统一为类创建实例,目的是实现类与类之间解耦:...

2019-12-03 00:06:39 464

原创 跟我学设计模式之单例模式

从今天开始,我将正式开始设计模式系列文章的写作分享。第一篇,当然从单例模式说起。单例模式可以说只要是一个合格的开发都会写,但是如果要深究,小小的单例模式可以牵扯到很多东西,比如:多线程是否安全?是否懒加载?性能等等。还有你知道几种单例模式的写法呢?如何防止反射破坏单例模式?

2019-11-21 20:10:19 286

原创 Spring系列:计时器 StopWatch

业务系统中经常需要两个对象进行属性的拷贝,大多时候时候使用的是Apache或Spring``BeanUtils,今天,我们来看一下一个更高效的属性拷贝方式:BeanCopier。

2019-11-06 19:38:51 675

原创 Spring Boot 系列:过滤器+拦截器+监听器

原 Swagger 文章合并到 Spring Boot 系列:配置 Swagger2一、过滤器 - Filter过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求。1.1 过滤器介绍过滤器依赖于Servlet容器过滤器可以拦截到方法的请求和响应(ServletRequest request, ServletResponse response),并对请求/响应做出过滤操作。1.2 过滤器用途用来做一些过滤操作,获取我们想要获取的数据:在过滤器中修改.

2019-10-11 20:27:44 1028

原创 JDK 1.8 之 Map.merge()

背景Map 中ConcurrentHashMap是线程安全的,但不是所有操作都是,例如get()之后再put()就不是了,这时使用merge()确保没有更新会丢失。因为Map.merge()意味着我们可以原子地执行插入或更新操作,它是线程安全的。一、源码解析default V merge(K key, V value, BiFunction<? super V, ? super V,...

2019-10-09 21:33:43 693

原创 Spring Boot 系列:整合JWT

Spring Boot认证:整合Jwt背景Jwt全称是:json web token。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。优点简洁: 可以通过URL、POST参数或者在HTTP header发送,因为数据量小,传输速度也很快;自包含:负载中可以包含用户所需要的信息,避免了多次查询数据库;因为To...

2019-10-05 00:13:20 269

原创 以商品超卖为例讲解Redis分布式锁

本案例主要讲解Redis实现分布式锁的两种实现方式:Jedis实现、Redisson实现。网上关于这方面讲解太多了,Van自认为文笔没他们好,还是用示例代码说明。一、jedis 实现该方案只考虑Redis单机部署的场景1.1 加锁1.1.1 原理jedis.set(String key, String value, String nxxx, String expx, int ti...

2019-09-21 00:49:41 305

原创 Spring Boot 系列:图片验证码及校验

文章目录一、思路二、示例代码2.1 项目依赖和配置2.2 生成图片验证码工具类2.3 测试接口三、测试及总结3.1 获取图片验证码3.2 校验图片验证码3.3 示例代码3.4 技术交流一、思路后端生成数字和字母混搭的指定位数的验证码,存储在Redis中;将生成的验证码画成图片并转换成base64字符,和Redis 验证码的key 一块返给前端;前端登录时候,把验证码传给后端,后端 取出 ...

2019-09-15 23:08:56 2664 7

原创 Spring Boot 系列:参数校验之 Validator

背景在开发中经常需要写一些字段校验的代码,比如非空,长度限制,邮箱格式验证等等,导致充满了if-else 的代码,不仅相当冗长,而且很让人抓狂。hibernate validator(官方文档)提供了一套比较完善、便捷的验证实现方式。它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了。在Spring Boot 火热的现在,...

2019-09-11 23:58:24 912

原创 Spring Boot 系列:RestFul API 接口实现统一格式返回

文章目录背景一、统一格式设计1.1 返回格式1.2 状态码1.3 错误信息1.4 返回对象1.5 成功标示二、实现方案2.1 错误码枚举2.2 统一结果集封装三、测试及总结3.1 简单的测试3.2 其他3.3 技术交流背景在分布式、微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式。前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,...

2019-09-10 22:19:32 5344

原创 Spring Boot 系列:集成 zxing 生成二维码

背景在网站开发中,经常会遇到要生成二维码的情况,比如要使用微信支付、网页登录等.在网站开发中,经常会遇到要生成二维码的情况,比如要使用微信支付、网页登录等.二维码应用场景信息获取(名片、地图、WIFI密码、资料)网站跳转(跳转到微博、手机网站、网站)广告推送(用户扫码,直接浏览商家推送的视频、音频广告)手机电商(用户扫码、手机直接购物下单)防伪溯源(用户扫码、即可查看生产地;...

2019-09-05 22:16:57 1877 1

原创 开发中,不同分支的代码合并

要将A分支的一个commit合并到B分支:1.首先切换到A分支git checkout Agit log2.找出要合并的commit ID ,如:0128660c08e325d410cb845616af355c0c19c6fe3.然后切换到B分支上git checkout Bgit cherry-pick 0128660c08e325d410cb845616af355c0c1...

2019-09-01 19:28:37 1911

原创 Spring Boot:高并发下浏览量入库设计

文章目录一、背景1.1 这么做,有几个问题:1.2 解决方案二、 手把手实现2.1 项目配置2.2 浏览量的切面设计2.3 同步任务`ArticleViewTask.java`2.4 测试接口`PageController.java`三、 测试四、 源码及说明4.1 源码地址4.2 更多文章4.3 技术交流一、背景文章浏览量统计,low的做法是:用户每次浏览,前端会发送一个GET请求获取一篇...

2019-08-27 00:29:12 3699 9

原创 Git 实用技巧:git stash

文章目录1. stash当前修改2. 查看现有`stash`3. 重新应用缓存的`stash`4. 移除`stash`我们经常会遇到这样的情况:正在dev分支开发新功能,做到一半时有人过来反馈一个bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可以使用git stash命令先把当前进度保存起来。然后切换到另一个分支去修改bug,修改完提交后,再切回dev分支,使用git sta...

2019-08-20 18:52:41 136

原创 Spring系列:从应用获取Bean的常用姿势

发送邮件应该是网站的必备拓展功能之一,注册验证、忘记密码或者是给用户发送营销信息。正常我们会用`JavaMail`相关`api`来写发送邮件的相关代码,但现在`SpringBoot`提供了一套更简易使用的封装。

2019-08-15 17:09:58 425

原创 SpringBoot:分库分表ShardingSphere实战

我们的项目中,随着数据量的不断扩大,单表数据达到千万级别,查询性能急剧降低,这时候需要我们做分库分表,降低单表的数据量和单个数据库的请求压力。我们公司之前采用的是当当维护的`Sharding-jdbc`,后来官方又恢复维护了,也就是`ShardingSphere `。

2019-08-07 23:03:06 1084

原创 Spring Boot 系列:全局异常处理

SpringBoot: 全局异常的处理@ExceptionHandler 可以处理异常, 但是仅限于当前Controller中处理异常;@ControllerAdvice可以配置basePackage下的所有Controller。结合两者使用,就可以处理全局的异常了。文章目录SpringBoot: 全局异常的处理一、开发准备1.1 异常1.2 项目依赖二、 项目Demo2.1 结果封装2....

2019-08-01 23:01:08 364 3

原创 Mybatis系列:数据源灵活切换

在业务场景中,随着数据量迅速增长,一个库一个表已经满足不了我们的需求的时候,我们就会考虑分库分表的操作,本文主要介绍SpringBoot + Mybatis 如何实现多数据源,动态数据源切换,可用于读写分离或多库存储。主要的配置说明见代码注释文章目录一、 数据库准备二、 项目配置2.1 项目依赖2.2 项目配置文件`application.yml`三、 多数据源配置3.1 动态数据源注册`...

2019-07-31 16:50:04 611

原创 Mybatis系列:整合 Druid 监控

Druid是什么?Druid是一个JDBC组件库,包括数据库连接池、SQL Parser等组件;DruidDataSource是最好的数据库连接池;Druid能够提供强大的监控(可视化)和扩展功能。文章目录一、添加依赖和项目配置二、业务相关代码2.1 建表sql2.2 表对应的实体类2.3 DAO层以及mapper.xml2.4 业务层接口2.5 控制层测试接口2.6 启动类添加`...

2019-07-26 22:35:25 390

原创 Spring Boot 系列:整合阿里云短信验证码

相比于腾讯云的短信服务,阿里云的短信好像更高大上一些,例如:阿里云控制台可以直接生成Java/Node.js/Go/Php等语言的 ApiDemo,并可以在线测试。当然,腾讯云也有它的优势:每个月每个月100条的免费额度!文章目录一、阿里云短信控制台二、项目示例2.1 项目依赖2.2 项目配置文件`application.yml`2.3 封装一个参数实体`SmsParams`2.4 封装发送...

2019-07-16 09:39:16 757

原创 Spring Boot 系列:整合腾讯云短信验证码

短信业务在我们日常使用的软件或者网站,应该算是无处不在的功能模块,比如注册、验证码功能。国内有很多互联网公司都提供短信业务,比如阿里、腾讯、七牛。本篇文章提及的是腾讯提供的短信服务。文章目录一、腾讯短信服务二、SpringBoot 发送短信验证码2.1 项目配置文件2.1.1 所需要的依赖`pom.xml`2.1.2 项目配置文件`application.yml`2.2 封装一个验证码实体类...

2019-07-10 22:01:51 2398

原创 Spring系列:事务管理

文章目录一、`TransactionTemplate.java` 源码分析1.1 `execute`方法的参数 `TransactionCallback`1.2 小节二、引用案例2.1 在SpringBoot配置中注入`TransactionTemplate`2.2 业务代码中的实际使用2.2.1 有返回值2.2.2 无返回值我们都知道Spring支持编程式事务和声明式事务,而Transact...

2019-07-04 22:35:06 174

原创 Idea 设置

文章目录一、全局配置二、显示设置三、功能配置四、自定义注释模板4.1、修改 Java 类注释模板一、全局配置全局JDK(默认配置):File ->Other Settins -> Structure for New Project Structure -> Project -> Project JDK全局Maven/Gradle(默认配置):Build,Execti...

2019-07-03 22:38:19 505

原创 Spring Boot 系列:整合七牛云上传文件

文章目录一、项目配置1.1 项目所依赖的jar包1.2 `yml`项目配置文件中七牛云账户相关的密钥1.3 新建七牛云配置文件类`QiNiuCloudConfiguration `1.4 Swagger2 配置二、 上传图片业务2.1 Controller 层 `QiNiuCloudController`2.2 上传接口 `UploadService`2.3 上传图片的实现 `UploadServ...

2019-06-25 22:13:38 602

空空如也

空空如也

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

TA关注的人

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