十年前我刚入行时,搭建一个博客系统需要从Servlet开始手写,光是处理一个分页功能就得折腾好几天。现在有了Spring Boot和MyBatis这样的框架,开发效率提升了不止一个量级。这个项目就是基于这两个核心框架实现的个人博客系统,特别适合Java开发者用来练手或者实际部署使用。
为什么选择这个技术组合?Spring Boot的自动配置机制可以省去大量XML配置,内置Tomcat容器让部署变得极其简单。MyBatis作为持久层框架,既保留了SQL的灵活性,又通过注解和XML映射简化了数据库操作。实测下来,这套组合在开发效率、运行性能和可维护性上达到了很好的平衡。
系统采用经典的三层架构:
特别要说明的是,我放弃了传统的JPA而选择MyBatis,主要考虑到博客系统有很多复杂的查询场景(比如按标签分类统计文章数),直接写SQL会更灵活可控。
核心表结构设计如下:
这里有个设计细节:文章内容使用了LONGTEXT类型存储Markdown源码,同时在服务层缓存了渲染后的HTML,这样既保留了编辑灵活性,又提高了访问性能。
关键代码片段:
java复制@Transactional
public void publishArticle(ArticleDTO dto) {
// Markdown转换
String html = markdownToHtml(dto.getContent());
// 标签处理
List<Tag> tags = processTags(dto.getTagNames());
// 保存文章
Article article = new Article();
article.setContentHtml(html);
articleMapper.insert(article);
// 关联标签
tags.forEach(tag -> {
articleTagMapper.insert(new ArticleTag(article.getId(), tag.getId()));
});
}
采用两级缓存策略:
缓存更新策略特别重要,我采用的是"先更新数据库再删除缓存"的方案,虽然可能存在极短时间的脏数据,但避免了缓存穿透问题。对于首页文章列表这种高频访问数据,设置了5分钟的自动刷新间隔。
直接存储和展示HTML存在安全风险。我的解决方案是:
过滤配置示例:
java复制String safeHtml = Jsoup.clean(rawHtml,
Safelist.basic()
.addTags("div","span")
.addAttributes(":all","style","class"));
当热门文章突然被大量访问时,评论提交可能成为瓶颈。我采用的优化方案:
推荐使用以下配置:
application-prod.yml关键配置:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
redis:
lettuce:
pool:
max-active: 50
max-wait: 10000
建议集成:
<foreach>标签<where>标签避免多余的AND示例:
xml复制<select id="searchArticles" resultMap="ArticleResult">
SELECT * FROM article
<where>
<if test="title != null">
AND title LIKE CONCAT('%',#{title},'%')
</if>
<if test="categoryId != null">
AND category_id = #{categoryId}
</if>
</where>
ORDER BY create_time DESC
</select>
在2核4G的云服务器上实测,首页加载时间可以控制在200ms以内,同时支持200+的并发请求。
如果想进一步完善系统,可以考虑:
这套系统我已经在生产环境稳定运行了3年,日均PV在5万左右。最大的体会是:技术选型不是越新越好,而是要选择最适合业务场景的方案。Spring Boot和MyBatis这对组合,对于中小型博客系统来说,在开发效率和运行性能之间取得了很好的平衡。