1. 环境准备与依赖配置在开始整合SpringBoot、Sqlite3、MyBatis-Plus和Druid之前我们需要先搭建好开发环境。这里我推荐使用IntelliJ IDEA作为开发工具它对于SpringBoot项目的支持非常友好。首先确保你的机器上已经安装了JDK 1.8或更高版本这是运行SpringBoot项目的基础。说到Sqlite3的驱动版本选择这里有个大坑我踩过。Sqlite3的驱动版本必须与你的JDK版本匹配否则会出现各种奇怪的兼容性问题。比如在JDK 1.8环境下我推荐使用sqlite-jdbc 3.27.2.1版本这个版本经过实测非常稳定。在pom.xml中添加依赖时除了Sqlite3驱动我们还需要引入MyBatis-Plus和Druid的相关依赖!-- Sqlite3驱动 -- dependency groupIdorg.xerial/groupId artifactIdsqlite-jdbc/artifactId version3.27.2.1/version /dependency !-- MyBatis-Plus -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.1/version /dependency !-- Druid连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.8/version /dependency配置Druid连接池时我发现很多教程都会忽略一些重要参数的设置。比如initial-size初始连接数和max-active最大活跃连接数的比例关系如果设置不当会导致性能问题。对于中小型项目我建议initial-size设为8max-active设为20这样既能保证性能又不会浪费资源。另外time-between-eviction-runs-millis检测空闲连接间隔时间也很重要建议设置为60000毫秒1分钟。2. 配置文件详解与常见坑点在application.yml中配置数据库连接时有几个关键点需要注意。首先是Sqlite3的URL格式这个坑我见过很多人踩。Sqlite3的URL必须以jdbc:sqlite:开头后面跟上数据库文件的路径。这里有两种写法相对路径和绝对路径。相对路径写法是jdbc:sqlite::resource:data.db绝对路径写法是jdbc:sqlite:/path/to/data.db。我建议在开发阶段使用相对路径部署时再改为绝对路径。Druid的filter配置也是个容易出错的地方。很多教程会建议配置wall防火墙filter但对于Sqlite3来说这个filter会导致项目启动失败。正确的做法是只配置stat、slf4j和config这三个filter。下面是一个完整的配置示例spring: datasource: url: jdbc:sqlite::resource:data.db username: password: driver-class-name: org.sqlite.JDBC type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 8 max-active: 20 min-idle: 1 max-wait: 60000 time-between-eviction-runs-millis: 60000 validation-query: select x filters: stat,slf4j,config关于数据库文件的位置我建议放在resources目录下。这样打包时数据库文件会自动包含在jar包中方便部署。但要注意如果使用内嵌的Sqlite3数据库每次重启应用数据都会重置。对于生产环境建议将数据库文件放在外部目录并通过绝对路径引用。3. MyBatis-Plus整合与最佳实践MyBatis-Plus的整合相对简单但有几个技巧可以让开发效率更高。首先是实体类的设计我建议使用TableName注解明确指定表名即使表名与类名一致也最好加上。因为Sqlite3对大小写不敏感明确指定可以避免潜在问题。TableName(user) public class User { TableId(type IdType.AUTO) private Long id; private String name; private Integer age; // 省略getter/setter }Mapper接口的设计也有讲究。我建议所有Mapper都继承BaseMapper这样就能直接使用MyBatis-Plus提供的CRUD方法。同时可以在启动类上添加MapperScan注解指定Mapper接口所在的包路径SpringBootApplication MapperScan(com.example.mapper) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }在实际开发中我经常使用MyBatis-Plus的条件构造器来构建复杂查询。比如下面这个例子可以很方便地构建动态查询条件public ListUser findUsers(String name, Integer minAge, Integer maxAge) { QueryWrapperUser wrapper new QueryWrapper(); if (StringUtils.isNotBlank(name)) { wrapper.like(name, name); } if (minAge ! null) { wrapper.ge(age, minAge); } if (maxAge ! null) { wrapper.le(age, maxAge); } return userMapper.selectList(wrapper); }4. 常见问题排查与解决方案在实际项目中我遇到过几个比较典型的问题。首先是依赖冲突问题特别是当项目中有多个数据源时。解决方法是使用Maven的dependency:tree命令分析依赖关系排除冲突的依赖版本。另一个常见问题是Sqlite3的并发访问限制。Sqlite3默认只支持单个写操作多个并发写操作会导致数据库锁定。解决方案是合理设计事务范围避免长时间持有数据库连接。对于高并发场景建议考虑其他数据库方案。关于Resource和Autowired的注入问题这里有个经验分享。当使用Resource注入相同类型的多个Bean时如果变量名相同会导致Spring无法区分。解决方法要么指定不同的变量名要么使用Qualifier明确指定Bean名称。我个人的习惯是尽量使用Autowired配合Qualifier这样代码意图更明确。Service public class MyService { Autowired Qualifier(firstDataSource) private DataSource firstDataSource; Autowired Qualifier(secondDataSource) private DataSource secondDataSource; }最后关于Sqlite3的性能优化我有几点建议合理设计索引、避免全表扫描、批量操作使用事务。特别是批量插入数据时开启事务可以将性能提升数十倍。下面是一个批量插入的示例Test public void testBatchInsert() { ListUser users new ArrayList(); // 添加1000个用户 for (int i 0; i 1000; i) { users.add(new User(user i, i % 100)); } // 使用事务批量插入 userMapper.insertBatchSomeColumn(users); }
SpringBoot整合Sqlite3+MyBatis-Plus+Druid实战:避坑指南与最佳实践
1. 环境准备与依赖配置在开始整合SpringBoot、Sqlite3、MyBatis-Plus和Druid之前我们需要先搭建好开发环境。这里我推荐使用IntelliJ IDEA作为开发工具它对于SpringBoot项目的支持非常友好。首先确保你的机器上已经安装了JDK 1.8或更高版本这是运行SpringBoot项目的基础。说到Sqlite3的驱动版本选择这里有个大坑我踩过。Sqlite3的驱动版本必须与你的JDK版本匹配否则会出现各种奇怪的兼容性问题。比如在JDK 1.8环境下我推荐使用sqlite-jdbc 3.27.2.1版本这个版本经过实测非常稳定。在pom.xml中添加依赖时除了Sqlite3驱动我们还需要引入MyBatis-Plus和Druid的相关依赖!-- Sqlite3驱动 -- dependency groupIdorg.xerial/groupId artifactIdsqlite-jdbc/artifactId version3.27.2.1/version /dependency !-- MyBatis-Plus -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.1/version /dependency !-- Druid连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.8/version /dependency配置Druid连接池时我发现很多教程都会忽略一些重要参数的设置。比如initial-size初始连接数和max-active最大活跃连接数的比例关系如果设置不当会导致性能问题。对于中小型项目我建议initial-size设为8max-active设为20这样既能保证性能又不会浪费资源。另外time-between-eviction-runs-millis检测空闲连接间隔时间也很重要建议设置为60000毫秒1分钟。2. 配置文件详解与常见坑点在application.yml中配置数据库连接时有几个关键点需要注意。首先是Sqlite3的URL格式这个坑我见过很多人踩。Sqlite3的URL必须以jdbc:sqlite:开头后面跟上数据库文件的路径。这里有两种写法相对路径和绝对路径。相对路径写法是jdbc:sqlite::resource:data.db绝对路径写法是jdbc:sqlite:/path/to/data.db。我建议在开发阶段使用相对路径部署时再改为绝对路径。Druid的filter配置也是个容易出错的地方。很多教程会建议配置wall防火墙filter但对于Sqlite3来说这个filter会导致项目启动失败。正确的做法是只配置stat、slf4j和config这三个filter。下面是一个完整的配置示例spring: datasource: url: jdbc:sqlite::resource:data.db username: password: driver-class-name: org.sqlite.JDBC type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 8 max-active: 20 min-idle: 1 max-wait: 60000 time-between-eviction-runs-millis: 60000 validation-query: select x filters: stat,slf4j,config关于数据库文件的位置我建议放在resources目录下。这样打包时数据库文件会自动包含在jar包中方便部署。但要注意如果使用内嵌的Sqlite3数据库每次重启应用数据都会重置。对于生产环境建议将数据库文件放在外部目录并通过绝对路径引用。3. MyBatis-Plus整合与最佳实践MyBatis-Plus的整合相对简单但有几个技巧可以让开发效率更高。首先是实体类的设计我建议使用TableName注解明确指定表名即使表名与类名一致也最好加上。因为Sqlite3对大小写不敏感明确指定可以避免潜在问题。TableName(user) public class User { TableId(type IdType.AUTO) private Long id; private String name; private Integer age; // 省略getter/setter }Mapper接口的设计也有讲究。我建议所有Mapper都继承BaseMapper这样就能直接使用MyBatis-Plus提供的CRUD方法。同时可以在启动类上添加MapperScan注解指定Mapper接口所在的包路径SpringBootApplication MapperScan(com.example.mapper) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }在实际开发中我经常使用MyBatis-Plus的条件构造器来构建复杂查询。比如下面这个例子可以很方便地构建动态查询条件public ListUser findUsers(String name, Integer minAge, Integer maxAge) { QueryWrapperUser wrapper new QueryWrapper(); if (StringUtils.isNotBlank(name)) { wrapper.like(name, name); } if (minAge ! null) { wrapper.ge(age, minAge); } if (maxAge ! null) { wrapper.le(age, maxAge); } return userMapper.selectList(wrapper); }4. 常见问题排查与解决方案在实际项目中我遇到过几个比较典型的问题。首先是依赖冲突问题特别是当项目中有多个数据源时。解决方法是使用Maven的dependency:tree命令分析依赖关系排除冲突的依赖版本。另一个常见问题是Sqlite3的并发访问限制。Sqlite3默认只支持单个写操作多个并发写操作会导致数据库锁定。解决方案是合理设计事务范围避免长时间持有数据库连接。对于高并发场景建议考虑其他数据库方案。关于Resource和Autowired的注入问题这里有个经验分享。当使用Resource注入相同类型的多个Bean时如果变量名相同会导致Spring无法区分。解决方法要么指定不同的变量名要么使用Qualifier明确指定Bean名称。我个人的习惯是尽量使用Autowired配合Qualifier这样代码意图更明确。Service public class MyService { Autowired Qualifier(firstDataSource) private DataSource firstDataSource; Autowired Qualifier(secondDataSource) private DataSource secondDataSource; }最后关于Sqlite3的性能优化我有几点建议合理设计索引、避免全表扫描、批量操作使用事务。特别是批量插入数据时开启事务可以将性能提升数十倍。下面是一个批量插入的示例Test public void testBatchInsert() { ListUser users new ArrayList(); // 添加1000个用户 for (int i 0; i 1000; i) { users.add(new User(user i, i % 100)); } // 使用事务批量插入 userMapper.insertBatchSomeColumn(users); }