码上游记

hongjian.xia的个人博客

0%

第一篇博文--记录搭建过程遇到的问题

此博文是从之前自己搭建的博客系统中迁移过来的。

起源

在2017年12月底,当时兴起了一个搭建自己的博客想法,然后买了服务器,开始着手搭建。但是后面由于种种原因搁置了(其实就是自己的拖延症😂)。之后断断续续写了一点代码,直到今年年后,才真正开始。

项目相关

首先此博客系统是根据Tale修改而来,主要是将后台实现替换成了Spring Boot+MyBatis+FreeMarker,在此也要感谢Tale的作者@biezhi写出了这么棒的项目。

搭建过程中遇到的问题

整个过程中遇到了大大小小不少问题,在此总结分析给大家。主要有以下问题:

  1. Linux下MySQL默认数据库和表名区分大小写。
  2. Spring Boot中实现上传图片,并可以通过链接直接访问。
  3. MyBatis 不同数据库SQL的兼容性处理

具体解决

Linux下MySQL默认数据库和表名区分大小写

通过修改/etc/mysql/my.cnf配置文件,在[mysqld]下增加lower_case_table_names = 1,重启服务即可。

过程中需要注意的问题是,如果已经存在包含大写字母的数据库或表,在设置不区分大小写之后,操作它们时候会报不存在的错误。所以应该先将数据库或表名修改成小写之后再做配置。

Spring Boot中实现上传图片,并可以通过链接直接访问

Spring Boot默认classpath下的static和public目录文件会作为静态资源处理,通过连接直接访问。所以一般直接将图片文件写入这两个目录下即可,但是如果将项目以jar包的形式部署,写文件时将会出现问题。

所以解决方案是将,图片文件写到磁盘固定路径,并将该路径也配置成静态资源目录即可。以下是application.yml中的相关配置。

1
2
3
4
5
6
7
spring:
mvc:
static-locations: classpath:/static,file:${web.upload-path}
static-path-pattern: /static/**

web:
upload-path: ./upload/

将当前目录下的upload目录配置为静态资源目录,需要注意的是file:协议前缀不能缺少,以及./upload/需要以/结尾,否则目录下文件将无法正常访问。

MyBatis 不同数据库SQL的兼容性处理

  1. 配置DatabaseIdPrivider
1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class MyBatisConfig {

@Bean
public DatabaseIdProvider databaseIdProvider() {
DatabaseIdProvider provider = new VendorDatabaseIdProvider();
Properties prop = new Properties();
prop.setProperty("MySQL", "mysql");
prop.setProperty("SQLite3", "sqlite3");
provider.setProperties(prop);
return provider;
}
}
  1. mapper.xml配置文件中编写对于不同数据库的SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
<select id="selectRandom" resultMap="BaseResultMap" databaseId="mysql">
select
<include refid="allColumns"/>
from `content`
order by rand();
</select>

<select id="selectRandom" resultMap="BaseResultMap" databaseId="sqlite3">
select
<include refid="allColumns"/>
from `content`
order by random();
</select>

这样MyBatis就能根据不同数据库执行相应的SQL。