自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 收藏
  • 关注

原创 微服务拆分-远程调用

现在我们已经做了服务的拆分,购物车功能和商品服务功能分别拆分到了两个独立的微服务当中,也就是说代码上面它们是隔离开的,不仅如此,每个微服务将来还会有自己独立的数据库,数据上也是隔离开的。我们在查询购物车列表的时候,它有一个需求,就是不仅仅要查出购物车当中的这些商品信息,同时还要去查到购物车当中这些商品的最新的价格和状态信息,跟购物车当中的快照进行一个对比,从而去提醒用户。字节码泛型会擦除,但是new的对象它的泛型是还在的,这个时候就可以利用反射拿到这个对象上的这个泛型,从而就知道了我们想要的返回值类型。

2025-03-09 03:05:07 483

原创 微服务拆分-拆分购物车服务

将hm-service模块里面有关购物车的代码拷贝到cart-service模块中去。做了拆分该模块获取不到其他模块的数据库信息,所以将该模块的功能注释起来,加上TODO以便后期处理。虽然业务不完整但是可以运行,我们希望它激活的是local不是dev配置文件,因为这样它读取的才是我们虚拟机MySQL的ip地址。拷贝item-service模块的配置文件进行修改,每一个微服务都有自己的数据库。新建一个cart-service模块,实现购物车服务。导入item-service模块的依赖。

2025-03-08 01:10:57 322

原创 微服务拆分-拆分商品服务

我们需要去创建一个新的MySQL的实例,利用Docker重写创建一个,然后这个微服务独享一台MySQL,那么ip地址端口可能都会变化。我们采用了折中方案,我们不可能再用原来的这张表这个库了,我们用一台MySQL然后在这里面去创建不同的database,每个微服务创建一个database来做数据隔离。将 hm-service模块里面有关商品的类拷贝到item-service模块里面去。准备一个启动类,或者拷贝hm-service模块里面的启动类进行修改。把准备好的sql 放到MySQL里面去运行。

2025-03-06 23:41:51 543

原创 Docker项目部署-部署前端

Docker项目部署-部署前端

2025-03-01 03:20:57 337

原创 Docker项目部署-部署Java应用

3.利用命令docker build -t 镜像名 . 构建镜像。2.把打包得到的jar包和Dockerfile一起放到虚拟机里。4.最后利用docker run 去部署应用。1.首先需要将项目打包,打包完得到jar包。部署一个Java项目需要做什么事情。

2025-03-01 02:36:42 358

原创 Docker基础-容器网络互连

这个ip地址是Docker网桥给我们分配好的,假设我们这个服务重新启动或者在重启的过程中有其他容器也启动了 ,那么你的ip地址有可能就会被别人占有,这个ip地址会不断递增会变化。一旦我们创建了一个自定义网络,它会形成一个新的网桥,而这个新的网桥它是自定义的。我们发现它只有heima这个网桥了没有默认网桥,这是因为我们在创建的时候指定了,它就不会再加入默认的了,就会直接加入我们指定的。两个容器的ip接近,只有最后一位不同, 说明这两个容器它们其实是在一个网段当中的,这就意味着着它们之间是可以互相访问的。

2025-02-28 21:02:57 273

原创 Docker基础-本地目录挂载

我们发现数据卷还在,数据仍然存在,但是如果我们重新创建MySQL新版本的容器的时候生成卷的名字变了,那原来的那些数据在这个旧的卷里等于丢失了。匿名卷名字太长,目录深,操作起来不方便,所以不建议用。假如我们现在需要对MySQL版本去做升级,需要把旧的MySQL容器删掉,然后创建新的容器。不是我们创建的数据卷由容器运行时自动创建的数据卷,叫做匿名卷。首先创建相应的目录,方便后面的目录挂载。Destination:容器内目录。成功挂载到本地目录数据产生。Name:数据卷的名字。查看容器的详细信息。

2025-02-28 00:58:30 469

原创 Docker基础-数据卷挂载

