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 模板引擎整合到你的项目中,可以享受到模板引擎带来的便利和高效性能了。