前言
java操作数据库的一些配置文件请点击这里点这里跳转
本文仅记录一些心得和遇到的问题及解决办法
一、心得
1.sqlite数据库本身
sqlite是一个很轻量级的数据库,暂未发现HTTP连接的方式,一般的做法是放在IDEA中的resources目录下,保证数据跟着项目走,因为一般是做嵌入式的数据库.
但是java的项目嘛,就多环境配置了多个路径,这里写了两个配置文件地址,只有URL的区别
只要运行系统上有sqlite引擎就可以了.
sqlite的sql和其他关系型数据库sql格式大多一样,只有方言和一些命令不太一样,这个直接照抄百度即可
sqlite数据库本身也挺特殊,它内部我所知道的只支持4种数据类型
我所用的全都是text,其中没有时间格式,这也会引出下面的问题!
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.sqlite.JDBC
url: jdbc:sqlite:/opt/sqlite3/db/test.db
#url: jdbc:sqlite:D:/sqlite/test.db
druid:
# ?????
initialSize: 5
# # ???????
minIdle: 10
# # ???????
maxActive: 20
validation-query: SELECT 1
testOnBorrow: true
test-on-return: true
use-unfair-lock: true
remove-abandoned: true
remove-abandoned-timeout: 1800
log-abandoned: false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: -1
二.遇到的问题
1.driverClassName: org.sqlite.JDBC,这个JDBC的版本问题,我之前从网上抄的版本是3.7.0,出现了很严重的bug,在修改完IP地址之后,内部JDBC连接status字段直接错乱,所有的sql都会报错,纯纯的JDBC连接挂掉了,只能靠重启恢复,多方求解也无法搞定,后来发现问题出现在JDBC上,去Maven找了版本,找了个较新的3.28.0才最终解决问题
2.JDBC和持久层框架Mabatis在windows和linux上不同的支持,这个也是很蛋疼的问题,在windows上运行sql好好的,但是上了linux就报错,我个人的理解是JDBC和Mabatis配合,在Windows环境上可以自动将日期字符串"2022-10-10 19:19:19"转换为Date格式,也就是你的实体类中Date类型字段的Setter方法的传入参数为Date类型即可,代码如下
private Date createTime;
//windows环境
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
//Linux环境
public void setCreateTime(String createTime)
{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
this.createTime = simpleDateFormat.parse(createTime);
} catch (ParseException e) {
e.printStackTrace();
}
}
Linux上就无法自动转换,需要将Setter方法的入参改为String类型,这个和数据库的存储类型有直接关系,Sqlite支持字符串存储,不支持时间戳
3.方言的问题也挺麻烦,我在IDEA上配置了专门的Sqlite数据源,但是并不能识别方案,写在sql里的方法代码都会标红
<dependency>
<groupId>com.zsoltfabok</groupId>
<artifactId>sqlite-dialect</artifactId>
<version>1.0</version>
</dependency>这里提供一个sqlite方言库,我引入试了,没成功,好像是maven找不到包
总结
记一次遇到的坑和困扰了一天的问题