一旦这个绑定产生了,只需要在html/data下,也就是在宿主机这个目录下去新增一个文件,它就会自动跑到容器内的目录下,反过来,只要容器内这个目录下做了修改,那么反过来宿主机的这个目录里这个文件也会跟着修改。这说明我们在宿主机里做的一切操作,容器内自动出现,也就是说利用数据卷我们就实现了宿主机目录与容器内目录之间的自动的双向的映射。宿主机的目录跟html的数据卷进行了映射,而html数据卷又跟容器目录进行了映射,宿主机目录间接的跟容器目录产生映射关系。进入数据卷对应的宿主机目录。展示数据卷的详细信息。

2025-02-27 01:39:57 302

原创 Docker基础-命令的别名

首先找到root目录下的叫bashrc的文件,root目录可以用~来代替。alias代表别名,后面起的就是命令的别名,=后面是这个命令的原始命令。这样的命令太长了我们要简化命令就需要用到Linux的技巧叫命令的别名。按i进入编辑模式,编辑完按Esc进入命令模式,然后:wq保存并退出。

2025-02-26 01:50:51 215

原创 Docker基础-常见命令

也可以加格式化方式访问,格式会更加清爽 docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"已经在容器的内部了,它模拟了一个计算机,它有自己独立的网络,独立的内存,独立的文件系统。(这里我们做的是宿主机的80映射到容器内的80端口)。docker ps -查看当前容器的运行状态(默认情况下查看的是运行中的容器)。docker ps -查看当前容器的运行状态(默认情况下查看的是运行中的容器)。

2025-02-25 22:38:52 1036

原创 MybatisPlus-插件功能-通用分页实体与MP转换

传输参数非常灵活,方便。可以不传输参数,可以传输1个或多个,也可以传输一个数组。·可变参数的格式:数据类型 ...参数名称。注意:可变参数在方法内部其实就是一个数组。·可变参数用在形参中可以接收多个数据。1.一个形参列表中可变参数只能有一个。2.可变参数必须放在形参列表的最后面。

2025-02-24 02:25:31 399

原创 MybatisPlus-插件功能-通用分页实体

首先我们需要准备请求参数和返回值的实体,像这种查询一般会封装成query实体代表查询,返回VO实体或者是DTO实体。只返回前端就是VO,如果说是可能会给其他的服务去使用的,比如说我们后面的微服务相互之间调用,也可能会用DTO。

2025-02-23 23:36:05 329

原创 MybatisPlus-插件功能-分页插件基本用法

PaginationInnerInterceptor一个分页的内置拦截器也就是分页插件,在new的时候需要指定选择访问的一个数据库的类型,以及一些分页的参数。MybatisPlusInterceptor这个bean并不是我们最终的我们想要使用的各种各样的插件,它是一个总的拦截器,在它的内部可以去添加各种插件。mp的插件其实是基于一个拦截器去做的,它会拦截你的业务SQL语句的执行,然后去实现各种各样的一些拓展的功能。第一步,配置插件,配了插件以后插件才会生效。第二步,使用分页的API,完成分页。

2025-02-23 20:38:24 389

原创 MybatisPlus-扩展功能-JSON处理器

mp恰好给我们提供了这样的类型处理器,AbstractJsonTypeHandler是一个抽象的JSON处理器,它有三个实现类这三个实现类主要是在底层在做JSON处理时用的第三方框架不同,GsonTypeHandler是用谷歌的Gson来实现的,JacksonTypeHandler是用Jackson来实现,FastjsonTypeHandler是用Fastjson来实现。因为它是JSON的字符串在Java当中是没有这样一种数据类型的,在Java当中我们一般情况下用字符串去接收。

2025-02-22 22:16:17 398

原创 MybatisPlus-扩展功能-枚举处理器

那如果说你想让它以value返回,也就是1和2返回,或者是以desc这个中文返回,那么你就需要告诉我们程序,我们这个程序的数据往前端返回由Spring MVC处理,Spring MVC 底层它在处理JSON的时候用到一个Jackson包,Jackson它提供一些注解用来标记这个枚举里面的值到底把谁进行返回。在Mybatis里有一个叫TypeHandler的类型处理器,我们常见的PO当中的这些成员变量的数据类型,它都有对应的处理器,因此它就能自动实现这些Java数据类型与数据库类型的相互转换。

2025-02-22 19:49:58 376

原创 MybatisPlus-扩展功能-逻辑删除

MybatisPlus-扩展功能-逻辑删除

