• BIZ中model.getSql源码分析


    功能:
    根据model.xml文件中配置的sql,获取对应的动态sql结果。

    实例代码:
    String sql1 = model.getSql(dao.dbMeta());
    String sql2 = model.getSql(paramsMap, dao.dbMeta());
    String sql3 = model.getSql(sqlName, paramsMap, dao.dbMeta());
    String sql4 = model.getSql(sqlName, dao.dbMeta());

    #if(${engId}) AND t.ENG_ID = :engId #end

    1. sql1直接根据hbm获取对应实体查询
    2. sql2将paramsMap中的参数替换到sql1获取的sql(目前这个方法存在疑问,待详细研究)
    3. 从hbm中获取sqlName的sql,将其中#if(${engId}) 。。#end 等字符串,按照${}中的内容与model与paramsMap中的值进行比较,如果${}的值为true,则将#if(${engId}) 。。#end中间部分内容添加到初始的sql中。
    4. 与3类似,但是传参更简单,直接通过model进行传参。一般如果model中不存在该名称的参数,会使用3中实例化一个map进行赋值。

    源码分析,以model.getSql(sqlName, dao.dbMeta())为例:

    public final String getSql(String id, DbMeta dbMeta){
    String sql = a(id, dbMeta);
    try {
    Map m = BeanUtils.describe(this);
    sql = a(sql, m, dbMeta);
    } catch(Exception e) {
    e.printStackTrace();
    }
    return sql;
    }

    String sql = a(id, dbMeta);
    String id: sqlName
    DbMeta dbMeta : 数据源对应数据库类型的方言
    private String a(String id, DbMeta dbMeta) {
    //判断传入id参数是否为空,如果为空的话,调用另一个重载方法
    if (id == null || id.equals("")) {
    return a(dbMeta);
    }
    String key = "default";
    //如果dbMeta不为空,将数据库类型转成小写oracle
    if (dbMeta != null) {
    key = dbMeta.getDbType().toLowerCase();
    }
    key = key + "_" + id;
    String sql = Mapping.getSql(key, getClass());
    if (sql == null || "".equals(sql)) {
    key = "default_" + id;
    sql = Mapping.getSql(key, getClass());
    }
    return sql;
    }
    Map m = BeanUtils.describe(this);
    BeanUtils 是 Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作。它可以给JavaBean封装一个字符串数据,也可以将一个表单提交的所有数据封装到JavaBean中。
    this是指的调用类本身,将model及对应属性值转成map格式
    sql = a(sql, m, dbMeta);

    private String a (String sql, Map m, DbMeta dbMeta) {
    //这里调用getSqlUtil()方法,通过反射或者调用工厂类方法实例化,
    BaseSqlUtil sqlUtil = sqlUtil.getSqlUtil();
    sqlUtil.setDbMeta(dbMeta);
    m = ((Map)(m == null ? (Map)(new HashMap()) : m));
    m.put("sqlUtil", sqlUtil);
    return TemplateLoader.evaluate(sql, m);
    }

    //com.chinasofti.ro.bizframework.core.template.TemplateLoader.java
    //模板渲染
    private static VelocityConfigurer a;
    public void setVelocityConfigurer(VelocityConfigurer velocityConfigurer) {
    a = velocityConfigurer;
    }
    public static String evaluate (String template, Map model) {
    StringWriter result;
    VelocityContext velocityContext = new VelocityContext(model);
    result = new StringWriter();
    try {
    //调用VelocityEngine类,返回的就是讲velocity语法替换后的sql
    a.getVelocityEngine().evaluate(velocityContext, result, "", template);
    }catch (Exception e) {
    e.printStackTrace();
    }
    return result.toString();
    }
    velocity

  • 相关阅读:
    Head First 设计模式 --11 代理模式
    spring-boot启动信息中non-fatal error
    在eclipse中用gradle搭建MapReduce项目
    ubuntu14.04 Hadoop单机开发环境搭建MapReduce项目
    Android log日志
    Android studio编译之后显示中文乱码的问题解决办法
    Android官方文档
    Android应用程序中应用图标和名字的设置
    转:java提取图片中的像素
    Android手机开机自动启动
  • 原文地址:https://www.cnblogs.com/chuanqiMa/p/10782990.html
Copyright © 2020-2023  润新知