springboot+Maven
https://spring.io/projects/spring-boot->projects->Spring Initializr
mybatis-plus
- 添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
- 新建pojo包 用于实例化数据
- 新建Mapper包,用于拓展BasePapper接口
查询
list<user> list =usermapper.selectList(null); 全部查询
usermapper.selectById 根据id查询
usermapper.selectBatchIds(); 根据括号中id批量查询
usermapper.selectByMap(); 根据括号中条件精准查询
增加
- 如果不给id赋值,默认生产一个随机的id(雪花算法)
- 创建一个user对象:user x =new user();
- x.setXXXX(参数);
- usermapper.insert(x);
删除
usermapper.deleteById(); 根据id进行删除
usermapper.deleteByMap(); 根据Map中数值进行对比删除
usermapper.deleteBatchIds();根据括号中的id批量删除
修改
usermapper.updateByid 根据id进行修改
查询分页插件
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
Page page = new Page<>(1,3); //当前页对象,每页3个
mpMapper.selectPage(page, null);
Swagger
@Postmapper
配置文件中要加:
spring.mvc.pathmatch.matching-strategy=ant-path-matcher
启动网址:http://localhost:端口号/swagger-ui.html
Springboot集成Redis
要先启动才有数据,不能运行了程序再启动
安装
打开一个 cmd 窗口 使用 cd 命令切换目录到 C:\redis 运行:
redis-server.exe redis.windows.conf
这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。
切换到 redis 目录下运行
redis-cli.exe -h 127.0.0.1 -p 6379
- String(字符串) set
- Hash(哈希) hset
- List(列表) lpush
- Set(集合) sadd
- zset(sorted set:有序集合) zadd
- stream 主要用于消息队列
Redis HyperLogLog
PFADD PFCOUNT 计算基数(不同元素个数)
- 开启本地 Redis 服务,开启两个 redis-cli 客户端。
- 在第一个 redis-cli 客户端输入 SUBSCRIBE runoobChat,意思是订阅
runoobChat
频道。 - 在第二个 redis-cli 客户端输入 PUBLISH runoobChat “Redis PUBLISH test” 往 runoobChat 频道发送消息,这个时候在第一个 redis-cli 客户端就会看到由第二个 redis-cli 客户端发送的测试消息。
Redis 事务
MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC
- 打包执行,非原子性事务
- 如果在 某 处失败,不会回滚,继续执行。
springboot中使用的对象不能存入Redis中。redis只支持5大类型,不包括对象。
==>序列化
- 通过序列化将对象转换成json字符串导入redis
- 导入rdis后将json还原成指定对象类型
将json字符串还原成user类型需要用到JSONObject.fromObject(jsonStr);
报错==>导入json工具包,不能用系统自带的,系统自带的没有JSONObject.fromObject
RabbitMQ
- Direct Exchange id对应**
- Fanout Exchange 提前绑定的信道
- Topic Exchange 模糊匹配
@Controller f返回到网页
@RestController 返回json字符串
无法访问http://127.0.0.1:15672
1、打开rabbitmq命令行窗口
2、rabbitmq-service remove(输入正确后按回车)
3、rabbitmq-service install(输入正确后按回车)
4、rabbitmq-service start(输入正确后按回车)
5、rabbitmq-plugins enable rabbitmq_management(输入正确后按回车)
6、rabbitmq-service stop(输入正确后按回车)
7、rabbitmq-service start(输入正确后按回车)
交换机类型:
广播(扇形):无差别发送信息
路由(直连):精准匹配
通配符(主题):RoutingKey包含对应的指定的内容就可以接收到
首部(键值对):精准匹配,优势在于类型不限(Object)
http
-
B/S模式
-
只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。
-
无状态 没有记忆 中断传输需重新
-
无连接 完成即断开
-
h t t p : / / h o s t [ " : " p o r t ] [ a b s p a t h ] http://host[":"port][abs_path] http://host[":"port][abspath]
-
GET一般用于获取/查询资源信息,而POST一般用于更新资源信息
eureka
SpringCloud中的一个组件,通过依赖导入
<!--eureka服务端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
版本冲突
Cannot resolve org.springframework.cloud:spring-cloud-starter-netflix-eureka-server:unknown
springboot2.7版本没有springcloud自动适配降级为2.6 适配eureka 不然会编译异常cloud版本与springboot版本是一一对应,不能太高或者太低- ~~官方对应文档https://spring.io/projects/spring-cloud#learn~~
官网生成的springboot.WAR包选择的Eureka依赖会出错
要用IDEA新建SpringBoot项目,用IDEA自带的依赖选择功能导入(社区版没有这个功能)
通过eureka调用的话Controller中地址与Eurka中的名称要一致
Aop
AOP切面模式:**将相同的代码集成在一个模块中,通过切面模式插入对应的位置,降低代码的工作量。
编写Aop切面代码时,报错rdeisUTtil工具类
加入AOP切面代码后,rdeisUTtil工具类无法被扫描
- 将@Pointcut依赖具体到某一个文件而不是一整个文件夹
- 将Redis工具类移到其他目录下
SpringBoot 整合 apollo
先下载压缩包(旧版本需要三个压缩包,现在官网提供整合包)
这里的sql目录文件里面放入了两个sql执行语句的sql文件,我们可以去本地数据库新建两个数据库取名为: ApolloPortalDB和ApolloConfigDB
在mysql中导入两个系统数据库
电脑必须安装git,然后git去启动apollo ( apollo目录下 ./demo.sh start )(不启动访问不到http://localhost:8070 )
访问http://localhost:8070 通过界面使用Apollo配置中心,输入用户名apollo密码admin登录。
Mvc三层结构
dao层、service层和controller层
dao层主要与数据库交互
server层进行逻辑结构的设计
controller层对请求的控制 决定该调用哪种sever业务处理 必要时候对请求进行处理
在mybatis-plus中,server和dao之间的界限变得模糊,产生了一个mapper层(dao层),controller通过一个继承BaseMapper接口的mapper对象,就可以直接调用数据库的增删改查相关操作。
实名制系统
许多个maven与springboot项目组成
枚举类
enum
lam表达式
没有函数名的函数 最显著的特征为 ->
Lambda表达式只支持函数式接口 也就是只有一个抽象方法的接口
pojo
分别为do vo po dto
VO (View Object)视图对象
用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO(Data Transfer Object)数据传输对象
主要用于展示层与服务层之间的数据传输对象
DO(Domain Object)对象
一个业务的实体
PO(Persistent Object):持久化对象
数据表中的每个字段就对应PO的一个属性,一个po就是一条数据库内容。
@Autowierd 和@bean
都是写的是接口 默认是实现类
但是有2个实现类的时候
要指定注入哪个类
getBean获取的其实是这个实现类
@Autowierd 是将注解部分进行自动装配,@bean是将注解的部分放进容器中,当使用时通过getbean获得
java反射机制
对一个类来说,有三种获取对象的方式:
public class X(){
F f=new F(); }
Class c1=F.class();
Class c2=f.getclass();
entityToVO
使用 mybatis-plus 操作后获得的数据类型为 Entity,但是前端界面往往需要展示一些其他的字段数据,此时就需要 将 Entity 转化为 Vo。
entity: 对应数据库表模型
vo: 对应需要返回到前端的数据模型
dto: 对应后台内部调用的数据模型
RespEntity
是一个泛型类
这是一个设计的封装对象 来保证每个人使用这个对象返回给前端的值都是一种特定的格式
不然每个人可能有自己的返回习惯 可能是封装对象,可能是直接返回
异步多线程
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
线程需要执行的内容 }
});
// 开启 thread1
thread1.start();
springboot可以通过@EnableAysc 和@Aysc注解进行异步
querywrapper
基于mybatis=plus 一个方法,其中存放的并不是查询后的结果,而是sql语句的封装。
Couldn’t find type java.sql.Date. Are you missing a dependency on your classpath?
idea运行项目代码报错
Settings -> Build, Execution, Deployment -> Build Tools -> Maven/Gradle -> Runner -> tic on “Delegate IDE build/run actions”
Exception in thread “main” java.lang.AssertionError
idea运行报错
这个问题确实是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行产生的错误。
解决措施就是保证jvm(java命令)和jdk(javac命令)版本一致。如果是windows版本,则在命令行中分别输入java -version和javac -version命令来查看版本是否一致。
CreateProcess error=206, 文件名或扩展名太长
Windows命令行支持的字符串长度有限制。
1.修改Maven默认仓库路径。
-
Android Studio -> Run -> Edit Configurations -> Templates -> Application
-> shorten command line: 选择 JAR manifest -java -cp classpath.jar classname [args]
Java项目启动报错:Process exited with an error: 1 (Exit value: 1)
端口占用问题,但是我看idea中没有说这个问题
在windows上,通过dos命令,即输入cmd回车,然后输入:netstat -ano | findstr 7400
taskkill /pid xxx /f 或者 taskkill -f /pid XXXX
SQL IsDeleted(@TableLogic)
逻辑删除与物理删除
物理删除就是在数据库中删除这条记录
逻辑删除是在程序中看不到这条数据,但是在数据库中还是真实存在的。(isdeleted=1)
@RequestParam使用
加与不加的区别
(1)不加@RequestParam前端的参数名需要和后端控制器的变量名保持一致才能生效
(2)不加@RequestParam参数为非必传,加@RequestParam写法参数为必传。但@RequestParam可以通过@RequestParam(required = false)设置为非必传。
(3)@RequestParam可以通过@RequestParam(“userId”)或者@RequestParam(value = “userId”)指定传入的参数名。
(4)@RequestParam可以通过@RequestParam(defaultValue = “0”)指定参数默认值
(5)如果接口除了前端调用还有后端RPC调用,则不能省略@RequestParam,否则RPC会找不到参数报错
(6)访问时:
不加@RequestParam注解:url可带参数也可不带参数,输入 localhost:8080/list1 以及 localhost:8080/list1?userId=xxx 方法都能执行
加@RequestParam注解:url必须带有参数。也就是说你直接输入localhost:8080/list2 会报错,不会执行方法。只能输入localhost:8080/list2?userId=xxx 才能执行相应的方法
7.17
contains函数
用于数值比较,进行数值比较,如果两值不相等,则返回FALSE ,相同则是true。
filter
java8后引入的一个过滤函数,在filter里判断为真的才能留着集合中,起到过滤作用
需要先将过滤的数组集合通过stream()转换为流数据,进行处理后,通过.collect(collectors.toList( ))返回原先的数据类型
filter
filter()方法返回一个盘子流,collect()方法将这个流转换成一个列表。“收集”操作称为终端操作
body和query传参的区别
get方法只能用query传参,post可以用body+query
query是想数据拼接在地址上,body是将数据放在data中
@RequestBody和@RequestParam区别
类似于
body和query传参的区别
@RequestBody只能用在post方法中,get方法无法使用
@RequestParam适用于get/post方法中,适用于简单的数据
List list=null与List list=new ArrayList<>()的区别
直接将null赋值给链表,后续进行lits.add操作时,需要null不为空才能add方法
通过多态new ArrayList创造的链表虽然内容也为空,但是可以进行add操作
对于传参方式@RequestBody
在一个接口参数中,只能出现一次@RequestBody
如果有两个参数,都通过post方法传输,内容放在body中,则需要通过封装一个类来传参数
7.24
Java中Stream方法
java8.0后引入了list.stream().方法,将链表可以转换为流进行更多的操作
最常见的为filter(过滤器) ,distinct(去重),count(计数)
mybaits-plus构造器
构造器可以通过拼接条件完成数据库增删改查操作
误区:如设备id属性为Long,用构造器查询工资卡中设备字段,得到的是WokCard类型的结果,而不是Long
IDEA无法使用VUE
没有Vuejs插件,社区版换成专业版
MVN install不是内部指令
MVN的地址有错误,在环境变量中
Fatal error compiling: 无效的目标 发行版: 1.8 -> [Help 1]
电脑中有多个sdk版本,而环境变量中与idea使用的不是同一个版本
7.31
Vue
生命周期 钩子函数mounted
v-if 和v-show的区别 v-show只是隐藏了数据,数据会泄露,但是性能消耗低 v-if是删除数据,性能消耗大,但是安全
“”和’'的区别 使用过一次“”之后,在“”里面要用‘’不然会报错
自定义组件
1.定义组件
2.声明组件
3.使用组件
.Vue文件 浏览器中不支持import, 放在浏览器中无法运行,要通过脚手架
[Vue warn]: Cannot find element: #App
在index。html中 的body中 没有找到对应的app组件(外部引入注意A还是a)
v-bind和v-model
v-bind为单向数据流,修改的值不会影响原先数据,v-model为双向绑定,修改可以影响数据
8.7
脚手架中默认使用ems.vue (阉割版),必须使用render进行渲染 或者引入完整版vue
@keyup和@keydown
js语言中,监控键盘属性为@onkeyup和@onkeydown,vue和js语句有不同之处
scoped
通过scoped属性可以限定css样式的作用域 防止重名
props
自定义组件 分为单文件组件和非单文件组件
vue采用单文件组件,文件结尾为 .uve
组件分为三部分模板,
组件完成后需要通过export进行暴露,在上一级使用的组件中进行import,用components声明后就可以进行调用
Router
ipmort引入vue-router包(Vue2注意版本)
Vue.use(Router)
new 一个Router对象,在routes中写每个path和name以及对应的组件
在App.vue界面中 来指定连接跳转到哪一个页面
8.14
对于数组的分页查询
运用字符流的方式 .stream().skip((current-1)*size).limit(size). collect(Collectors.toList());
fegin
先定义一个接口,在接口@FeignClient(value = xxxx)里写上被调用端的服务名称 @GetMapping里写调用的接口的地址
最后在controller里通过@autowired 接口 调用接口方法实现
fegin默认禁用get 自动用post
根据业务需要根据 List 元素的某个字段进行大小排序,用 List 的流里的sort 方法:
List newList = voList.stream().
sorted(Comparator.comparing(ReiFmsProjectVO::getPercent, Comparator.reverseOrder())).
collect(Collectors.toList());
高亮部分需要替换,voList是排序前的List,newList是经过排序之后的List,getPercent替换成要根据什么值排序的字段
mybatis默认 分隔符自动转化为驼峰写法
@Select
在注解中使用#{}的方式进行条件注入,遇到Like等 条件 ,需要进行语句拼装需要用到CONCAT 关键字
Mapper.xml映射
构造器需要用到 @Param(Constants.WRAPPER) 注解进行标记 在xml中通过 ${ew.customSqlSegment} 注入查询条件