2025-02-22 18:27:35 106

原创 MybatisPlus-扩展功能-DB静态工具-练习

2.4.用户地址集合分组,相同用户的放入一个集合(组)中,也就是说根据用户的id进行分组,哪几个地址是该id用户的,就放入该id用户对应的集合里面去。key就是用户id,value是该id用户对应的地址。处理极端情况:如果一次性添加大量元素(如通过 addAll()),新容量会直接调整为刚好能容纳所有元素的最小值,而不是严格按 1.5 倍增长。2.2.根据用户的id集合查询地址,得到一个总的地址集合(也就是根据用户id查出来的所有的地址)。总的有两步,第一步:查询用户,第二步:查询地址。

2025-02-22 00:53:55 538

原创 MybatisPlus-扩展功能-DB静态工具

IService接口里面的方法都是非静态的,而DB是静态工具,所以里面的方法都是静态的。而静态工具它由于是静态的,类上是不可能有泛型的,或者说静态的方法是没有办法读取到类上的泛型的。我们在开发业务的时候,有的时候会出现一种场景就是多个service之间会相互调用,如果我们采用传统的方式也就是@Autowired去注入的方式,那service之间相互注入就会出现循环依赖,这就给我们开发带来很大的麻烦,因此我们的建议是一旦出现service相互调用,可以使用DB静态工具去调用。

2025-02-21 19:04:06 607

原创 AOP进阶-连接点

在环绕通知当中我们是可以获取到目标方法运行的返回值的,因为我们会调用原始方法执行。如果是前置通知,我们是拿不到目标方法运行的返回值的,因为前置通知它是在原始方法运行之前运行的。

2025-02-21 01:38:17 288

原创 AOP进阶-切入点表达式-@annotation

自定义注解·测试。

2025-02-21 01:00:41 302

原创 AOP进阶-切入点表达式

方法的返回值是void,方法的形参也是一个 Integer类型的参数。这个mapper接口当中的delete方法可以和切入点表达式匹配,所以这个通知方法运行了两次。一次是在service的delete方法运行之前运行的,另外一次是在mapper接口的delete方法运行之前运行的。我们在运行单元测试方法的时候,调用的是deptService当中的delete这个方法,在运行这个实现类当中的delete方法时又调用。因为一旦将包名.类名直接省略了,这个表达式匹配的范围过大,就会影响匹配的效率。

2025-02-20 22:38:39 191

原创 AOP进阶-通知顺序

after是在原始方法运行之后的通知,它的运行顺序是4,3,2。这个和切面类的类名有关系,在原始方法运行之前运行的这些通知,类名排名越靠前越先执行。而在原始方法运行之后的这些通知,类名排名越靠前越后执行。假如我想让4这个切面类当中的前置通知先执行,然后让5的前置通知执行,最后让3的前置通知执行。1.不同的切面类当中,默认情况下,通知的执行顺序是与切面类的类名字母排序有关。MyAspect切面类,切面类里面的连接点方法是一样的,只是输出的内容不同。默认的情况下,通知的执行顺序是与切面类的类名排序有关系。

2025-02-20 18:54:42 193

原创 AOP进阶-通知类型

在定义通知方法之后,我们上面加上了不同通知类型对应的注解。而每一个注解里面,我们都需要指定这个切入点表达式,这些切入点表达式都是一摸一样的,此时代码当中就存在了大量的重复性代码,就是这个切入点表达式重复了。假如说此时切入点表达式需要变动,就需要将所有的切入点表达式一个一个来改动。在Java当中如果存在重复性的逻辑想复用可以通过抽取。@Pointcut():声明切入点表达式的注解。如果想在其他的切面类当中来引用访问修饰符需要改成。

2025-02-20 17:25:54 247

原创 AOP基础-核心概念

在这个代理对象当中就会对目标对象当中的原始方法进行功能的增强,增强的逻辑就是我们定义的通知。首先在方法运行开始之前,先记录方法运行的开始时间,然后接下来再来调用原始的方法执行,对于下面的实例图来说原始的方法就是list()方法,那接下来在代理对象当中,就会来执行原始的list()方法当中的逻辑。最终在程序运行的时候,在注入的时候就不再注入的是这个目标对象,而注入的是这个代理对象。最终在调用list()方法的时候,其实调用的就是代理对象当中的list()方法,而这个list()方法已经进行了功能的增强。

