报错原因:找不到settings.xml
解决方法:
本文转载自: 掘金
开发者博客 – 科技是第一生产力
这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
为什么要分页?
如果前端需要展示数据时,由于数据量庞大,一次性展示,这时页面将会出现一大片数据,而且还不一定加载完成,效率很差,此时分页查询就可以很好的解决这一问题,将庞大的数据按照一定数目显示出,还可以通过点击下一页或者上一页展示其它数据,效率更高!
下面来介绍下mybatis常用的几种分页查询!
首先看一下数据库里所有的数据,细节代码里有注解
客户端通过传递start(页码) ,pageSize(每页显示的条数) 两个参数去分页查询数据库表中的数据
sql使用的核心语句
1 | sql复制代码-- 语法:表示从startIndex下标开始,一页显示pageSize个 |
使用Mybatis实现分页,基于sql实现
1 | java复制代码 //分页查询 |
1 | xml复制代码<!-- 分页查询--> |
1 | java复制代码 //测试分页查询 |
查询结果:
基于RowBounds类对象实现,基于java代码
1 | java复制代码//RowBounds实现分页查询 |
1 | xml复制代码 <!-- RowBounds 分页查询--> |
1 | java复制代码 //RowBounds分页查询 |
结果:
感兴趣的可以了解下,放个该插件的官网链接,有官方使用文档,自行了解PageHelper分页插件
🤫今天是忙里偷闲的一天啊。
本文转载自: 掘金
「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
Java随笔记:Java随笔记
+ 上家公司用的是Yapi,我们后端开发时为了方便都是在PostMan中测试接口。然后写好之后在Yapi中添加进去,将地址发给前端,前端进行调试。
+ 现在这家是使用Swagger,写的时候稍微麻烦点,但是联调的时候太爽歪歪了,啥都不用管,前端自己玩去吧!哈哈哈~+ 1
2
3
4
5
6
7
8
9
10
11
12
xml复制代码<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
+ 1
2
3
4
5
6
7
8
9
kotlin复制代码package com.dayu.dyswagger.config;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration //配置类
@EnableSwagger2// 开启Swagger2的自动配置
public class SwaggerConfig {
}
+ 
+ basic-error-controller这个玩意,,这是因为SpringBoot项目本身有个error的返回。+ SwaggerTestController类+ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
kotlin复制代码/**
* @program: dyswagger
* @description: Swagger测试
* @author: DaYu
*/
@RestController
public class SwaggerTestController {
@RequestMapping(value = "test-swagger",method = RequestMethod.GET)
public String dyTest(){
return "大鱼,你好呀!";
}
}
+ 请叫我大水笔路漫漫其修远兮,吾必将上下求索~
如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah
本文转载自: 掘金
这是我参与11月更文挑战的第 8 天,活动详情查看:2021最后一次更文挑战
作为一线工程师的你,对于 git一定不会陌生,git 作为一个开源的分布式版本控制系统,有着广泛的用户基础。git 使用有很多可视化的工具,idea 自身也大多都集成了 git 套件,如下:
不过相比于这些可视化工具,我更喜欢使用命令行的方式。
本篇背景也是源于实际工作,一个同学遇到的问题是:他从 master 分支自己拉了一个开发分支,但是由于时间很长,所以在提交之前他执行了:
1 | bash复制代码git pull |
然后 push ,当提交 mr 时发现,自己的提交里有很多别人的 commit 记录。ok,这里背景交代清楚,我们通过一个实际的 case 来看看。
在执行 git pull 之前,先看下 git log
执行 git pull 之后
所以可以非常明显的看到,git pull 操作中有把 master merge 到当前 dev,实际上 git pull 是下面两个指令的整合:
1 | base复制代码git pull = git fetch + git merge |
那既然是 merge,所以 dev 中后续的提交,都会带上此次 merge 的 commit 记录;
这就是那位同学遇到的问题。如果我们不想让自己的提交中含有其他无关的 commit 怎么办?此时就需要 rebase 出场了。
两次提交记录;这里基于前面提到的 git pull 行为,如果我们期望 rebase-dev 的提交不包括 rebase-dev2 的提交,但是从 log 看, rebase-dev 已经在最新 commit 后面了
git rebase 本质上是需要给 rebase-dev 变基,就是将基线拉到最新 commit 之前,在 rebase-dev 分支下,执行 git rebase master,此时再观察下 log
可以看到 rebase-dev 已经跑到上面了,下面在 rebase-dev 做修改提交
可以看下,此时提交就没有 rebase-dev2 的 commit 记录了。
所以你学废了吗?
本文转载自: 掘金
「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
在Linux环境中使用POSIX Thread API可以很方便的写出多线程程序,本系列将对其API进行介绍, 本文为系列的第一篇文章, 主要介绍线程的基础操作。
在Linux中同一进程中的不同线程:
共享:
拥有自己的:
errno 错误码 (使用thread-local实现)以下API均定义在头文件pthread.h中, 使用GCC编译时需要链接到pthread库上, 如下所示
1 | shell复制代码gcc ./test.c -l pthread |
pthread_create用于创建线程, 如果线程创建成功该函数返回0, 创建失败返回错误码,创建失败的原因可能是:
EAGAIN 系统资源不足或者进程中的线程数量达到限制, 我们可以通过cat /proc/sys/kernel/threads-max查看当前系统对于线程数量的限制EINVAL attr参数中有非法的设置EPERM attr参数中有不被允许的设置该函数定义了以下参数:
thread 指向线程id的指针, 创建线程成功后会通过该指针将线程id保存到其中attr 用于设置线程相关的参数, 如果想使用默认参数传NULL即可。如: 设置线程的栈大小以及栈的地址(此场景常见于嵌入式设备需要限制线程栈空间大小的场景)start_routine 线程要执行的函数, 该函数的出入参均为一个无类型指针void*arg 传给函数的参数1 | c复制代码#include <pthread.h> |
pthread_self 用于获取当前线程的id.
1 | c复制代码 pthread_t pthread_self(void); |
调用pthread_join会等待目标线程执行完成之后才退出, 并获取线程的执行结果, 下文中我们将会给出Demo, 返回是否执行成功.
1 | c复制代码int pthread_join(pthread_t thread, void **retval); |
终止当前线程的运行(调用此方法的线程), 并设置线程的返回值, 如果有其他线程正在阻塞等待(调用pthread_join)此线程返回它将接收到这一返回值。
1 | c复制代码void pthread_exit(void *retval); |
pthread_detached用于分离一个线程, 调用此方法的线程在终止后资源会被回收掉,并且不可等待(即其他线程不可调用pthread_join等待此线程)
1 | c复制代码int pthread_detach(pthread_t thread); |
以下Demo展示了如何创建一个线程, 并传入参数以及取得该线程的返回值并进行打印。
1 | c复制代码#include <stdio.h> |
输出如下所示:
上文中提到在创建线程时,我们可以通过pthread_attr_t结构体设置一些参数来改变线程的一些行为。 在一些特殊场景下这个功能是非常实用的, 比如:
pthread_attr_t来调小线程栈的大小以节约内存操作系统的默认线程栈大小我们可以通过ulimit -s进行查看, 效果如下
如一下Demo所示, 我们通过pthread_attr_init来初始化pthread_attr_t结构体, 之后调用pthread_attr_set_stacksize来设置线程栈的大小。
注意设置线程栈大小的时候, 如果设置的栈大小小于PTHREAD_STACK_MIN时会返回非法参数的错误, 对于部分系统如果栈大小不是系统的页大小的倍数,也会引发错误。
如以下Demo所示, 我们使用THREAD_STACK_SIZE来表示分配给线程的栈空间大小, ALLOC_SIZE来表示线程的要执行的方法会申请的栈空间大小.
1 | c复制代码#include <stdlib.h> |
测试用例1, THREAD_STACK_SIZE = ALLOC_SIZE = 4096 * 6, 输出如下所示:
系统提示Segmentation fault, 原因是栈空间不足.
测试用例2, THREAD_STACK_SIZE = 4096 * 6, ALLOC_SIZE = 4096 * 4, 输出如下所示:
测试用例3 THREAD_STACK_SIZE = 4096 * 1, ALLOC_SIZE = 1024 输出如下所示
提示参数错误, 原因时分配给线程的栈空间小于PTHREAD_STACK_MIN
本文转载自: 掘金
这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
下面两个程序运行结果是?
1 | go复制代码func main() { |
1 | go复制代码func main() { |
1 | go复制代码func test(i int) { |
i = 1, j = 2
j = 1, k = 1
i = 0, j = 0
形参已经声明了变量i,使用 := 再次声明是不允许的。
使用 := 一次可以声明多个变量,例如:
1 | go复制代码i, j := 0, 0 |
:= 左侧存在新的变量时(如 k),那么已经声明的变量(如 j)会被重新声明。这并没有引入新的变量,只是把变量的值改变了。:= 左侧没有新变量编译报错。:= 这种简短变量声明只能用于函数中,用来初始化全局变量是不行的。:= 会拆分成两个语句,即声明和赋值。赋值语句不能出现在函数外部的。例如:
1 | go复制代码func sum(a int, vals...int) int { |
1 | go复制代码fmt.Println(sum(1)) // "1" |
1 | go复制代码fmt.Println(sum(1, 2, 3, 4, 5)) // "15" |
参数部分需要使用 slice… 来表示切片,例如
1 | go复制代码values := []int{1, 2, 3, 4, 5} |
本文转载自: 掘金
这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
@[TOC]
闲话少说,先上思维导图。
如图所示,现在还是初识C语言的第一部分,本次只介绍了C语言本身特点,数据类型,常量变量,字符串转义字符注释,选择循环语句,函数,数组。
接下来请和我一起粗略地探讨其中内涵所在。 这是C语言的定义:
C语言是一门通用计算机编程语言,广泛应用于底层开发。 C语言提供了许多低级处理的功能,仍然保持良好跨平台特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译。
为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
但总结其特点就是1.底层开发,2.国际标准 ANSI C,3.面向过程 1 | arduino复制代码#include <stdio.h> |
C语言主要有六种数据类型,分别为这六种分别有自己的字符长度即其所建变量所占的空间,char最小只要1个字节,short占2个,int占4个,long一般是4个,也有可能是8个,反正只要满足long的字节长度大于等于int就可以了。两个浮点型的最为特殊,分别是4和8,显然双精度的精度更高。1 | c复制代码int main() |
)
显而易见的是,分为两类变量和常量讲述。
变量又分两类,一是局部变量,二是全局变量。
顾名思义,局部变量是定义在一对大括号内的,显然我们平时在main函数里创建的都是局部变量,全局变量则为定义在大括号外面的变量。
当二者同名时,局部变量优先,当然,这种代码谁写谁sb。在程序中使用scanf函数,若程序为 scanf(“%d%d”);
%d%d之间不管有没有空格,输入变量时都要用空格隔开,若二者之间有逗号则逗号隔开。
对这二者讨论他们的作用域和生命周期的话,+ 作用域为整个工程文件,若想在其他.c文件中使用则需要extern声明一下。
+ 生命周期则是整个工程的生命周期,也就是main函数的生命周期。+ 作用域为其定义的大括号{ }内,进作用域生命开始,出则结束。1 | c复制代码//验证局部变量的作用域 |
常量呢,大致分为四种,1 | c复制代码//const修饰的变量 |
1 | c复制代码#define PAI 314 |
1 | c复制代码//枚举常量 SEX性别举例 |
单引号引起来的,如'w','r'是字符,被双引号引起来的"yyx","abcdef"是字符串。
字符串一般以'\0'结尾隐含在字符串的末尾。既然'\0'为字符串结束标志,在计算字符串长度时当然不算作字符串内容。1 | c复制代码//字符,字符串 |
1 | c复制代码#include <stdio.h> |
C++的风格 //xxxxx
这种只能注释一行。
C语言的风格 /xxxxx/
不可嵌套注释。
)
选择语句,实现分支,有if..else..语句和switch语句。循环语句,有while循环,do…while循环和for循环。
1 | ini复制代码具体情况为 |
1 | c复制代码int main() |
函数主要是,传参类型和返回值类型还有名称要对应。如:
1 | c复制代码int ADD(int num1, int num2) |
定义:一组相同类型的元素组成的集合。
数组的使用是根据下标来的,从0开始数。
1 | c复制代码int main() |
)
本文转载自: 掘金
这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
本系列代码地址:github.com/JoJoTec/spr…
微服务系统中,会遇到在线发布,一般的发布更新策略是:启动一个新的,启动成功之后,关闭一个旧的,直到所有的旧的都被关闭。Spring Boot 具有优雅关闭的功能,可以保证请求处理完再关闭,同时会拒绝新的请求。对于这些拒绝的请求,为了保证用户体验不受影响,是需要重试的。
云上部署的微服务,对于同一个服务,同一个请求,很可能不会所有实例都同时异常,例如:
这时候,就需要我们对请求进行无感知的重试。
FeignClient 本身带重试,但是重试策略相对比较简单,同时我们还想使用断路器以及限流器还有线程隔离,resilience4j 就包含这些组件。
Resilience4J 提供了 Retryer 重试器,官方文档地址:resilience4j.readme.io/docs/retry
从配置上就能理解其中的原理,但是官方文档配置并不全面,如果想看所有的配置,最好还是通过源码:
RetryConfigurationProperties.java
1 | less复制代码//重试间隔,默认 500ms |
引入 resilience4j-spring-boot2 的依赖,就可以通过 Properties 配置的方式去配置 Retryer 等所有 resilience4j 组件,例如:
application.yml
1 | yaml复制代码resilience4j.retry: |
这样,我们就可以通过如下代码,获取到配置对应的 Retryer:
1 | ini复制代码@Autowired |
引入 resilience4j-spring-cloud2 的依赖,就相当于引入了 resilience4j-spring-boot2 的依赖。并在其基础上,针对 spring-cloud-config 的动态刷新 RefreshScope 机制,增加了兼容。
1 | xml复制代码<dependency> |
官方提供了粘合 OpenFeign 的依赖库,即 resilience4j-feign
1 | xml复制代码<dependency> |
接下来,我们使用这个依赖,给 OpenFeign 添加重试,首先启用 OpenFeign Client 并指定默认配置:
1 | python复制代码@EnableFeignClients(value = "com.github.jojotech", defaultConfiguration = DefaultOpenFeignConfiguration.class) |
在这个默认配置中,通过覆盖默认的 Feign.Builder 的方式粘合 resilience4j 添加重试:
1 | ini复制代码@Bean |
微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer
本文转载自: 掘金
在使用e签宝签署合同的时候,会经常遇到,注册电子账户的时候,个人身份证、姓名、企业名称、法人、法人身份证、统一信用码输入错误,导致签署合同出现不必要的错误,那这个时候,就需要大家修改电子账户的信息,接下来我用代码给大家讲解一下
1 | ini复制代码 UpdatePersonAccountByAccountId |
1 | ini复制代码UpdateOrganizationsByOrgId organizationsByOrgId = |
企业如果修改统一信用码,必须先注销掉电子账户重新注册,是无法修改的
如何注销呢
1 | ini复制代码DeleteOrganizationsByOrgId r= Account.deleteOrganizationsByOrgId("xxxxx");//企业电子账户id |
接下来在重新注册就可以了,关于注册大家看上一篇文章就可以看到了
本文转载自: 掘金
一起用代码吸猫!本文正在参与【喵星人征文活动】
近期云吸猫活动火热,猫咪太可爱了,趁着工作间隙,做一份2022年猫咪主题的日历给自己吧。
话不多说,我们来开始动手做吧!
我们在网页上,关键字搜索”猫咪”,可以搜索出上万张猫咪的图片
选择自己喜欢的图片,下载到文件中,且为每一张图片命名为从1~12的数字
本次,我们需要下载第三方依赖库-openpyxl完成写入编辑excel表格操作
openpyxl 是用于对Excel文件进行读取写入操作的库
1 | python复制代码pip install openpyxl |
根据日历的需求:要生成日历,并且写入到Excel表格,所以我们需要导入一下库
1 | python复制代码import openpyxl |
根据日历的需求分析,做法如下
1 | Python复制代码wb = openpyxl.Workbook() |
1 | python复制代码sheet = wb.create_sheet(index=0,title=sheet_name[i]) |
1 | python复制代码print(calendar.monthcalendar(2022,1)) |
1 | Python复制代码for j in range(len(calendar.monthcalendar(year,i))): |
1 | Python复制代码f value == 0: |
+ 由于设置日历firstday设置成周天为一周的第一天
+ 传入的日历标题为 ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]
+ 字体设置成微软雅黑,大小为11
+ 单元格居中:Alignment(horizontal="right",vertical="center")1 | Python复制代码for R1 in range(1,100): |
1 | * 最后我们设置一下日历的表格格式 |
python复制代码for k4 in range(8,15):
sheet.row_dimensions[k4].height = 30
sheet.cell(row=3,column=1).value = year+"年"
sheet.cell(row=4,column=1).value = sheet_name[i]
sheet.cell(row=3, column=1).font = Font(u"微软雅黑", size=16,bold=True,color="FF7887")
sheet.cell(row=4, column=1).font = Font(u"微软雅黑", size=16, bold=True, color="FF7887")
sheet.cell(row=3, column=1).alignment = align
sheet.cell(row=4, column=1).alignment = align1 | * 保存生成好的日历文件 |
python复制代码wb.save(filename)
1 |
|
python复制代码
def add_image(filepath):
wb = load_workbook(filepath)
sheet_names = wb.get_sheet_names()
for i in range(0,len(sheet_names)):
wb = load_workbook(filepath)
ws = wb[sheet_names[i]]
ws.merge_cells('I1:P20')
img = Image(f'file/{i}.jpg')
ws.add_image(img,'I1')
wb.save(filepath)
最后来看一下效果吧
=========

总结
==
本期,使用Python简单制作一个猫咪主题的日历,大家可以动手做一个个性化的日历吧~
以上是本期内容,欢迎大佬们点赞评论,下期见~
**本文转载自:** [掘金](https://juejin.cn/post/7028544246575529992)
*[开发者博客 – 和开发相关的 这里全都有](https://dev.newban.cn/)*