public static LoginUser getLoginUser()
:该行声明了一个公共的静态方法getLoginUser()
,它的返回类型是LoginUser
。try
:开始一个 try 块,用于处理接下来的代码中可能发生的异常。return (LoginUser) getAuthentication().getPrincipal();
:该行从getAuthentication()
方法中获取当前已认证用户的主体对象,并将其转换为LoginUser
类型。getPrincipal()
方法通常在成功认证后返回与当前用户关联的主体对象。catch (Exception e)
:捕获 try 块中发生的任何异常,并将其赋值给变量e
。这样可以在 catch 块中处理异常。throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED);
:如果 try 块中发生异常,该行将抛出一个ServiceException
异常,带有描述性的错误信息 "获取用户信息异常",以及 HTTP 状态码UNAUTHORIZED
。
数据分片,包括分表和分库,日常我们一般使用springboot项目
springboot
mybatis-plus
dynamic-datasource(动态数据源、mybatis-plus拓展)
druid 连接池
# 多数据源配置 可参考 https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter
spring:
datasource:
dynamic:
primary: master # 设置默认的数据源或者数据源组,默认值即为master
strict: false # 严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/demo?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否进行SSL连接 解决则加上 &useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
# db-test:
# url: jdbc:mysql://127.0.0.1:3306/demo?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否进行SSL连接 解决则加上 &useSSL=false
# username: root
# password: root
# driver-class-name: com.mysql.jdbc.Driver
使用Docker部署elasticsearch docker下一键启动es,可根据需要的版本号对语句做修改
sudo docker run -it --rm --name elasticsearch -d -p 9200:9200 -p 9300:9300 elasticsearch:2.3.5
注意到该命令:
–rm参数:容器终止后销毁 -d:后台进程 -p 9200:9200 -p 9300:9300:开放了9200端口和9300端口
java -jar xxx.jar --spring.profiles.active = dev
java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
简介
Redis时一个开源的非关系数据库,支持持久化存储。
安装
Mac os x下安装Redis很简单通过Brew安装即可。
如果没有安装 Brew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
首先,获取最新软件安装包
brew update
安装Redis
brew install redis
redis-server
//Redis 默认端口是6379,你也可以换个端口号启动,
redis-server --port 6380
//使用了肯定需要停止,停止怎么弄呢?
//停止
//执行命令
redis-cli shutdown
在IDEA中,你可以使用"Redo"(重做)操作来执行Command+Z(或Ctrl+Z)的反功能。"Redo"操作用于撤销之前的撤销操作,从而恢复先前的更改。
你可以通过以下几种方式执行"Redo"操作:
使用快捷键:默认情况下,"Redo"操作的快捷键是"Ctrl + Shift + Z"(Windows/Linux)或"Cmd + Shift + Z"(Mac)。按下对应的快捷键,即可执行"Redo"操作。
使用菜单选项:在IDEA的菜单栏中,选择"Edit"(编辑)菜单,然后选择"Redo"选项,即可执行"Redo"操作。
使用工具栏按钮:在IDEA的工具栏中,有一个"Redo"按钮(通常显示为一个向前的箭头),点击该按钮即可执行"Redo"操作。
请注意,"Redo"操作仅在先前执行了"Undo"(撤销)操作之后才可用。如果你尚未进行过任何撤销操作,或者你已经执行了其他操作而无法进行"Redo",则"Redo"选项可能会被禁用或不可用。
PO持久化对象:数据库记录entity,一一与数据库记录对应。
BO业务对象:前端业务请求、应用内部业务逻辑对象,以及所有非PO场景。
VO值对象:返回前端结果
DTO数据传输对象: 对外API的返回对象,或者系统间(非应用间)传输
Domain(领域模型): 领域模型是指在软件开发中对真实世界的概念和业务规则的建模。在领域驱动设计(Domain-Driven Design)中,领域模型被认为是软件系统的核心,它负责表示业务实体、业务逻辑和业务规则。在Spring Boot应用程序中,领域模型通常是用来表示业务实体的Java类,例如用户、订单、产品等。
VO(Value Object,值对象): 值对象是指那些没有唯一标识符,且仅根据它们的属性值来进行比较的对象。在Java开发中,VO通常用于封装一组相关属性,用于传递数据或表示某个特定领域的值。VO对象通常是不可变的(immutable),这意味着它们的属性一旦被设置就不能再改变。在Spring Boot应用程序中,VO通常用于表示一些与业务逻辑相关的值,如DTO(Data Transfer Object)或响应对象等。
PathSimplifier是一个轨迹展示组件,相比 AMap.Polyline (折线),PathSimplifier更加针对节点数量巨大、排布密集的路径,比如按秒记录位置的车辆行进轨迹,精细的地理边界等等。主要的功能特性包括:
对需要绘制的轨迹节点,在保留视觉效果的前提下,做一定的简化处理(利用Simplify.js 。举例来说,比如A点和B点,两者距离不到1像素,则可以去掉B点,只留A点;再比如A,B,C三点在一条直线上,或者,B点仅仅稍微偏离A点和C点构成的线段,那么B点就可以去掉),从而减少轨迹绘制时涉及的节点数量,提升绘制性能。
支持快速识别轨迹上的节点。比如鼠标在轨迹上滑动时,可以显示鼠标位置对应的节点信息。
内置轨迹巡航器,支持轨迹回放,标识经过路径,以及获取经过距离等等。
支持丰富的样式配置,覆盖轨迹线、轨迹方向、轨迹节点,以及巡航器等。
Cause: java.sql.SQLException: Column count doesn't match value count at row 1\n; bad SQL grammar []; nested exception is java.sql.SQLException: Column count doesn't match value count at row 1"
该错误提示表明在进行数据库插入操作时,插入的数据列数与表的列数不匹配,导致出现了异常。具体原因是插入的数据列数与表定义的列数不一致,数据库要求插入的值的数量必须与表中列的数量相匹配。
通常情况下,这个错误可能由以下几个原因导致:
插入的值数量不匹配:您可能在插入数据库时提供了不正确数量的值。比如,插入语句中的列数与提供的值的数量不一致。
数据类型不匹配:有时候插入的数据类型与表的定义不一致,也会导致这个错误。比如,插入了一个字符串值到一个整数类型的列。
表结构变更:如果在数据库表结构发生了变化,例如添加或删除了某些列,而代码中的插入操作没有相应地更新,也可能导致这个错误。
要解决这个问题,您可以采取以下步骤:
检查插入语句:确保插入语句中的列与提供的值的数量相匹配,且列的顺序正确。确保数据类型与表定义的列类型相匹配。
检查表结构:如果表结构有变更,确保代码中的插入操作也相应地更新。如果有新的列,确保插入语句中包含新列,并提供对应的值。如果有删除的列,确保插入语句不包含这些列。
使用参数化查询:推荐使用参数化查询来执行数据库插入操作,而不是直接拼接SQL语句。这样可以避免SQL注入问题,并且更容易管理参数和值的匹配。
String sql = "INSERT INTO your_table (column1, column2) VALUES (?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, value1);
pstmt.setInt(2, value2);
pstmt.executeUpdate();
由于字段'introduce_id'没有默认值,而且没有在插入语句中显式提供值,导致出现了异常。具体原因是数据库表中的'introduce_id'字段被定义为不允许为空,并且没有设置默认值,因此在插入数据时必须为该字段提供一个值。
出现这个错误的原因可能是以下几种情况:
缺少'introduce_id'字段的值:在插入数据时,未为'introduce_id'字段提供值,或者提供了一个空值(null),导致数据库无法生成该字段的值。
数据库表定义不正确:可能在数据库表的定义中,'introduce_id'字段没有设置为自增字段(auto-increment),导致在插入数据时必须手动为该字段提供一个值。
MyBatis配置问题:在MyBatis映射文件中,可能没有正确地映射'introduce_id'字段,导致MyBatis无法自动为其生成值。
要解决这个问题,您可以采取以下步骤:
检查插入语句:确保插入语句中为'introduce_id'字段提供了一个有效的值。如果该字段是自增字段,可以将其从插入语句中去掉,让数据库自动生成值。
检查数据库表定义:如果'introduce_id'字段应该是自增字段,确保数据库表的定义中已经将其设置为自增字段。如果不是自增字段,确保在插入数据时手动提供一个合法的值。
使用数据库默认值:如果您希望'introduce_id'字段在插入数据时使用默认值,可以在数据库表的定义中为该字段设置默认值。例如,将其设置为自增字段,或者设置一个默认值,这样在插入数据时如果未提供具体值,数据库将使用默认值。
检查MyBatis映射配置:如果使用MyBatis进行数据库操作,请确保'introduce_id'字段在映射文件中正确地进行了映射,特别是如果该字段是自增字段,需要正确配置以使数据库能够自动生成值。
示例(设置默认值):
ALTER TABLE your_table MODIFY COLUMN introduce_id INT NOT NULL AUTO_INCREMENT;
<if>
标签和${params.dataScope}
是用于执行数据范围过滤的一种方式。数据范围过滤通常用于控制在数据库查询中返回的数据范围,以便根据用户的权限或其他条件仅返回满足特定条件的数据。
示例解释:
假设您有一个数据库表格users
,其中包含以下字段:
user_id
:用户IDusername
:用户名status
:用户状态(例如,'active'表示激活,'inactive'表示未激活)<update id="cleanLogininfor">
:这表示定义了一个名为cleanLogininfor
的更新操作,id为该更新操作的唯一标识,用于在MyBatis的mapper中调用这个SQL语句。truncate table sys_logininfor
:这是实际的SQL语句,用于执行数据清空操作。truncate table
是SQL语句中的一个命令,用于删除整个表中的所有数据,但保留表的结构。在这里,我们指定要删除的表名为sys_logininfor
。
注意事项:
TRUNCATE TABLE语句是一种高效的数据清空方法,它直接删除整个表的数据,而不是逐行删除数据。这意味着执行速度通常比DELETE语句快得多。但是请注意,使用TRUNCATE TABLE语句将无法记录删除的行,也无法触发触发器(如果有)。
在执行TRUNCATE TABLE语句时,需要谨慎使用,确保您真正需要清空整个表的数据。因为TRUNCATE TABLE操作是不可逆的,一旦执行就会永久删除表中的所有数据。
此操作可能需要具有足够权限的数据库用户来执行。在生产环境中,特别是涉及敏感数据的情况下,务必小心并确保仅有授权的用户可以执行这类操作。
这个错误消息表明在更新数据库时出现了问题,原因是 java.lang.NumberFormatException
,具体指向了字符串转换为数字时出现的错误。错误信息中显示出现了一个无效的数字字符串:"/profile/upload/2023/07/04/dddddd_20230704203032A001.png",这个字符串无法被正确转换为数字。
通常,这种错误在数据库更新过程中出现,可能是因为你的代码中尝试将字符串转换为数字类型,但这个字符串不符合数字的格式要求,导致转换失败。
在上述错误消息中,出现的字符串看起来像是一个图片的文件路径,而不是一个有效的数字。可能的原因是:
数据库字段类型错误: 可能在更新数据库时,你要将字符串值写入一个数字类型的数据库字段中,但该字段不应该存储这种类型的字符串数据。
数据格式错误: 数据库字段期望是数字类型,但在更新过程中传递了一个无效的字符串,例如包含了文件路径或其他非数字字符。
代码逻辑错误: 可能在更新数据库前,你的代码中做了某种操作,意外地将图片路径或其他非数字内容传递给了更新数据库的操作。
要修复这个问题,你可以考虑以下步骤:
检查数据库字段类型: 确保要更新的字段类型与传递的值匹配。如果字段应该是数字类型,确保不会传递非数字内容。
检查数据处理逻辑: 回顾代码逻辑,查看在更新数据库前是否对数据进行了正确的处理,防止将非数字内容传递给数字字段。
日志记录: 在代码中加入更详细的日志记录,记录传递给数据库更新的值,帮助你找出哪个部分出现了问题。
异常处理: 确保在代码中有适当的异常处理,以便在出现错误时,能够捕获和处理异常,避免整个操作崩溃。
根据错误信息可以看出,出现了一个嵌套异常(nested exception)。主要错误是 java.lang.NumberFormatException
,而导致此错误的原因是尝试将字符串 "/profile/avatar/2023/06/23/blob_20230623212234A001.png" 转换为数字时出现了问题。
在错误信息中,可以看到涉及到 MyBatis(org.apache.ibatis.exceptions.PersistenceException) 的数据库更新操作。这些操作发生在 SysPictureMapper.xml 文件中的 com.ruoyi.system.mapper.SysPictureMapper.insertPicture 方法中。
问题的根本在于尝试将字符串 "/profile/avatar/2023/06/23/blob_20230623212234A001.png" 转换为数字,而此字符串不是有效的数字格式,因此引发了 NumberFormatException。
为了解决这个问题,你需要检查代码并确保不会在需要数字的地方传递错误的字符串参数。在这种情况下,很可能是在数据库更新操作中,错误地将文件路径传递为数字导致的。你应该找到相关代码块,检查 SysPictureMapper.xml 和对应的 Java 代码,特别是与图片路径相关的部分。
一种可能的解决方案是,如果你希望在数据库中存储图片路径,你应该将其存储为字符串类型的字段,而不是尝试将其转换为数字。这样可以避免 NumberFormatException 错误。
例如,如果数据库表中有一个 "avatar_path" 字段来存储图片路径,那么你可以将其声明为 VARCHAR 或类似的字符串类型。
在修复代码后,确保重新构建和部署应用程序,以便更改生效。
总结一下:
检查代码中与图片路径有关的部分,确保不会将其错误地传递为数字。
如果需要在数据库中存储图片路径,请将其作为字符串类型存储,而不是数字类型。
修复代码后重新构建和部署应用程序。
java.lang.NumberFormatException: For input string: ""解决方案
引起异常的主要原因如下:
1.传参字段和映射字段不一致
2.传参类型和映射类型不一致
3.时间类型转换时间戳长度不一致
4.参数长度和数据库不一致
在
<if>
条件中,检查picUrl
和userId
是否为非空字符串时,应该修改判断条件,不要将它们与数字0
进行比较,因为这些字段是字符串类型的。应该使用picUrl != null and picUrl != ''
和userId != null and userId != ''
来判断是否为非空字符串。对于
picUrl
和userId
字段,插入语句中的判断条件应该在逗号,
前面,而不是在后面。如果字段值不为空,才应该插入逗号,否则不需要插入逗号。
Spring Boot 结合Swagger 实现图片上传API接口文档
/**
* 图片文件上传至阿里云OSS
*
* @param multipartFile 图片文件
* @return 上传结果 图片存储地址
*/
@ApiOperation(value = "上传图片文件至OSS", httpMethod = "POST")
@PostMapping(value = "/uploadPictureFile", consumes = "multipart/*", headers = "content-type=multipart/form-data")
public String uploadPictureFile(@ApiParam(value = "上传图片文件", required = true) @RequestParam("file") MultipartFile multipartFile) {
return aliyunOssService.uploadPictureFile(multipartFile);
}
在Spring Boot中,你可以使用@ApiParam
注解和@RequestPart
注解来设置Swagger文档中上传文件的描述信息。下面是一个示例代码,展示如何根据MultipartFile
来设置Swagger:
Swagger:
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/api")
@Api(tags = "文件上传接口")
public class FileUploadController {
@PostMapping("/upload")
@ApiOperation(value = "上传文件接口", notes = "上传文件到服务器")
public ResponseEntity<String> uploadFile(
@ApiParam(value = "要上传的文件", required = true) @RequestPart("file") MultipartFile file
) {
// 在这里进行文件上传的逻辑
// ...
return new ResponseEntity<>("File uploaded successfully.", HttpStatus.OK);
}
}
在上面的示例中,我们使用@ApiParam
注解来描述MultipartFile
类型的file
参数。@ApiParam
允许你为参数提供说明和其他元数据,这些信息将会显示在Swagger文档中。我们设置required = true
来指定这个参数是必需的。
另外,我们还使用@RequestPart
注解来绑定MultipartFile
类型的参数file
。这是因为文件上传时,一般会使用@RequestParam
来处理普通表单字段,而使用@RequestPart
来处理文件上传。
在使用Swagger生成API文档时,它会根据@Api
和@ApiOperation
中的信息以及@ApiParam
中的描述来生成相应的API文档。以上的示例会在Swagger UI中显示一个上传文件的接口,并且会包含关于文件参数的说明。
加群联系作者vx:xiaoda0423
仓库地址:https://github.com/webVueBlog/JavaGuideInterview