|
| 1 | +# table-to-json 整合 enjoy 模版模版引擎 |
| 2 | + |
| 3 | +整合 Enjoy 模板引擎到你的 Java 应用程序,尤其是在处理数据库操作和 SQL 文件管理方面,不仅能提高开发效率,还能使代码的可维护性更强。以下是一个详细的指南,包括如何配置数据库连接,如何添加和管理 SQL 文件,以及如何通过模板引擎执行查询测试。 |
| 4 | + |
| 5 | +### 为什么要整合 Enjoy 模板引擎 |
| 6 | + |
| 7 | +- **统一管理 SQL 文件**:Enjoy 模板引擎允许你将 SQL 文件放置在项目的资源目录下,通过模板引擎动态加载,这样做有助于统一管理 SQL 语句,便于维护和更新。 |
| 8 | +- **开发效率提高**:通过模板引擎支持的动态 SQL 功能,可以根据不同条件拼接不同的 SQL 片段,减少重复代码,提高开发效率。 |
| 9 | +- **提升应用性能**:Enjoy 模板引擎编译模板后缓存结果,对于重复执行的 SQL 查询,可以直接使用缓存结果,减少解析时间,提升应用性能。 |
| 10 | + |
| 11 | +### 整合指南 |
| 12 | + |
| 13 | +#### 配置数据库连接 |
| 14 | + |
| 15 | +首先,我们需要配置数据库连接。以下是一个配置示例,演示如何在 Java 应用中设置和使用 HikariCP 连接池与 PostgreSQL 数据库。 |
| 16 | + |
| 17 | +```java |
| 18 | +package com.litongjava.tio.boot.admin.config; |
| 19 | + |
| 20 | +import javax.sql.DataSource; |
| 21 | + |
| 22 | +import com.jfinal.template.Engine; |
| 23 | +import com.jfinal.template.source.ClassPathSourceFactory; |
| 24 | +import com.litongjava.jfinal.aop.annotation.AConfiguration; |
| 25 | +import com.litongjava.jfinal.aop.annotation.AInitialization; |
| 26 | +import com.litongjava.jfinal.plugin.activerecord.ActiveRecordPlugin; |
| 27 | +import com.litongjava.jfinal.plugin.activerecord.OrderedFieldContainerFactory; |
| 28 | +import com.litongjava.jfinal.plugin.activerecord.dialect.PostgreSqlDialect; |
| 29 | +import com.litongjava.jfinal.plugin.hikaricp.DsContainer; |
| 30 | +import com.litongjava.tio.boot.constatns.TioBootConfigKeys; |
| 31 | +import com.litongjava.tio.boot.server.TioBootServer; |
| 32 | +import com.litongjava.tio.utils.environment.EnvironmentUtils; |
| 33 | +import com.zaxxer.hikari.HikariConfig; |
| 34 | +import com.zaxxer.hikari.HikariDataSource; |
| 35 | + |
| 36 | +@AConfiguration |
| 37 | +public class TableToJsonConfig { |
| 38 | + |
| 39 | + public DataSource dataSource() { |
| 40 | + String jdbcUrl = EnvironmentUtils.get("jdbc.url"); |
| 41 | + String jdbcUser = EnvironmentUtils.get("jdbc.user"); |
| 42 | + |
| 43 | + String jdbcPswd = EnvironmentUtils.get("jdbc.pswd"); |
| 44 | + int maximumPoolSize = EnvironmentUtils.getInt("jdbc.MaximumPoolSize", 2); |
| 45 | + |
| 46 | + HikariConfig config = new HikariConfig(); |
| 47 | + // config |
| 48 | + config.setJdbcUrl(jdbcUrl); |
| 49 | + config.setUsername(jdbcUser); |
| 50 | + config.setPassword(jdbcPswd); |
| 51 | + config.setMaximumPoolSize(maximumPoolSize); |
| 52 | + |
| 53 | + HikariDataSource hikariDataSource = new HikariDataSource(config); |
| 54 | + |
| 55 | + // set datasource |
| 56 | + DsContainer.setDataSource(hikariDataSource); |
| 57 | + // add destroy |
| 58 | + TioBootServer.me().addDestroyMethod(hikariDataSource::close); |
| 59 | + return hikariDataSource; |
| 60 | + |
| 61 | + } |
| 62 | + |
| 63 | + /* |
| 64 | + * |
| 65 | + * config ActiveRecordPlugin |
| 66 | + */ |
| 67 | + @AInitialization |
| 68 | + public void activeRecordPlugin() throws Exception { |
| 69 | + // get dataSource |
| 70 | + DataSource dataSource = dataSource(); |
| 71 | + // get env key |
| 72 | + String property = EnvironmentUtils.get(TioBootConfigKeys.APP_ENV); |
| 73 | + |
| 74 | + // create arp |
| 75 | + ActiveRecordPlugin arp = new ActiveRecordPlugin(dataSource); |
| 76 | + arp.setContainerFactory(new OrderedFieldContainerFactory()); |
| 77 | + if ("dev".equals(property)) { |
| 78 | + arp.setDevMode(true); |
| 79 | + } |
| 80 | + |
| 81 | + arp.setDialect(new PostgreSqlDialect()); |
| 82 | + |
| 83 | + // config engine |
| 84 | + Engine engine = arp.getEngine(); |
| 85 | + //devMode下修改sql文件无需重启 |
| 86 | + engine.setDevMode(EnvironmentUtils.isDev()); |
| 87 | + //设置sql文件路径 |
| 88 | + engine.setSourceFactory(new ClassPathSourceFactory()); |
| 89 | + //添加压缩 |
| 90 | + engine.setCompressorOn(' '); |
| 91 | + engine.setCompressorOn('\n'); |
| 92 | + // add sql file |
| 93 | + arp.addSqlTemplate("/sql/all_sql.sql"); |
| 94 | + // start |
| 95 | + arp.start(); |
| 96 | + |
| 97 | + // add stop |
| 98 | + TioBootServer.me().addDestroyMethod(arp::stop); |
| 99 | + } |
| 100 | +} |
| 101 | +``` |
| 102 | + |
| 103 | +#### 添加 SQL 文件 |
| 104 | + |
| 105 | +在你的项目资源目录( |
| 106 | + |
| 107 | +`src/main/resources/sql`)下添加 SQL 文件。首先创建一个名为 `all_sql.sql` 的文件,该文件用于包含其他 SQL 文件。 |
| 108 | + |
| 109 | +`all_sql.sql` 示例: |
| 110 | + |
| 111 | +```sql |
| 112 | +#include("user.sql") |
| 113 | +``` |
| 114 | + |
| 115 | +接着,创建 `user.sql` 文件,该文件中定义了具体的 SQL 语句。 |
| 116 | + |
| 117 | +`user.sql` 示例: |
| 118 | + |
| 119 | +```sql |
| 120 | +#namespace("user") |
| 121 | + #sql("adminUser") |
| 122 | + SELECT * FROM tio_boot_admin_system_users WHERE ID = 1 AND deleted = 0 |
| 123 | + #end |
| 124 | + #sql("getUserById") |
| 125 | + SELECT * FROM tio_boot_admin_system_users WHERE ID = ? AND deleted = 0 |
| 126 | + #end |
| 127 | +#end |
| 128 | +``` |
| 129 | + |
| 130 | +#### 查询测试 |
| 131 | + |
| 132 | +最后,进行查询测试,以验证整合是否成功。以下是测试用例的示例代码: |
| 133 | + |
| 134 | +```java |
| 135 | +package com.litongjava.tio.boot.admin.services; |
| 136 | + |
| 137 | +import com.litongjava.jfinal.plugin.activerecord.Db; |
| 138 | +import com.litongjava.jfinal.plugin.activerecord.DbTemplate; |
| 139 | +import com.litongjava.jfinal.plugin.activerecord.Record; |
| 140 | +import com.litongjava.jfinal.plugin.activerecord.SqlPara; |
| 141 | +import com.litongjava.tio.boot.admin.config.TableToJsonConfig; |
| 142 | +import com.litongjava.tio.boot.tesing.TioBootTest; |
| 143 | +import org.junit.BeforeClass; |
| 144 | +import org.junit.Test; |
| 145 | + |
| 146 | +/** |
| 147 | + * Created by Tong Li <https://github.com/litongjava> |
| 148 | + */ |
| 149 | +public class UserServiceTest { |
| 150 | + |
| 151 | + @BeforeClass |
| 152 | + public static void beforeClass() { |
| 153 | + TioBootTest.before(TableToJsonConfig.class); |
| 154 | + } |
| 155 | + |
| 156 | + @Test |
| 157 | + public void adminUser() { |
| 158 | + DbTemplate template = Db.template("user.adminUser"); |
| 159 | + Record first = template.findFirst(); |
| 160 | + System.out.println(first); |
| 161 | + } |
| 162 | + |
| 163 | + @Test |
| 164 | + public void getUserById() { |
| 165 | + //template |
| 166 | + DbTemplate template = Db.template("user.getUserById"); |
| 167 | + //sqlPara 是一个包含了sql和para的对象 |
| 168 | + SqlPara sqlPara = template.getSqlPara(); |
| 169 | + sqlPara.addPara(1); |
| 170 | + //执行查询 |
| 171 | + Record first = Db.findFirst(sqlPara); |
| 172 | + System.out.println(first); |
| 173 | + } |
| 174 | +} |
| 175 | +``` |
| 176 | + |
| 177 | +output |
| 178 | + |
| 179 | +```log |
| 180 | +2024-03-28 23:33:45.549 [main] INFO c.z.h.HikariDataSource.<init>:80 - HikariPool-1 - Starting... |
| 181 | +2024-03-28 23:33:45.646 [main] INFO c.z.h.HikariDataSource.<init>:82 - HikariPool-1 - Start completed. |
| 182 | +{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:[email protected], 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} |
| 183 | +{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:[email protected], 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} |
| 184 | +``` |
| 185 | + |
| 186 | +通过上述步骤,你已经成功地将 Enjoy 模板引擎整合到你的项目中,可以享受到模板引擎带来的便利和高效性能了。 |
0 commit comments