介绍 当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的.为此,我们可以使用Java Persistence API提供的乐观锁定机制.它导致在同一时间对同一数据进行多次更新不会相互干扰.为了使用OptimisticLocking,我们需要一个实体(Entity),其中包含一个带有@Version注释的属性.在使用它时,每个读取数据的事务都持有version属性的值.在事务想要进行更新之前,它将再次检查version属性.如果值在此期间发生了更改,则抛出ObjectOptimist…
前言 在之前的文章中,讲解了使用redis解决集群环境session共享的问题[快学springboot]11.整合redis实现session共享,这里已经引入了redis相关的依赖,并且通过springboot的配置,实现了session共享.下面,我们就通过springboot提供的RedisTemplate来操作redis. 注入RedisTemplate @Autowired private StringRedisTemplate redisTemplate; 这里我注入了一个Stri…
前言 之前已经写过一篇文章介绍SpringBoot整合Spring Cache,SpringBoot默认使用的是ConcurrentMapCacheManager,在实际项目中,我们需要一个高可用的.分布式的缓存解决方案,使用默认的这种缓存方式,只是在当前进程里缓存了而已.Spring Cache整合Redis来实现缓存,其实也不是一件复杂的事情,下面就开始吧. 关于Spring Cache的运用,请参考[快学SpringBoot]快速上手好用方便的Spring Cache缓存框架 新建一个Sp…
前言 之前在[快学springboot]6.WebMvcConfigurer配置静态资源和解决跨域里有用到WebMvcConfigurer接口来实现静态资源的映射和解决跨域请求,并且在文末还说了WebMvcConfigurer(springboot2.x之后使用该接口,springboot1.x使用WebMvcConfigurerAdapter类,不过该类已经被标识过期了)可以配置很多东西,如下: 下面,我们就通过代码,使用WebMvcConfigurer接口来实现一个springboot的拦截…
前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文章讲了多种接受参数的方法[快学springboot]3.多种接受参数的方式.因为目前json类型的参数是最常用的,所以这里只讲解json类型的参数校验.其他类型的大同小异. 新建一个Param.java public class Param { private String username; pu…
jpa简介 Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据.它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术.值得注意的是,JPA只是一套规范,不是具体的实现.Java很喜欢自己去定义规范,然后让厂商自己去实现,比如JMS等. Spring Data JPA Spring Data JPA是 Spring 基于 ORM(hibernate) 框…
原文 :https://blog.csdn.net/tianyaleixiaowu/article/details/90036180 乐观锁 乐观锁就是在修改时,带上version版本号.这样如果试图修改已被别人修改过的数据时,会抛出异常.在一定程度上,也可以作为防超卖的一种处理方法.我们来看一下. 我们在Goods的entity类上,加上这个字段. @Version private Long version; @Transactional public synchronized void mu…
前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 本文发布于掘金号[Happyjava].Happy的掘金地址:https://juejin.im/user/5cc2895df265da03a630ddca,Happy的个人博客:http://blog.happyjava.cn.欢迎转载,但须保留此段声明. 创建SpringBoot工程 通过Spr…
前言 Docker技术发展为当前流行的微服务提供了更加便利的环境,使用SpringBoot+Docker部署和发布应用,其实也是一件比较简单的事情.当前,前提是得有Docker的基础. 源码在文末 文末有项目源码的github地址 构建一个SpringBoot项目 本人最早的一篇文章,就是教大家如何使用Spring Initialise工具,快速的创建一个SpringBoot项目,如果还不懂的,可以翻一下本人的第一篇文章,这里就不多讲了.下面贴一下主要的文件内容: pom文件的大部分内容这里就不…
原创声明 本文首发于头条号[Happyjava].Happy的掘金地址:https://juejin.im/user/5cc2895df265da03a630ddca,Happy的个人博客:http://blog.happyjava.cn.欢迎转载,但须保留此段声明. mybatis plus简介 来自官方对于mybatis plus的介绍:MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生.其支持以下…
Spring Security介绍 Spring Security是Spring全家桶中的处理身份和权限问题的一员.Spring Security可以根据使用者的需要定制相关的角色身份和身份所具有的权限,完成黑名单操作.拦截无权限的操作等等. 本文将讲解Springboot中使用spring security. 引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>…
前言 有的时候,配置信息是我们无法在开发过程中就能确定的.比如,给客户开发的项目,客户需要根据自身的情况自定义配置,如数据库配置,加密密钥配置等等.这时候,就需要把配置文件放在外面,让用户自定义配置部署了. SpringBoot应对这种情况简直就是游刃有余,其有多种加载配置文件的方式.下面我们就来认识一下 配置文件放在外部 SpringBoot支持把配置文件放在外部.只要把配置文件放在jar包的同级目录下,或者放在同级下的config文件夹中,SpringBoot都会去此处读取配置文件.现在有一…
前言 虽然现在流行前后端分离开发和部署,但是有时候还是需要用到服务端渲染页面的.比如:需要考虑到SEO优化等问题的时候,FreeMark其实还是很有作用的.本人的博客本来是用React开发的,但是后来发现搜索引擎难以收集由JS渲染的页面,所以前段时间,是用jQuery+FreeMark重写了我的博客前端页面.感兴趣的朋友,可以点击下面的查看更多的链接跳转至本人的博客. 在springboot中,不推荐使用JSP(其实任何项目都不推荐使用JSP),而是推荐使用模板引擎,如FreeMark.其实使用…
前言 我们都知道springboot的配置卸载application.properties配置文件上(或者application.yml).但是,如果想要把不同的环境(如开发环境,测试环境,生产环境)的配置文件分离,这要怎么做呢?其实,SpringBoot是支持指定不同的配置文件的. SpringBoot配置文件格式 在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识(不一定是.prop…
前言 很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并代码.写单元测试,也是保证代码质量的一种方式. junit单元测试 相信绝大多数的Java开发者都用过Junit来写单元测试. 引入依赖: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</vers…
前言 在实际项目中,经常需要用到邮件通知功能.比如,用户通过邮件注册,通过邮件找回密码等:又比如通过邮件发送系统情况,通过邮件发送报表信息等等,实际应用场景很多.这篇文章,就教大家通过springboot快速的实现一个发送邮件的功能. 开启smtp 这里以QQ邮箱为例.登录QQ邮箱之后,点击设置,点击账户.如下图: 点击开启IMAP/SMTP服务. 记下QQ邮箱提示的授权码: 这个授权码,就是发送邮件时需要的密码. 以上步骤完成之后,就可以开始开发了. 引入依赖 在springboot项目中,引…
前言 很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并代码.写单元测试,也是保证代码质量的一种方式. junit单元测试 相信绝大多数的Java开发者都用过Junit来写单元测试. 引入依赖: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</vers…
swagger简介 官方的介绍 THE WORLD'S MOST POPULAR API TOOLING Swagger is the world's largest framework of API developer tools for the OpenAPI Specification(OAS), enabling development across the entire API lifecycle, from design and documentation, to test and…
前言 之前讲解了springboot(StringRedisTemplate)操作redis的string数据结构,这篇文章将会讲解list数据结构 list数据结构具有的操作 下图列出了redis list数据结构所具有的方法 StringRedisTemplate提供的方法 RedisTemplate提供的操作redis的方法列表如下: 下面,我们挑一些常用的方法作为实例讲解,其它方法,可以参考API说明即可. range 现在redis中有一个list,其key为:happyjava:li…
前言 这里都是基于前面的项目基础上的.springboot整合redis非常的方便,这也是springboot的宗旨,简化配置.这篇文章就教大家如何使用springboot整合redis来实现session共享. 引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId>…
介绍 springboot对数据库事务的使用非常的方便,只需要在方法上添加@Transactional注解即可.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP,将具体业务逻辑与事务处理解耦.声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多. 使用Transactional注解 Transactional注解使用起来是非常简单的,只需要在相应的方法上面标识Tr…
前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": "2019-04-25T13:09:02.196+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes":…
勘误 有个朋友说:为什么我配置了WebMvcConfigurer,静态资源static依然能访问?! 这里是本人的失误,我在启动类中添加了EnableWebMvc注解(文章里却没有提及,最好的做法是放在对应的配置类上面),导致了默认配置的失效.如果不使用该注解,默认的配置路径不会被覆盖掉~ 前言 虽然现在都流行前后端分离部署,但有时候还是需要把前端文件跟后端文件一起打包发布,这就涉及到了springboot的静态资源访问的问题.不单只是静态资源打包,比如使用本地某个目录作为文件存储,也可通过We…
前往掘金查看:https://juejin.im/post/5d05e5f9f265da1b6c5f74b4 前言 在开发中,我们常常会碰到多种传参的方式.这里,我们就来总结下,springboot中可以运用到的接受参数的方式. URL参数 这种参数,组合在url上,形如url/{id}.在springboot中,接受此类参数可以使用PathVariable注解,如下: @GetMapping(value = "/param/{id}") public Object pathVaria…
Restful简介 Restful一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. 随着Restful风格的流行,现在更多的人叫HTTP接口为Restful接口.所以还是很有必要了解下Restful的一些基础约定的. Rest架构的主要原则 网络上的所有事物都被抽象为资源,使用http方法表示具体操作,如下: 幂等的意思是说,多次相同的请求,数据是保持一致的. res…
若图片查看异常,请前往掘金查看:https://juejin.im/post/5d00e793f265da1b614ff10b 使用spring initialize工具快速创建springboot项目 IDEA专业版默认集成了此工具,eclipse或者vs code等可以自行搜索安装.如果不希望安装此插件,也可直接通过官网创建spring boot项目,然后下载到本地即可.官网地址如下:https://start.spring.io/ 在IDEA使用spring initialize工具 创建…
若图片查看异常,请前往掘金查看:https://juejin.im/post/5d079e555188251ad81a28d9 XSS攻击是什么 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. 简而言之,就是作恶用户通过表单提交一些前端代码,如果不做处理的话,这些前端代码将会在展示的时候被浏览器…
说明 使用@Async注解创建多线程非常的方便,还可以通过配置,实现线程池.比直接使用线程池简单太多.而且在使用上跟普通方法没什么区别,加上个@Async注解即可实现异步调用. 用法 AsyncTask.java @Component public class AsyncTask { private static final Logger LOG = LoggerFactory.getLogger(AsyncTask.class); @Async public void register(){…
前一篇博客我们从数据库角度分析,锁可以分为三种,分别为共享锁,独占锁和更新锁.我们从程序的角度来看锁可以分为两种类型,悲观锁和乐观锁,Hibernate提供对这两种锁 的支持,我们来了解一下Hibernate如何实现这两种锁. 一.悲观锁 Pessimistic Locking 通常由数据库机制实现,在查询的整个过程中把数据锁住,只要事务不释放(提交/回滚),那么其他任何用户都不能查看或修改数据,这种锁的方式是比较简单.直接.从开始就讲数据全部锁上,这种锁主要针对并发修改造成数据不一致的问题,但…
在实际的多用户并发访问的生产环境里边,我们经常要尽可能的保持数据的一致性.而其中最典型的例子就是我们从表里边读取数据,检查验证后对数据进行修改,然后写回到数据库中.在读取和写入的过程中,如果在多用户并发的环境里边,其他用户已经把你要修改的数据进行了修改是非常有可能发生的情况,这样就造成了数据的不一致性. 最近在做快钱支付的时候就碰到了这个问题,原来的代码如下:1. 表Order的结构:    OrderId   int 自增长    Status   nvarchar(10)  //未处理时的状…