Springboot + Sqlite实战(离线部署成功)
作者:mmseoamin日期:2023-12-21

最近有个需求,是手机软件离线使用,

用的springboot + mybatis-plus + mysql,无法实现,于是考虑使用内嵌式轻量级的数据库SQLlite

  1. 引入依赖
		
            org.xerial
            sqlite-jdbc
            3.36.0.3
        
  1. 修改配置文件
server:
  port: 9090
spring:
  datasource:
    url: jdbc:sqlite:sqlite.db
    driver-class-name: org.sqlite.JDBC
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: auto
  type-aliases-package: com.example.sqlite.entity

此处的url折磨了一晚上,网上各种百度加resource目录下什么的,最后直接这样,启动后会在根目录下自动生成一个db文件。

Springboot + Sqlite实战(离线部署成功),在这里插入图片描述,第1张

  1. 铺底表结构及数据

    预先 生成表结构以及铺地数据,百度了很久并不能通过预先放好sql,然后启动时候动态执行生成。

    最后只能自己在本系统中手动创建好,以及执行好sql,项目打包之后该数据库及铺底数据会内嵌其中

1). 建表语句

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`
(
    `id`          INTEGER NOT NULL,
    `username`    TEXT,
    `password`    TEXT,
    PRIMARY KEY (`id`)
)

sqllite的数据类型和mysql不同,但同时也包容(不确定)

简单来说

整数用 INTEGER

字符串用 TEXT

浮点数 REAL

具体可参考该链接: SQLLite基本数据类型

2). 铺地数据

INSERT INTO `user` VALUES (1, '范大', '11111');

将这两个sql放在项目里的文件夹

Springboot + Sqlite实战(离线部署成功),在这里插入图片描述,第2张

3). 添加Sqllite

Springboot + Sqlite实战(离线部署成功),在这里插入图片描述,第3张

Springboot + Sqlite实战(离线部署成功),在这里插入图片描述,第4张

建议方框内的值直接填写生成的db名即可,同时别忘记点击一个test Connection测试一下。

Springboot + Sqlite实战(离线部署成功),在这里插入图片描述,第5张

ok,生成了db。

4). 执行sql

双击该数据库,

Springboot + Sqlite实战(离线部署成功),在这里插入图片描述,第6张

选择之前的sql执行,可以看日志

Springboot + Sqlite实战(离线部署成功),在这里插入图片描述,第7张

两个sql都run一下

Springboot + Sqlite实战(离线部署成功),在这里插入图片描述,第8张

OK, 我这边都成功了

  1. 简单写个demo

    Controller

package com.example.sqlite.controller;
import com.example.sqlite.entity.User;
import com.example.sqlite.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;
    @GetMapping("/get/{id}")
    public User findOne(@PathVariable Integer id) {
        return userService.getById(id);
    }
    @GetMapping("/save/{id}")
    public void save(@PathVariable Integer id) {
        User user = new User();
        user.setId(id);
        user.setUsername(id+":哈哈哈哈");
        userService.save(user);
    }
}

service

package com.example.sqlite.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.sqlite.entity.User;
public interface UserService extends IService {
}

serviceImpl

package com.example.sqlite.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.sqlite.entity.User;
import com.example.sqlite.mapper.UserMapper;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl implements UserService{
}

Mapper

package com.example.sqlite.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sqlite.entity.User;
public interface UserMapper extends BaseMapper {
}

Entity

package com.example.sqlite.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    private String username;
    private String password;
}

UserMapper.xml





MybatisPlusConfig

package com.example.sqlite.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//注入配置springboot
@Configuration
@MapperScan("com.example.sqlite.mapper")
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQLITE));
        return interceptor;
    }
}

启动后,访问成功。

Springboot + Sqlite实战(离线部署成功),在这里插入图片描述,第9张

打个包,java -jar启动,经测试报错,并无该数据库表。说明sql并不会自动执行。

简单一点,直接项目启动的时候,我指定sql让他启动。

CustomizeDataSourceInitializer

package com.example.sqlite.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.DatabasePopulator;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import javax.sql.DataSource;
@Configuration
public class CustomizeDataSourceInitializer {
    @Value("classpath:db/create.sql")
    private Resource sqlScriptSchema;
    @Value("classpath:db/data.sql")
    private Resource sqlScriptData;
    @Bean
    public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
        DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
        dataSourceInitializer.setDataSource(dataSource);
        dataSourceInitializer.setDatabasePopulator(databasePopulator());
        return dataSourceInitializer;
    }
    private DatabasePopulator databasePopulator() {
        ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
        resourceDatabasePopulator.addScript(sqlScriptSchema);
        resourceDatabasePopulator.addScript(sqlScriptData);
        resourceDatabasePopulator.setSeparator(";");
        return resourceDatabasePopulator;
    }
}

重新打包,java -jar启动后,正常访问。

OK!