记录本周遇到的问题

问题一:数据库中文显示问号

image.png
如图所示,使用后台使用jdbcTemplate.execute(sql)保存到数据库后显示中文。当时查看数据库和表格的编码都没问题,都是utf8mb4。当时就去谷歌搜索。上面说先查看数据库各个编码格式,如果为utf8或者utf8mb4那就说明没有问题。
记录本周遇到的问题_第1张图片
但是我的有一个属性是latin1:
记录本周遇到的问题_第2张图片

Latin1是ISO-8859-1的别名,。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

但是其中的文字符号包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号,没有中文

但是这里的问题不在于latin1,mysql用latin1也可以显示中文。原因在于中文不管用什么字符集来表示(GBK\GB2312\UTF8等),最终都是字节的整数倍而latin1就是满8byte(整字节)的编码方式所以任何其他的码流都可以被看做latin1无论你传多少个字节进去mysql都可以认为它是一个或者多个latin字符而已。但是基于可维护的角度,虽然latin1没什么问题,但是还是尽量换成utf8或者utfmb4系列。

查阅提到问题可能在于当character_set_server 与 character_set_database等不同,因为在读取和写入的时候如果采取不同的编码方式,编译器就可能会犯懵。所以如第一个图所示,character_set_server和其他几个最好都改成一样的,如uf8mb4。

但是最后参考了网上大部分修改都没有把这个latin1改成功。按照网上的修改了my.cnf文件但是没有反应,还是对应属性还是latin1。

最后问了老师之后才明白可以修改后台与数据库的连接方式,搜索相关内容后,在后台与数据库的连接上加上这行就行了,最后能正常使用。

?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=UTC&useSSL=false

参考文章:https://database.51cto.com/ar...

问题二:请求报错

{
  "timestamp": "2022-01-14T09:18:42.269+0000",
  "status": 400,
  "error": "Bad Request",
  "message": "JSON parse error: Cannot construct instance of 
  `com.mengyunzhi.springBootStudy.TeacherController$Teacher` 
  (although at least one Creator exists): can only instantiate 
  non-static inner class by using default, no-argument 
  constructor; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.mengyunzhi.springBootStudy.TeacherController$Teacher` (although at least one Creator exists): can only instantiate non-static inner class by using default, no-argument constructor\n at [Source: (PushbackInputStream); line: 2, column: 3]",
  "path": "/Teacher"
}

大概说的是Teacher无法实例化。can only instantiate non-static inner class by using default, no-argument constructor;。发生了嵌套异常。

发现我Teacher类写在了controller内部。可能看教程的时候没注意到,应该新建一个文件来存放。
记录本周遇到的问题_第3张图片
编译器报过这行,但是因为是warning就没在意。但是我觉得Teacher不是静态的。
image.png

问题的本质是:内部非静态类无法实例化

正常来说应该把Teacher类单独建一个文件出来外,但是为了解决报错还可以:
1.给内部类前面加上static。因为静态内部类其实就相当于顶级类,不依赖与外部类,而普通内部类实例话需要依赖于外部实例对象。
2.给内部类加上默认构造函数

问题三:

记录本周遇到的问题_第4张图片
当时id报错说can resolve path variable "id" in request mapping. 对比了教程发现@GetMapping的id没有用中括号括上。
目前认为的是如果不加括号则认为是路径,加了之后则可以识别为参数。

问题四:

教程中有三种写法
image.png


记录本周遇到的问题_第5张图片


image.png

有的地方用%d,有的用%s,但是都能正常使用,应该和mysql语句有关,待下周学习一下相关语句。

你可能感兴趣的:(后端)