ApiTable 整合 enjoy 模版引擎
整合 Enjoy 模板引擎到你的 Java 应用程序,尤其是在处理数据库操作和 SQL 文件管理方面,不仅能提高开发效率,还能使代码的可维护性更强。以下是一个详细的指南,包括如何配置数据库连接,如何添加和管理 SQL 文件,以及如何通过模板引擎执行查询测试。
为什么要整合 Enjoy 模板引擎
- 统一管理 SQL 文件:Enjoy 模板引擎允许你将 SQL 文件放置在项目的资源目录下,通过模板引擎动态加载,这样做有助于统一管理 SQL 语句,便于维护和更新。
- 开发效率提高:通过模板引擎支持的动态 SQL 功能,可以根据不同条件拼接不同的 SQL 片段,减少重复代码,提高开发效率。
- 提升应用性能:Enjoy 模板引擎编译模板后缓存结果,对于重复执行的 SQL 查询,可以直接使用缓存结果,减少解析时间,提升应用性能。
整合指南
配置数据库连接
首先,我们需要配置数据库连接。以下是一个配置示例,演示如何在 Java 应用中设置和使用 HikariCP 连接池与 PostgreSQL 数据库。
package com.litongjava.tio.boot.admin.config;
import javax.sql.DataSource;
import com.jfinal.template.Engine;
import com.jfinal.template.source.ClassPathSourceFactory;
import com.litongjava.jfinal.aop.annotation.AConfiguration;
import com.litongjava.jfinal.aop.annotation.AInitialization;
import com.litongjava.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.litongjava.jfinal.plugin.activerecord.OrderedFieldContainerFactory;
import com.litongjava.jfinal.plugin.activerecord.dialect.PostgreSqlDialect;
import com.litongjava.jfinal.plugin.hikaricp.DsContainer;
import com.litongjava.tio.boot.constatns.TioBootConfigKeys;
import com.litongjava.tio.boot.server.TioBootServer;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@AConfiguration
public class DbConfig {
public DataSource dataSource() {
String jdbcUrl = EnvUtils.get("jdbc.url");
String jdbcUser = EnvUtils.get("jdbc.user");
String jdbcPswd = EnvUtils.get("jdbc.pswd");
int maximumPoolSize = EnvUtils.getInt("jdbc.MaximumPoolSize", 2);
HikariConfig config = new HikariConfig();
// config
config.setJdbcUrl(jdbcUrl);
config.setUsername(jdbcUser);
config.setPassword(jdbcPswd);
config.setMaximumPoolSize(maximumPoolSize);
HikariDataSource hikariDataSource = new HikariDataSource(config);
// set datasource
DsContainer.setDataSource(hikariDataSource);
// add destroy
TioBootServer.me().addDestroyMethod(hikariDataSource::close);
return hikariDataSource;
}
/*
*
* config ActiveRecordPlugin
*/
@AInitialization
public void activeRecordPlugin() throws Exception {
// get dataSource
DataSource dataSource = dataSource();
// get env key
String property = EnvUtils.get(TioBootConfigKeys.APP_ENV);
// create arp
ActiveRecordPlugin arp = new ActiveRecordPlugin(dataSource);
arp.setContainerFactory(new OrderedFieldContainerFactory());
if ("dev".equals(property)) {
arp.setDevMode(true);
}
arp.setDialect(new PostgreSqlDialect());
// config engine
Engine engine = arp.getEngine();
//devMode下修改sql文件无需重启
engine.setDevMode(EnvUtils.isDev());
//设置sql文件路径
engine.setSourceFactory(new ClassPathSourceFactory());
//添加压缩
engine.setCompressorOn(' ');
engine.setCompressorOn('\n');
// add sql file
arp.addSqlTemplate("/sql/all_sql.sql");
// start
arp.start();
// add stop
TioBootServer.me().addDestroyMethod(arp::stop);
}
}
添加 SQL 文件
在你的项目资源目录(
src/main/resources/sql
)下添加 SQL 文件。首先创建一个名为 all_sql.sql
的文件,该文件用于包含其他 SQL 文件。
all_sql.sql
示例:
#include("user.sql")
接着,创建 user.sql
文件,该文件中定义了具体的 SQL 语句。
user.sql
示例:
#namespace("user")
#sql("adminUser")
SELECT * FROM tio_boot_admin_system_users WHERE ID = 1 AND deleted = 0
#end
#sql("getUserById")
SELECT * FROM tio_boot_admin_system_users WHERE ID = ? AND deleted = 0
#end
#end
查询测试
最后,进行查询测试,以验证整合是否成功。以下是测试用例的示例代码:
package com.litongjava.tio.boot.admin.services;
import com.litongjava.jfinal.plugin.activerecord.Db;
import com.litongjava.jfinal.plugin.activerecord.DbTemplate;
import com.litongjava.jfinal.plugin.activerecord.Record;
import com.litongjava.jfinal.plugin.activerecord.SqlPara;
import com.litongjava.tio.boot.admin.config.DbConfig;
import com.litongjava.tio.boot.tesing.TioBootTest;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Created by Tong Li <https://github.com/litongjava>
*/
public class UserServiceTest {
@BeforeClass
public static void beforeClass() {
TioBootTest.before(DbConfig.class);
}
@Test
public void adminUser() {
DbTemplate template = Db.template("user.adminUser");
Record first = template.findFirst();
System.out.println(first);
}
@Test
public void getUserById() {
//template
DbTemplate template = Db.template("user.getUserById");
//sqlPara 是一个包含了sql和para的对象
SqlPara sqlPara = template.getSqlPara();
sqlPara.addPara(1);
//执行查询
Record first = Db.findFirst(sqlPara);
System.out.println(first);
}
}
output
2024-03-28 23:33:45.549 [main] INFO c.z.h.HikariDataSource.<init>:80 - HikariPool-1 - Starting...
2024-03-28 23:33:45.646 [main] INFO c.z.h.HikariDataSource.<init>:82 - HikariPool-1 - Start completed.
{id:1, username:admin, password:8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918, nickname:admin, signature:This is a signature, title:Admin, group_name:Administrators, tags:{"tags": [{"key": "tag1", "label": "Tag 1"}, {"key": "tag2", "label": "Tag 2"}]}, notify_count:10, unread_count:5, country:United States, access:admin, geographic:{"province": {"label": "California", "key": "CA"}, "city": {"label": "San Francisco", "key": "SF"}}, address:123 Main St, San Francisco, CA 94122, remark:管理员, dept_id:103, post_ids:[1], email:aoteman@126.com, mobile:15612345678, sex:1, avatar:http://127.0.0.1:48080/admin-api/infra/file/4/get/37e56010ecbee472cdd821ac4b608e151e62a74d9633f15d085aee026eedeb60.png, status:0, login_ip:127.0.0.1, login_date:2023-11-30 09:16:00.0, creator:admin, create_time:2021-01-05 17:03:47.0, updater:null, update_time:2024-03-23 08:49:55.0, tenant_id:1}
{id:1, username:admin, password:8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918, nickname:admin, signature:This is a signature, title:Admin, group_name:Administrators, tags:{"tags": [{"key": "tag1", "label": "Tag 1"}, {"key": "tag2", "label": "Tag 2"}]}, notify_count:10, unread_count:5, country:United States, access:admin, geographic:{"province": {"label": "California", "key": "CA"}, "city": {"label": "San Francisco", "key": "SF"}}, address:123 Main St, San Francisco, CA 94122, remark:管理员, dept_id:103, post_ids:[1], email:aoteman@126.com, mobile:15612345678, sex:1, avatar:http://127.0.0.1:48080/admin-api/infra/file/4/get/37e56010ecbee472cdd821ac4b608e151e62a74d9633f15d085aee026eedeb60.png, status:0, login_ip:127.0.0.1, login_date:2023-11-30 09:16:00.0, creator:admin, create_time:2021-01-05 17:03:47.0, updater:null, update_time:2024-03-23 08:49:55.0, tenant_id:1}
通过上述步骤,你已经成功地将 Enjoy 模板引擎整合到你的项目中,可以享受到模板引擎带来的便利和高效性能了。