- 博客(46)
- 资源 (3)
- 收藏
- 关注
原创 Servlet之过滤器
Servlet之过滤器过滤器Filter基本使用注解方式:创建一个Filter类实现Servlet的Filter接口,重写他的init()方法,doFilter()方法以及destroy()方法。init() : 当Servlet容器启动时,初始化创建Filter,就会执行该方法,该方法只会执行一次。doFilter(): 因为我配置的是/* 拦截,则每次Http请求都会执行一次doFilter方法。destroy(): 当Servlet容器被销毁时,该过滤器也就被回收了,此时会调用
2022-05-08 19:37:31 1055
原创 Java之SPI机制
Java之SPI机制JavaSPI机制基本使用创建一个接口public interface DemoService { void print();}创建一个实现类public class DemoServiceImpl implements DemoService { @Override public void print() { System.out.println("print......"); }}在resources下创建M
2022-04-05 16:48:03 758
原创 SpringBoot自定义多数据源starter组件
SpringBoot自定义多数据源starter组件本案例我们使用多数据源封装成一个starter组件,以方便使用多数据源访问数据库的操作创建一个普通Java项目,引入SpringBoot相关的依赖pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins
2022-04-01 10:50:19 1446 1
原创 Spring之工具类
Spring之工具类日常学习开发中,项目中经常需要用到各种工具类,而Spring框架中为我们提供了一些列工具,我们可以在不引用其他包的情况下,使用这些工具也能满足常规需求。断言工具Assertpublic static void testAssert() { // false将会抛出IllegalStateException异常 Assert.state(false, "状态异常"); // 自定义消息时,传递一个Supplier函数式接口 Assert.state(f
2022-03-19 14:15:58 6982
原创 Spring之Resource
Spring之Resource本文讲解如何使用Spring中的Resource接口处理资源Resource接口的几个主要实现类如下:UrlResourceClassPathResourceFileSystemResourcePathResourceServletContextResourceInputStreamResourceByteArrayResourceUrlResource访问本地资源public static void main(Strin
2022-03-10 15:02:24 750
原创 Spring之方法参数名称获取
Spring之方法参数名称方式一通过Spring中类 LocalVariableTableParameterNameDiscoverer 获取方法参数名称案例如下:public class TestReflect { public static void main(String[] args) { // 反射获取类的所有方法 Method[] declaredMethods = TestReflect.class.getDeclaredMethods(); Local
2022-03-02 11:23:09 1801
原创 Spring之参数解析器
Spring中的参数解析,可以让我们自定义的对处理器的一些参数请求做处理,自定义参数解析主要是通过实现 HandlerMethodArgumentResolver 接口,重写supportsParameter()方法和resolveArgument()方法,并注册解析器,即可启用。一、自定义参数解析器重写 HandlerMethodArgumentResolver 接口方法public class DemoArgResolver implements HandlerMethodArgumentReso
2022-02-21 10:09:32 1484
原创 Spring之拦截器
一、Spring拦截器简介Spring拦截器是一种基于AOP的技术,本质也是使用一种代理技术,它主要作用于接口请求中的控制器,也就是Controller。因此它可以用于对接口进行权限验证控制。下面我们看一个简单的拦截器例子创建一个DemoInterceptor类实现HandlerInterceptor接口,重写preHandle(),postHandle(),afterCompletion() 三个方法,如下代码,我们就创建了一个Spring的拦截器。public class DemoInterce
2022-02-14 17:15:08 12928 2
原创 Java8之组合式异步编程
组合式异步编程:CompletableFuture一、Future接口Future的使用,如下代码中的例子,提交一个执行需要耗时5000ms的代码给线程池,而后会立即执行打印 other code ...不会收到阻塞,当执行到future的get()方法时,会阻塞代码,等待任务执行完并返回结果。在这个例子中,我们使用异步任务执行耗时操作。通过future获取执行结果/** * @author kenewstar * @date 2022/01/25 */public class TestAsy
2022-01-25 09:00:00 899
原创 Java8之Optional与日期API
Java8之Optional与日期API一、Optional在开发过程中我们经常会遇到NPE,也就是空指针异常,而Optional正是一种解决NPE的很好方式。Null所带来的问题:① Null对象是NPE异常的源头② 因为检查Null,会带来大量的代码检查③ Null值没有任何意义④ 当将Null值传递给变量时,无法通过该变量获取其类型1.Optional的创建声明一个空的Optional对象Optional<Integer> empty = Optional.empty(
2022-01-24 09:00:00 805
原创 Java8之函数式编程
Java8之函数式编程Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。1.Lambda表达式如下案例所示,分别创建三个接口,每个接口中只有一个方法,通过lambda表达式重写接口中的方法,可极大的简化代码。当只有一个入参时,则无需写 () 当表达式只有一行时则无需写 {} 与 return/** * @author kenewstar
2022-01-23 20:21:38 3955
原创 SpringSecurity系列之基于数据库认证
SpringSecurity系列之基于数据库认证本文中所使用的技术栈如下:SpringBoot 2.6.2MyBatis Plus 3.5.0SpringSecurity 5.6.1一、创建数据库表如下图所示,创建一个简单的用户数据表,实际开发中应当使用密文存储密码,而不是如下当中的明文存储。二、创建SpringBoot应用1.配置application.properties文件主要是配置数据库连接信息# 指定端口号server: port: 8888# 配置数据库连接信息
2022-01-21 20:32:57 2304
原创 并单规则(数据分组)
在许多业务场景中经常遇到并单规则,即根据并单规则中的指定的并单字段对数据进行合并生成,例如其中有5条行数据,并单后可能生成1条单据或者多条单据。具体实现案例代码如下:@Data@NoArgsConstructor@AllArgsConstructorpublic class Invoice { private Integer id; private String name; private Integer days; private Long supplierId; p
2021-09-06 20:49:15 908
原创 锁(Locks)
锁(Locks)1 ReentrantLock应用demo可重入锁,是一种使用递归无堵塞的同步机制比 synchronized 更强大、更灵活的锁机制,可以减少死锁发生的概率默认为非公平锁,可以自定义为公平锁底层采用 AQS 实现,通过内部 Sync 集成 AQS简单应用:/** * @author kenewstar * @version 1.0 * @date 2021/5/14 */public class Concurrent07 { private int cou
2021-05-16 14:56:18 1122
原创 ThreadLocal使用与分析
ThreadLocal使用与分析ThreadLocal一种解决多线程环境下成员变量的问题的方案,但是与线程同步无关,其思路就是为每个线程创建一个单独的变量副本。 从而每个线程都可以独立的改变自己所拥有的变量副本,而不会影响其他线程对应的变量副本。ThreadLocal不是用于解决共享变量的问题,也不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制四个方法:get() 方法:返回当前线程局部变量的副本中的值initalValue() 方法:返回当前线程局部变量的值re
2021-05-15 11:27:49 642 3
原创 并发工具类
并发工具类1 CountDownLatch 该工具是用来同步一个或多个任务,强制他们等待由其他任务执行的一组操作。功能可以类比Thread类的join方法。给该对象设置一个计数值,当一个任务完成时,调用countDown()方法对计数值减一,当计数值为0时,所有任务都完成了。CountDownLatch只触发一次,计数值不能重置。public static void countDownLatch() throws InterruptedException { long start = In
2021-05-14 14:47:49 642 1
原创 生产者与消费者模型
生产者与消费者模型一个计数器count 生产者每次count++ 当count为20时,生产者等待消费者进行消费,消费者每次count - -,当count为0时,消费者等待生产者生产。当count++时需要对等待的消费者进行唤醒操作,此时count > 0 消费者可以消费,当count - - 时需要唤醒生产者进行生产,此时count < 20 。生产者可以进行生产。设定只生产100个产品,当生产者生产完100个产品后,退出生产,消费者消费完所有产品后也退出消费。Java代码实现如下(
2021-05-13 20:56:51 626
原创 MySQL命令学习5
MYSQL学习51 .使用存储过程存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。为什么要使用存储过程?通过把处理封装在容易使用的单元中,简化复杂的操作由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试验和测试)存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。简化对变动的管理。如果表名,列名或业
2020-07-08 21:12:10 846
原创 MySQL命令学习4
MYSQL学习41 .插入数据① 使用 insert使用insert向数据表中添加数据 insert into users(username,password,userage) values('ddddd','123456',27);如上插入数据成功,由于id为主键,自增,因此不需要给其添加值,添加成功后下面显示一行受影响;②插入多行数据可以使用多条insert语句,但是会比较繁琐 insert into users(username,password,userage) values
2020-07-05 18:06:24 749
原创 MySQL命令学习3
MYSQL学习3SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表。联结是利用SQL的select能执行的最重要的操作,很好地理解联结及其语法是学习SQL的一个极为重要的组成部分。1 .联结表① 两表关联查询如下有两张表,用户表与角色表,用户表的外键为角色表的主键在前面的学习中我们使用了嵌套查询,但是我们不建议使用嵌套查询,因为它效率低,推荐多表关联查询例如,我们要查询角色为管理员的用户,并且按照user表的id排序select user.id as user_id,use
2020-07-04 17:21:10 1566 3
原创 MySQL命令学习2
MYSQL学习21 .创建计算字段创建一个水果表,表中有字段id,fruit_name,fruit_price① 计算每种水果的总价格,生成新的列名select fruit_name,fruit_price,count,fruit_price*count as total_pricefrom fruits;②测试计算2 .使用数据处理函数函数的可移植性不强① 文本处理函数使用upper()将水果名大写select upper(fruit_name) from fruits;
2020-07-02 17:01:46 1884 2
原创 MySQL命令学习1
MYSQL学习1MySql环境:MySql8.0.191 .使用命令行客户端操作数据库的相关命令①显示所有数据库show databases;② 使用某个数据库use test;③显示数据库中的所有表show tables;④ 显示某表的所有字段信息show columns from users;2 .检索数据①查询某表的所有数据查询users表的全部数据select * from users;② 查询某表中的特定字段的数据查询users表中usernam
2020-07-02 12:05:46 1062
原创 Java集合的深入学习
一、Java集合List:有序可重复集合;Set:无序不重复集合;Map:键值对存储,key必须唯一,只有一个key可以为null,value可以有多个null,使用key来搜索value;测试Map中key为null,而value不为null@Testpublic void test1() { Map<String, String> map = new HashMap<>(); map.put(null, "kenewstar"); System.out.prin
2020-06-29 22:49:14 1105
原创 SpringSecurity系列之入门案例
一、创建一个普通Java项目1. 修改pom.xml文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
2020-06-28 20:00:10 1403 1
原创 SpringBoot学习之整合SpringDataRedis
项目环境:Jdk11.0.2、Redis3.0.0、Centos7一、安装Redis3.0.0在Linux下解压redis安装包进入解压后的目录进行编译编译完成将redis安装到指定目录启动redis默认端口Port:6379属于前置启动,会占用整个终端,按Ctrl+C停止后置启动,将redis.conf复制到redis/bin目录下修改复制后的配置文件,将no该为yesCentos7开放端口启动redis 查看redis是否启动成功IDEA客户端工具连接re
2020-06-28 11:13:17 1670
原创 SpringBoot 学习之整合 SpringDataJPA
项目环境:Jdk11.0.2、MySql8.0.19一、创建普通Java项目二、修改 pom.xml 文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://m
2020-06-27 18:55:29 800
原创 SpringBoot+vue.js
一 、创建一个普通Java项目二、修改POM文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http
2020-05-29 20:26:31 1956 1
原创 SpringBoot学习6之整合MyBatis做CRUD(SpringBoot+MyBatis+SpringMVC+Thymeleaf)
SpringBoot整合MyBatis
2020-04-24 20:23:34 948
原创 SpringBoot学习5之整合thymeleaf
SpringBoot整合视图层技术(2)SpringBoot官方推荐使用Thymeleaf模板引擎做视图层开发;
2020-04-23 14:36:57 938
原创 SpringBoot学习4之整合jsp与freemarker
SpringBoot整合视图层技术(1)1 SpringBoot整合jsp使用jsp作为视图层,虽然SpringBoot官方并不推荐,但是我们我们也学习一下,不做深入即可;
2020-04-22 15:36:01 1117
原创 SpringBoot学习2之整合Web技术
(一)SpringBoot整合Servlet技术很多刚接触JavaEE的初学者都会学习Web技术中的Jsp/Servlet,同样的SpringBoot中也提供了整合Servlet技术的;创建一个Java项目(IDEA+Maven)项目创建完毕;SpringBoot整合Servlet有两种方式:1 通过注解方式完成Servlet组件的注册① 创建一个FirstServlet类继承Ht...
2020-04-20 18:08:37 1427 2
原创 SpringBoot学习1之入门
(一)使用Maven工具创建一个java项目target目录是项目编译后生成的目录在pom.xml文件中添加配置:添加springboot父项目依赖,并且添加springboot启动器,如下:<parent> <groupId>org.springframework.boot</groupId> <artifactId>sp...
2020-04-19 13:55:49 1016 2
原创 使用IDEA中的Maven创建一个Web项目
(一)创建web项目File -> New -> Project出现如下图所示:出现上图所示,项目就创建完毕了。(二)项目配置项目目录结构如下所示:上图中我们可以看到它没有源码目录,和资源文件目录,我们需要自行创建,如下所示:创建两个目录:我们可以看到这两个目录是灰色,我们需要指定它为我们的源码根路径和资源根路径,如下所示:最后结果如下图所示:到此项目...
2020-04-18 11:07:12 1223
原创 MyBatis的兄弟MyBatis-Plus
(一)MyBatis-Plus简介MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。特性1)无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑2)损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作3)强大的 CRUD 操作:内置通用 Mapper、通用 ...
2020-04-17 22:16:26 949
原创 Mybatis学习4之动态SQL
(一)简介Mybatis提供了SQL语句动态的组装能力,它所包含的几个元素也非常简单,SQL语句的组装可以在XML映射文件中配置,也可以使用注解,但是使用注解配置功能会受到限制。Mybatis的动态SQL包括如下的元素:if:判断语句,单条件分支判断;choose(when,otherwise):相当于Java中的case,when语句,多条件分支判断;trim(where,set):辅...
2020-04-07 23:29:44 933
原创 Mybatis学习3之配置
MyBatis的配置文件属性Mybatis配置文件的文件结构如下代码所示:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config....
2020-04-07 17:01:00 946
原创 Mybatis学习2之XML映射器
1 字符串替换Mybatis框架非常灵活,假设数据库中有三个字段(id,username,password):(一)通过id查询用户信息;(二)通过username查询用户信息;(三)通过password查询用户信息;按正常情况下,我们需要创建三个方法:(一)findUserById(int id);(二)findUserByUsername(String username);(三...
2020-04-03 18:16:23 935
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人