最近有个需求,是手机软件离线使用,
用的springboot + mybatis-plus + mysql,无法实现,于是考虑使用内嵌式轻量级的数据库SQLlite
org.xerial sqlite-jdbc 3.36.0.3
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文件。
预先 生成表结构以及铺地数据,百度了很久并不能通过预先放好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放在项目里的文件夹
3). 添加Sqllite
建议方框内的值直接填写生成的db名即可,同时别忘记点击一个test Connection测试一下。
ok,生成了db。
4). 执行sql
双击该数据库,
选择之前的sql执行,可以看日志
两个sql都run一下
OK, 我这边都成功了
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 ServiceImplimplements 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; } }
启动后,访问成功。
打个包,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!