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的客户端执行一下。
最后,测试;
控制台打印结果如下图所示:
浏览器执行结果如下图所示:
写这个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可真没白写,又发现了几个好用的工具包。