jfinal enjoy模板&enjoy sql 完整入门

用途

用于渲染需要多次重复的sql以及程序代码,相比较于mybatis组装模块,这种方式更灵活,可以用于组件其他的数据库、脚本语言脚本。

入门示例

取自文件

import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import java.util.HashMap;
import java.util.Map;
public class EnjoyTemplateDemo {
    public static void main(String[] args) {
        // 创建模板引擎实例
        Engine engine = Engine.create("myEngine");
        // 设置模板文件加载的基础路径(这里假设模板文件放在resources目录)
        engine.setBaseTemplatePath("src/main/resources");
        // 准备数据
        Map<String, Object> data = new HashMap<>();
        data.put("users", new String[]{"Alice", "Bob", "Charlie", "David"});
        // 获取模板对象
        Template template = engine.getTemplate("template.html");
        // 渲染模板
        String output = template.renderToString(data);
        System.out.println(output);
    }
}

template.html是Enjoy模板文件,应该放在src/main/resources目录下:

#(for user in users)
    <p>用户名称: #(user)</p>
#(end)

取自字符串

import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import java.util.HashMap;
import java.util.Map;
public class EnjoyTemplateFromStringDemo {
    public static void main(String[] args) {
        // 创建模板引擎实例
        Engine engine = Engine.use();
        // 准备模板内容
        String templateContent = "#(for user in users)\n    用户名称: #(user)\n#(end)";
        // 准备数据
        Map<String, Object> data = new HashMap<>();
        data.put("users", new String[]{"Alice", "Bob", "Charlie", "David"});
        // 使用模板内容创建模板对象
        Template template = engine.getTemplateByString(templateContent);
        // 渲染模板并输出结果
        String output = template.renderToString(data);
        System.out.println(output);
    }
}

进阶用途

  1. 基于sql各种元素不确定的组装场景

    • sql模板

      #sql("aggregate_dim_custom_goods_insert")
      insert into t_material_prepare
      select
          #(selectColumns)
      from
          #(fromClause)
      where  #(whereCondition)
          group by #(groupBy)
      #end
      
    • sql模板初始化

      @Configuration
      @Slf4j
      public class JFinalConfig {
      
          private final DataSource dataSource;
      
          public JFinalConfig(DataSource dataSource) {
              this.dataSource = dataSource;
          }
      
          @Bean
          public ActiveRecordPlugin activeRecordPlugin() throws SQLException {
              ActiveRecordPlugin arp = new ActiveRecordPlugin(dataSource);
      //        arp.setShowSql(true);
              // 打印当前数据库的连接配置
              String dbURL = dataSource.getConnection().getMetaData().getURL();
              log.info("Database configuration: {}", dbURL);
              arp.setDialect(new MysqlDialect()); // 根据使用的数据库调整方言
              arp.addSqlTemplate("sql/preview.sql");
              arp.start();
              return arp;
      
          }
      
    • java渲染

      String groupByField = nReturnField + COMMA + aggregateField;
      String nSelectField = StrUtil.join(COMMA_BLANK, materialId, nReturnField, EMPTY_STR, nReturnFieldStr, N, aggregateField);
      Kv nParams = Kv.by("selectColumns", nSelectField)
          .set("fromClause", "t_goods_dim")
          .set("whereCondition", nCondition)
          .set("groupBy", groupByField);
      SqlPara aggregateDimCustomGoodsInsert = Db.getSqlPara("aggregate_dim_custom_goods_insert", nParams);
      int updateCnt = Db.update(aggregateDimCustomGoodsInsert);
      info("Insert Rows: {}", updateCnt);
      
  2. 基于sql条件不确定类似于sql占位符的场景

    • sql模板

      #sql("hit_goods_cnt")
      select count(detail_data) as hit_cnt from  t_material_prepare where material_id = #para(materialId)
      #end
      
    • java 渲染

      String materialId="";
      Kv conf = Kv.by("materialId",materialId);
      SqlPara hitGoodsCnt = Db.getSqlPara("hit_goods_cnt", conf);
      Record first = Db.findFirst(hitGoodsCnt);
      Long hitCnt = first.getLong("hit_cnt");
      

总结: 大的区别在于你的使用场景,是用于条件值的传入还是sql语句关键元素的拼接,如果是前者则使用的是Enjoysql的使用标准(#para(0)或者#para(col)),而后者则是enjoy模板的场景#(col)。

posted @ 2024-04-21 18:12  唐钰逍遥  阅读(516)  评论(0)    收藏  举报