问题一:数据库中文显示问号
如图所示,使用后台使用jdbcTemplate.execute(sql)保存到数据库后显示中文。当时查看数据库和表格的编码都没问题,都是utf8mb4。当时就去谷歌搜索。上面说先查看数据库各个编码格式,如果为utf8或者utf8mb4那就说明没有问题。
但是我的有一个属性是latin1:
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=utf8&serverTimezone=UTC+8&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内部。可能看教程的时候没注意到,应该新建一个文件来存放。
编译器报过这行,但是因为是warning就没在意。
问题的本质是:内部非静态类无法实例化
正常来说应该把Teacher类单独建一个文件出来外,但是为了解决报错还可以:
1.给内部类前面加上static。因为静态内部类其实就相当于顶级类,不依赖与外部类,而普通内部类实例话需要依赖于外部实例对象。
2.给内部类加上默认构造函数
问题三:
当时id报错说can resolve path variable "id" in request mapping. 对比了教程发现@GetMapping的id没有用中括号括上。
目前认为的是如果不加括号则认为是路径,加了之后则可以识别为参数。
问题四:
教程中有三种写法
有的地方用%d,有的用%s,但是都能正常使用,应该和mysql语句有关,待下周学习一下相关语句。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。