单独使用ActiveRecord连接SQLite数据库,无法调用save()方法

@Test
public void queryD(){
    DruidPlugin dp = new DruidPlugin("jdbc:sqlite::resource:db/acc.db", "userName", "password");
    ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
    // 加载数据库与Model对应
    // _MappingKit.mapping(arp);
    arp.addMapping("a","aid", A.class);
    arp.setDialect(new Sqlite3Dialect());
    dp.start();
    arp.start();

    A a = new A();
    a.set("aid",1);
    a.set("bid",1);
    a.set("cid",1);
    a.save();
}

数据库结构如下:

image.png

调用save()进行保存数据的时候,提示:

com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLFeatureNotSupportedException: not implemented by SQLite JDBC driver

	at com.jfinal.plugin.activerecord.Model.save(Model.java:612)
	at TestDb.queryD(TestDb.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by: java.sql.SQLFeatureNotSupportedException: not implemented by SQLite JDBC driver
	at org.sqlite.jdbc3.JDBC3PreparedStatement.unsupported(JDBC3PreparedStatement.java:448)
	at org.sqlite.jdbc3.JDBC3Statement.getGeneratedKeys(JDBC3Statement.java:357)
	at com.alibaba.druid.pool.DruidPooledStatement.getGeneratedKeys(DruidPooledStatement.java:760)
	at com.jfinal.plugin.activerecord.dialect.Dialect.getModelGeneratedKey(Dialect.java:157)
	at com.jfinal.plugin.activerecord.Model.save(Model.java:608)
	... 25 more


是我使用方式不对吗 @

评论区

JFinal

2023-09-21 00:58

可能是 sqlite 的驱动不对,看看 pom.xml

还有一个解决办法是,先不管 jfinal 这边, 先用纯 JDBC 将 sqlite 跑起来,然后用跑起来的配置用于 jfinal 配置

因为 jfinal 底层就是用的 JDBC, 仅仅对 JDBC 做了极薄封装,所以,能在 JDBC 上用的配置就一定能在 jfinal 中用

杜福忠

2023-09-21 01:00

dp对象增加两行代码 :
dp.set(1, 1, 1);//并发必须1
dp.setDriverClass("org.sqlite.JDBC");

确保pom.xml中有加依赖:
<dependency>
<!-- sqlite-jdbc-->
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.7.2</version>
</dependency>

xinyin025

2023-09-21 10:19

@杜福忠 这个方法不太行。

xinyin025

2023-09-21 10:20

@JFinal 如果先查出来,然后调用update(),能成功保存,唯独不能使用save()来插入新数据。测试代码可见:https://gitee.com/xinyin025/active-record-sqlite

杜福忠

2023-09-21 13:25

@xinyin025 我gitee拉取下来,sqlite-jdbc改为3.7.2 运行正常

杜福忠

2023-09-21 13:38

DruidPlugin dp = new DruidPlugin("jdbc:sqlite:db/acc.db", null, null);
dp.set(1, 1, 1);//并发必须1
dp.setDriverClass("org.sqlite.JDBC");

ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
arp.setDialect(new Sqlite3Dialect());

dp.start();
arp.start();

//------------初始化表结构------------------

Db.update( """
CREATE TABLE IF NOT EXISTS ta (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
aid INT NOT NULL,
bid INT NOT NULL,
cid INT NOT NULL
)
""");
Db.save("ta", new Record().set("aid",2).set("bid",1).set("cid",1));

List<Record> list = Db.findAll("ta");
System.out.println(list);

//--------------重新映射Model关系---------------------

arp.stop();
arp.addMapping("ta","aid", Ta.class);
arp.start();
new Ta().set("aid",2).set("bid",1).set("cid",1).save();

List<Ta> all = Ta.dao.findAll();
System.out.println(all);

dp.stop();

xinyin025

2023-09-21 14:37

@杜福忠 将sqlite-jdbc改为3.7.2,用你的这段代码,运行正常。但更新到最新的3.43.0版本的jdbc库,就运行不了,可能SQLite最新的jdbc库做了什么调整。

xinyin025

2023-09-21 14:54

@JFinal 我使用最新的sqlite-jdbc库,3.43.0.0版本,使用JDBC进行读写操作,可以正常插入数据、查询数据,但用ActiveRecord来读写,出现只能读,不能插入数据的问题,Gitee上代码也同步了一份,希望能起到帮助作用。

热门反馈

扫码入社