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

原文地址:https://www.cnblogs.com/chuanqiMa/p/10782990.html