复制代码
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.49.1.0</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>5.2.2</version>
</dependency>
复制代码
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jetty-server</artifactId>
<version>2019.3</version>
</dependency>
复制代码
<build>
<finalName>project</finalName>
复制代码
<resources>
<resource>
<directory>src/main/webapp</directory>
<targetPath>webapp</targetPath>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<targetPath>.</targetPath>
<filtering>false</filtering>
</resource>
</resources>
复制代码
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin><!--核心打成jar包插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.ncjk.bases.config.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
复制代码
@Override
public void configPlugin(Plugins me) {
// SQLite
String url = "jdbc:sqlite:D:\\database\\ticp.sqlite";
try {
Class.forName("org.sqlite.JDBC");
LogKit.info("SQLite JDBC driver loaded successfully.");
} catch (ClassNotFoundException e) {
LogKit.error("SQLite JDBC driver not found.");
throw new RuntimeException("SQLite JDBC driver not found.", e);
}
// 配置数据库连接池
DruidPlugin druidPlugin = new DruidPlugin(url, "", "");
me.add(druidPlugin);
// 配置 ActiveRecord 插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
Sqlite3Dialect d3 = new Sqlite3Dialect();
d3.setModelBuilder(new MyModelBuilder());
d3.setRecordBuilder(new MyRecordBuilder());
arp.setDialect(d3);
me.add(arp);
_MappingKit.mapping(arp);
// 增加定时任务配置文件
me.add(new QuartzPlugin());
}
复制代码
package com.ncjk.bases.config;
import com.jfinal.plugin.activerecord.*;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
* @author
* @date 2025/7/3 13:44
* @desc
*/
@SuppressWarnings("unchecked")
public class MyRecordBuilder extends RecordBuilder {
@Override
public List<Record> build(Config config, ResultSet rs, Function<Record, Boolean> func) throws SQLException {
List<Record> result = new ArrayList<>();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String[] labelNames = new String[columnCount + 1];
int[] types = new int[columnCount + 1];
buildLabelNamesAndTypes(rsmd, labelNames, types);
while (rs.next()) {
Record record = new Record();
CPI.setColumnsMap(record, config.getContainerFactory().getColumnsMap());
Map<String, Object> columns = record.getColumns();
for (int i = 1; i <= columnCount; i++) {
Object value;
if (types[i] < Types.BLOB) {
value = rs.getObject(i);
} else {
if (types[i] == Types.CLOB) {
value = ModelBuilder.me.handleClob(rs.getClob(i));
} else if (types[i] == Types.NCLOB) {
value = ModelBuilder.me.handleClob(rs.getNClob(i));
} else if (types[i] == Types.BLOB) {
value = rs.getBytes(i);
} else {
value = rs.getObject(i);
}
}
columns.put(labelNames[i], value);
}
if (func == null) {
result.add(record);
} else {
if (!func.apply(record)) {
break;
}
}
}
return result;
}
}
复制代码
package com.ncjk.bases.config;
import com.jfinal.plugin.activerecord.CPI;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.ModelBuilder;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
* @author
* @date 2025/7/3 13:41
* @desc
*/
@SuppressWarnings("deprecation")
public class MyModelBuilder extends ModelBuilder {
@SuppressWarnings({"unchecked"})
public <T> List<T> build(ResultSet rs, Class<? extends Model> modelClass, Function<T, Boolean> func) throws SQLException, ReflectiveOperationException {
List<T> result = new ArrayList<>();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String[] labelNames = new String[columnCount + 1];
int[] types = new int[columnCount + 1];
buildLabelNamesAndTypes(rsmd, labelNames, types);
while (rs.next()) {
Model<?> ar = modelClass.newInstance();
Map<String, Object> attrs = CPI.getAttrs(ar);
for (int i=1; i<=columnCount; i++) {
Object value;
if (types[i] < Types.BLOB) {
value = rs.getObject(i);
} else {
if (types[i] == Types.CLOB) {
value = handleClob(rs.getClob(i));
} else if (types[i] == Types.NCLOB) {
value = handleClob(rs.getNClob(i));
} else if (types[i] == Types.BLOB) {
value = rs.getBytes(i);
} else {
value = rs.getObject(i);
}
}
attrs.put(labelNames[i], value);
}
if (func == null) {
result.add((T)ar);
} else {
if ( ! func.apply((T)ar) ) {
break ;
}
}
}
return result;
}
}