SpringBoot 整合 Sqlite3

Sqlite是一个轻量级的关系型数据库,它不需要单独安装,类似于一个文本文件,又可以放置在项目内作为持久化数据的内嵌式数据库使用。

因此,Sqlite成了很多手机App应用持久化数据的最佳选择。小型的Web项目,或者桌面应用,sqlite也是个不错的选择。下面就使用SpringBoot来整合一下Sqlite3,一起看一下吧。

第一步,pom.xml引入所需架包;

<!-- sqlite依赖 start -->    
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.36.0</version>
</dependency>
<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<!-- sqlite依赖 end -->

第二步,配置文件;

application.properties配置:


spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver
spring.datasource.url=jdbc:p6spy:sqlite:c:\\test.db
spring.datasource.username=
spring.datasource.password=

配置说明:先在C盘把数据库文件建好,可以先建立一个文本文件然后重新命名为test.db,一定要有读写权限,否则在操作时会出现打不开数据库的问题。

spy.properties配置:


#3.2.1以上使用
#modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

参考:https://www.cnblogs.com/dalianpai/p/14682982.html

第三步,注解使用,数据库表和实体类的对应;

import com.baomidou.mybatisplus.annotation.OrderBy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

import lombok.Data;

@Data
@TableName
public class User {
  // 排序,默认升序
  @OrderBy(asc=true)
  @TableId // 主键
  private String uid;

  private String name;

  private Integer sex;

  private String email;

  /**
   * 在数据库中不存在的字段
   */
  @TableField(exist=false)
  private String nickName;

}

注解说明:

@TableId:主键标识;
@OrderBy(asc=true):查询时按住被注解字段升序查询;
@TableField(exist=false):如果某个字段在表中不存在,可以这么用;
@TableName : 要设置表名、前缀等等,可以到这个注解里去设置;

第四步,mapper接口;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
/**
* 继承BaseMapper即可
*/
public interface UserMapper extends BaseMapper<User>{

}

说明:在启动类上加上扫描mapper文件夹的注解,以防找不到mapper映射;

@MapperScan("com.example.demo.mapper")

第五步,简单应用;

import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;

@RequestMapping("/index")
@RestController
public class IndexController {

  @Resource
  private UserMapper userMapper;

  /**
   * 获取所有数据
   * @return
   */
  @GetMapping
  public Object index(){
      return userMapper.selectList(null);
  }

  /**
   * 新增
   * @return
   */
  @GetMapping("/insert")
  public Object insert(){
    User user = new User();
    user.setName(randomString());
    Random random = new Random();
    user.setUid("" + random.nextInt(1000));
    user.setSex(1);
      return userMapper.insert(user);
  }

  /**
   * 获取总数
   * @return
   */
  @GetMapping("/count")
  public Object index1(){
      Long userCount = userMapper.selectCount(null);
      return userCount;
  }

  /**
   * 获取一个list集合
   * 排序 orderByAsc("order_id")
   * 不为null的判断 isNotNull("stove_code")
   * 分组 groupBy("product_model")
   * @return
   */
  @GetMapping("/male")
  public Object index2(){
      List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("sex", 1));
      return users;
  }

  /**
   * 获取一个map集合
   * @return
   */
  @GetMapping("/map")
  public Object index3(){
      List<Map<String,Object>> users = userMapper.selectMaps(new QueryWrapper<User>()
        .select("uid,name")
        .eq("sex", 1));
      return users;
  }

  /**
   * 随机生成字母
   * @param length
   * @return
   */
  public String randomString(){      
      StringBuilder s = new StringBuilder(5);
      Random random = new Random();   
      for( int i = 0; i < 5; i ++) {   
          int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; // 取得大写还是小写   
          s.append((char)(choice + random.nextInt(26)));   
      }
      return s.toString();
  }
}

第六步,建表;

DROP TABLE IF EXISTS "user";
CREATE TABLE "user" (
  "uid" text(36) NOT NULL,
  "name" TEXT,
  "sex" integer,
  "email" TEXT,
  PRIMARY KEY ("uid")
);
PRAGMA foreign_keys = true;

说明:在运行demo之前,先把建表语句拿到sqlite的客户端执行一下。

最后,测试;

控制台打印结果如下图所示:

image.png

浏览器执行结果如下图所示:

image.png
image.png

写这个demo的时候,也遇到很多问题,在此记录一下:

1.引入架包后,项目出现一个红色的感叹号,怎么办?

太久不建新项目,老问题又冒出来了,把pom.xml里的架包一个一个注释掉,然后再一个一个放开,找到冲突的架包,到maven仓库里把冲突的架包删除重新maven update即可。

2.demo在另一个电脑上运行没有问题,拷贝过来,架包也引入了,文件还是很多红色叉号怎么办?

先排除架包引入冲突问题,然后再看看拷贝的文件中报错的地方提示什么,有可能是拷贝的特殊符号呢,去掉就可以了。

p6spy参考文档:

https://www.sqlite.org/docs.html

https://cloud.tencent.com/developer/article/1472808?from=15425

https://cloud.tencent.com/developer/article/1396722?from=15425

mybatis-plus-boot-starter的参考文档:

https://cloud.tencent.com/developer/article/1464098

最后总结

通过一个简单的demo,sqlite3在三个架包的加持下,使用起来非常简单。mybatis-plus-boot-starter也是mysql所使用的架包,之前没用过,更对它一无所知,现在终于了解一点了。p6spy还可以用来监控sql语句,纯属意外收获。这个demo可真没白写,又发现了几个好用的工具包。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容