当前位置:首页 > 技术 > 正文内容

Spring Boot 集成 SQLite3 与 MyBatis-Plus 的轻量级数据服务实践

访客 技术 2026年8月11日 1

Maven 依赖声明

通过继承 Spring Boot 父工程统一管理组件版本,引入 Web 模块、SQLite JDBC 驱动、MyBatis-Plus Starter 以及 Fastjson 用于序列化输出。构建阶段需开启 fork 属性以确保打包环境隔离。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath/>
</parent>

<properties>
    <java.version>1.8</java.version>
    <mybatis-spring-boot.version>2.0.0</mybatis-spring-boot.version>
    <mybatis-plus.version>3.0.6</mybatis-plus.version>
    <sqlite-jdbc.version>3.27.2.1</sqlite-jdbc.version>
    <fastjson.version>1.2.73</fastjson.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.xerial</groupId>
        <artifactId>sqlite-jdbc</artifactId>
        <version>${sqlite-jdbc.version}</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis-spring-boot.version}</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>${mybatis-plus.version}</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>${fastjson.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

应用环境配置

SQLite 支持将数据库文件打包至 classpath 中运行。当 db 文件存放于 resources/sqlite 目录下时,连接字符串需采用 jdbc:sqlite::resource:sqlite/xxx.db 协议格式,以便框架在打包后仍能正确定位资源路径。

server:
  port: 8190

spring:
  datasource:
    driver-class-name: org.sqlite.JDBC
    # 引用外部绝对路径
    # url: jdbc:sqlite:/data/app/demo.db
    # 引用 classpath 内嵌文件(推荐)
    url: jdbc:sqlite::resource:sqlite/demo.db
    username: root
    password: root

logging:
  level:
    root: debug
    com.example.sqlite: debug
  file: logs/app.log

领域模型定义

使用 MyBatis-Plus 注解建立表与 POJO 的双向映射,指定主键策略并保留标准 Setter/Getter 方法供框架反射调用。

package com.example.sqlite.domain;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("t_data_record")
public class DataRecord {

    @TableId("record_id")
    private Integer recordId;

    private String subject;

    private String detail;

    private String category;

    // Getters & Setters 省略
}

持久层接口

继承 BaseMapper 获得内置单表操作能力,无需编写额外 SQL 即可满足常规增删改查需求。

package com.example.sqlite.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sqlite.domain.DataRecord;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface RecordMapper extends BaseMapper<DataRecord> {
}

服务层逻辑实现

基于 ServiceImpl 封装通用业务,使用 LambdaQueryWrapper 和 LambdaUpdateWrapper 保证字段类型安全,避免硬编码列名导致的运行时异常。ID 生成采用时间戳截断策略模拟自增效果。

package com.example.sqlite.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.sqlite.domain.DataRecord;
import com.example.sqlite.mapper.RecordMapper;
import com.example.sqlite.service.RecordService;
import org.springframework.stereotype.Service;

@Service
public class RecordServiceImpl extends ServiceImpl<RecordMapper, DataRecord> implements RecordService {

    @Override
    public DataRecord queryBySubject(String subject) {
        LambdaQueryWrapper<DataRecord> query = new LambdaQueryWrapper<>();
        query.eq(DataRecord::getSubject, subject);
        return baseMapper.selectOne(query);
    }

    @Override
    public int insertRecord(DataRecord record) {
        long timeMillis = System.currentTimeMillis();
        record.setRecordId((int) (timeMillis % 100_000));
        return baseMapper.insert(record);
    }

    @Override
    public int modifyRecord(DataRecord record) {
        LambdaUpdateWrapper<DataRecord> update = new LambdaUpdateWrapper<>();
        update.eq(DataRecord::getSubject, record.getSubject());
        return baseMapper.update(record, update);
    }
}

REST 控制层

暴露标准化 HTTP 端点,接收前端请求参数并返回 JSON 响应日志记录采用 SLF4J 规范,便于后续对接集中式日志系统。

package com.example.sqlite.controller;

import com.alibaba.fastjson.JSON;
import com.example.sqlite.domain.DataRecord;
import com.example.sqlite.service.RecordService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1")
public class DataController {
    private static final Logger log = LoggerFactory.getLogger(DataController.class);

    @Autowired
    private RecordService recordService;

    @GetMapping("/fetch")
    public String fetch(@RequestParam String subject) {
        log.info("查询主题: {}", subject);
        DataRecord data = (subject != null) ? recordService.queryBySubject(subject) : null;
        return (data != null) ? JSON.toJSONString(data) : "条件参数缺失";
    }

    @PostMapping("/create")
    public String create(@RequestBody DataRecord payload) {
        log.info("新增数据: {}", JSON.toJSONString(payload));
        int affected = (payload != null) ? recordService.insertRecord(payload) : 0;
        return (affected > 0) ? "写入成功" : "写入失败";
    }

    @PutMapping("/update")
    public String update(@RequestBody DataRecord payload) {
        log.info("更新数据: {}", JSON.toJSONString(payload));
        int affected = (payload != null) ? recordService.modifyRecord(payload) : 0;
        return (affected > 0) ? "修订成功" : "修订失败";
    }
}

启动入口

标注@SpringBootApplication 激活自动装配机制,启动过程打印关键状态日志辅助运维排查。

package com.example.sqlite;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SqliteDemoApplication {
    private static final Logger log = LoggerFactory.getLogger(SqliteDemoApplication.class);

    public static void main(String[] args) {
        log.info("服务初始化中...");
        SpringApplication.run(SqliteDemoApplication.class, args);
        log.info("服务已就绪");
    }
}
工程目录结构示意

底层 sqlite 存储文件可通过官方工具或第三方图形化管理客户端手动初始化建表,亦可借助 flyway 等迁移插件实现 schema 自动化版本控制。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。