2025-02-19 03:41:11 228

原创 AOP基础-快速入门

如果我们是基于AOP面向方法进行编程,此时就可以在不改动这些原始方法的基础上,来针对原始的方法进行编程,这个编程可以是对原始方法功能的增强,也可以是改变原始方法的功能。我们就可以在这个方法开始运行之前,来记录这个方法开始运行的开始时间,然后在方法结束运行的时候, 再来记录这个方法运行的结束时间,中间就来运行原始的业务方法,这里的原始业务方法指的是需要统计执行耗时的业务方法。在里面通过一个表达式来指定当前这些共性的功能我应该加在哪些方法上。来指定当前这一部分共性的逻辑我要作用在哪些方法上,

2025-02-19 03:11:59 256

原创 MybatisPlus-扩展功能-代码生成器

MybatisPlus-扩展功能-代码生成器

2025-02-17 22:48:25 268

原创 MybatisPlus-核心功能-IService的批量新增

有大量的网络请求的减少所以它性能会有很大提升,但是由于你在这里预编译的过程中是把这里的1000条数据编译成了1000条SQL语句,所以MySQL在执行的时候就是逐条执行的,那么这里也就对性能还是有一定的影响。这个动作是由MySQL驱动去做的,我们引的MySQL的jar包它去做的不是mp去做。在这种模式下,我们有10万条数据,每一条数据都会分别去提交,每一次往数据库里去提交,其实就是一次网络请求,然后提交到MySQL,MySQL去执行,总共有10万条数据,就提交了10万次网络请求。

2025-02-17 21:39:29 245

原创 MybatisPlus-核心功能-IService的Lambda查询

有一定的并发安全的风险,也就是说如果同时有多个线程都来做查询,那么可能查到的用户是不是一样的,查到同一个用户,查到的余额也是一样的。两个人两个线程,同一个用户,两个线程各自来扣100得到的剩余余额是一样的。最终等于只扣了一个,有可能有这种并发安全问题。一上来就加锁,没有安全感。每次只能一个线程进入访问完毕后,再解锁。线程安全,性能较差!一开始不上锁,认为是没问题的,等要出现线程安全问题的时候才开始控制。拓展悲观锁和乐观锁原理。

2025-02-17 17:03:30 337

原创 MybatisPlus-核心功能-IService开发复杂业务

前面四个我们已经实现。1.我们要扣减余额,还要判断一下这个余额是否充足。如果余额不足,不能去做扣减。所以这里有很多业务判断在里面,必须要自定义一个方法,才能在这里面去写业务逻辑。不能直接调mp里面的方法,因为mp里面的方法是没有业务逻辑的。2.我们再去扣减余额的时候,就要去做update set balance等于balance减多少。这样的语句不建议在业务层去写,所以最后是通过自定义的SQL语句完成更新。实现步骤:1.查询用户2.校验用户状态3.校验余额是否充足4.扣减余额status为1代表正常,

2025-02-16 20:26:24 266

原创 MybatisPlus-核心功能-IService开发基础业务

Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动生成日志变量,简化java开发、提高效率。@Data 提供了更综合的生成代码功能(@Getter+@Setter+ToString+@EqualsAndHashCode)·描述模块的功能通常使用复数,也就是加s的格式来描述,表示此类资源,而非单个资源。·REST是风格,是约定方式,约定不是规定,可以打破。开发规范-统一的响应结果。

2025-02-16 18:09:17 358

原创 MybatisPlus-核心功能-IService接口基本用法

MybatisPlus-核心功能-IService接口基本用法

2025-02-15 23:47:39 98

原创 MybatisPlus-核心功能-自定义SQL

就是我们的SQL语句它的where条件之外的那些部分我们没有办法利用mp更方便的去实现,也就是不是常规的那种,而你只能是拼接,违背了企业开发规范,这种场景下就建议使用自定义SQL方式。现在业务层创建用Wrapper构建where条件,自定义一个mapper方法,把这个Wrapper传进去,最后在自定义方法当中把这个Wrapper用ew给标记出来,然后在自定义SQL语句当中书写SQL的前半部分,后面的where条件部分可以直接使用${ew.customSqlSegment}去生成。

