功能:
根据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

BIZ中model.getSql源码分析的更多相关文章

  1. Spring中Bean命名源码分析

    Spring中Bean命名源码分析 一.案例代码 首先是demo的整体结构 其次是各个部分的代码,代码本身比较简单,不是我们关注的重点 配置类 /** * @Author Helius * @Crea ...

  2. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  3. Netty中的ChannelPipeline源码分析

    ChannelPipeline在Netty中是用来处理请求的责任链,默认实现是DefaultChannelPipeline,其构造方法如下: private final Channel channel ...

  4. Springboot中注解@Configuration源码分析

    Springboot中注解@Configuration和@Component的区别 1.先说结论,@Configuration注解上面有@Component注解,所以@Component有的功能@Co ...

  5. DRF中的APIView源码分析

    首先写一个简单的drf接口 from rest_framework.views import APIView from rest_framework.response import Response ...

  6. Java并发包中CyclicBarrier的源码分析和使用

    CyclicBarrier的介绍和源码分析 CyclicBarrier的字母意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫做同步点)时被阻塞 ...

  7. redux中的compose源码分析

    1. redux中compose用来组合各种中间件来实现链式调用,例子如下 compose( applyMiddleware, devTools, persistState, createStore ...

  8. java集合中的HashMap源码分析

    1.hashMap中的成员分析 transient Node<K,V>[] table; //为hash桶的数量 /** * The number of key-value mapping ...

  9. Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)

    本文转载 https://www.javadoop.com 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.c ...

随机推荐

  1. 操作Work、Excel、PDF

    操作Work.Excel.PDF 1.NPOI插件 namespace XBLRDiff.BLL.Excel {      public class ExcelImport:IDisposable   ...

  2. 纯CSS打造淘宝导航菜单栏

    店铺装修-PC端-基础页-首页-装修页面:编辑“菜单”模块-显示设置,粘贴如下CSS: /* 导航条背景色*/ .skin-box-bd .menu-list{background: none rep ...

  3. OO第二单元总结

    这一单元作业是围绕电梯调度进行展开,并引进了多线程的概念.与第一次作业比较类似,作业难度也是逐渐推进,从最开始的单部电梯先来先服务(傻瓜式调度),到之后的单部电梯可稍带调度,到最后的多部电梯分楼层调度 ...

  4. 命令模式 Command 行为型 设计模式(十八)

    命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...

  5. jsp内置对象-config对象

    1.概念:config对象中存储了一些Servlet初始化的数据结构,当Servlet初始化时,JSP容器通过config对象将这些信息传递给这个Servlet.一般在web.xml文件中配置Serv ...

  6. 第七课 路径与列表 html5学习2

    1.路径 一.相对路径1.同级路径2.下级路径 /3.上级路径 ../上一级路径 ../../上两级二.绝对路径 2.列表 列表特点;整齐.整洁.有序 一.无序列表语法格式<ul> < ...

  7. SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案

    SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案 [业务场景] 采购部门与ERP咨询公司签订了一个框架协议,只规定不同级别顾问的人天费用,不限定这些不同级别咨询顾问的具体采购的人天数,但 ...

  8. Android View的重绘过程之Draw

    博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲,测量,布局,绘画现在我们分析绘画部分测量和布局 在前两篇文章中已经分析过了.不了解的可以去我的博客 ...

  9. QT中使用google breakpad捕获程序崩溃异常

    今天给大家介绍一个在linux下如何捕获程序崩溃异常的方法 一.google breakpad源码的下载和编译 1.https://github.com/google/breakpad.git,源码地 ...

  10. rocketmq简单消息发送

    有以下3种方式发送RocketMQ消息 可靠同步发送 reliable synchronous 可靠异步发送 reliable asynchronous 单向发送 one-way transmissi ...