2025-02-15 19:18:31 238

原创 MybatisPlus-核心功能-条件构造器

之前我们演示的所有字段名是写死的,这种写法属于硬编码,在开发规约当中不推荐这样写,LambdaQueryWrapper就是用来解决这个问题的。

2025-02-15 18:01:42 138

原创 MybatisPlus-快速入门-常用注解

2.主键是有一些特殊的地方的,主键id类型有一个特殊的处理AUTO_INCREMENT,叫做自增长。这个type就是类型或者讲id的策略。1.一定要有一个名为id的字段或者一定要用@TableId标记出来,如果没有那么MybatisPlus就找不到主键,也就无法根据主键做增删改查的操作,所以它一定会报错。约定大于配置,只要遵循了约定mp就可以通过反射得到实体类的信息,从而得知表信息,这样就能帮我们实现增删改查。符合约定不需要配置,如果实体类不符合约定,就必须自己去定义表名,主键名还有这些字段名。

2025-02-15 16:50:06 321

原创 MybatisPlus-入门案例

MybatisPlus快速入门

2025-02-15 15:57:36 73

原创 Java基础学习笔记-接口

接口是用来被类实现的(implement),实现接口的类称为实现类,实现类可以理解成所谓的子类。>接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但是接口不能继承类。4.一个类实现了多个接口,多个接口中存在同名的默认方法,不冲突,这个类重写该方法即可。3.一个类继承了父类,同时有实现了接口,父类中和接口中有同名方法,默认用父类的。5.一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。>实现接口的类必须实现接口中定义的所有抽象方法。

2025-02-10 18:51:41 353

原创 Java基础学习笔记-抽象类和抽象方法

当一个类被定义为抽象类时,它可以包含各种类型的成员,包括属性、方法等,其中方法有可以分为普通方法和抽象方法。继承抽象类的特征和注意事项:一个类如果继承了抽象类,那么这个类必须重写抽象类的全部抽象方法,否则这个类也必须定义成抽象类。·抽象方法只能定义在抽象类中。但是抽象类中可以包括抽象方法,也可以包含普通方法,还可以包含普通类包含的一切成员。如果继承的类是抽象类,不一定要实现抽象父类的所有抽象方法。如果继承的类是普通类,一定要实现抽象父类的所有抽象方法。抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。

2025-02-10 17:37:01 392

原创 Java基础学习笔记-枚举

枚举类都是继承了枚举类型:java.lang.Enumn。枚举的构造器都是私有的,枚举对外不能创建对象。枚举的作用:是为了左信息的标志和信息的分类。枚举类的第一行默认都是罗列枚举对象的名称的。第一行都是罗列枚举类实例的名称。枚举是Java中的一种特殊类型。枚举都是最终类,不可以被继承。修饰符 enum 枚举名称{枚举类相当于是多例模式。

2025-02-10 17:04:28 114

原创 Java基础学习笔记-多态

而在程序设计的术语中,它意味着一个特定类型的变量可以引用不同类型的对象,并且能自动地调用引用的对象的方法,也就是根据作用到的不同对象类型,响应不同的操作。>将一个指向子类对象的父类引用赋给一个子类的引用,即将父类类型转换为子类类型,称为向下转型,此时必须进行强制类型转换。定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。判断关键字左边的变量指向的对象的真实类型,是否是右边类型或者是其子类类型,是则返回true,反之。

2025-02-09 23:13:50 448

原创 Java基础学习笔记-包与权限修饰符

可以修饰成员变量,方法,构造器,内部类,不同权限修饰符修饰的成员能够被访问的范围将受到限制。导包 相同包下的类可以直接访问,不同包下的类必须导包,才可以使用!如果这个类中使用不同包下的相同的类名,此时默认只能导入一个类的包,另一个类要使用全名访问。·如果该成员只希望本类,同一个包下的其他类和子类访问,使用protected修饰。包是用来分门别类的管理不同类的,类似于文件夹,建包利于程序的管理和维护。·如果该成员只希望本类访问,使用private修饰。·权限修饰符:是用来控制一个成员能够被访问的范围。

2025-02-08 23:48:04 132

空空如也

空空如也

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

TA关注的人

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