功能:
根据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. 【网摘】C#中TransactionScope的使用方法和原理

    时间 2013-08-12 19:59:34  51CTO推荐博文 原文  http://cnn237111.blog.51cto.com/2359144/1271600 在.net 1.1的时代,还 ...

  2. DevOps实例

    DevOps实例 ------------------------------------------------------------------ 今天先到这儿,希望对您DevOPS, 技术领导力 ...

  3. DRDS分布式SQL引擎—执行计划介绍

    摘要: 本文着重介绍 DRDS 执行计划中各个操作符的含义,以便用户通过查询计划了解 SQL 执行流程,从而有针对性的调优 SQL. DRDS分布式SQL引擎 — 执行计划介绍 前言 数据库系统中,执 ...

  4. windows系统 docker + swoole 操作

    之前文章讲过在windows系统安装 cgywin 从而安装swoole扩展的操作,但是安装cgywin的时候会出现这样那样的问题.所以今天记录下另一种方式使用docker 安装 swoole 环境! ...

  5. vue 单文件组件中样式加载

    在写单文件组件时,一般都是把标签.脚本.样式写到一起,这样写个人感觉有点不够简洁,所以就想着把样式分离出去. 采用import加载样式 在局部作用域(scoped)采用@import加载进来的样式文件 ...

  6. git创建分支并提交到远程分支

    来自:https://www.cnblogs.com/bluestorm/p/6252900.html 侵删 git branch(分支命令的使用http://hbiao68.iteye.com/bl ...

  7. win10 64位IIS链接32位ACCESS数据库

    window10中IIS运行.asp文件链接数据库时出现错误,显示“An error occurred on the server when processing the URL. Please co ...

  8. 一起学Android之GridView

    本文以一个简单的小例子,简述Android开发中GridView的常见应用,仅供学习分享使用. 概述 GiridView是一个表格显示资源的控件,可以在两个可滚动的方向上显示.列表项的资源会通过Lis ...

  9. IntentService原理分析

    IntentService是一个异步处理请求的服务,通过Context#startService(Intent)可以将请求发送给IntentService,IntentService在工作线程中依次串 ...

  10. 通过 Sqoop1.4.7 将 Mysql5.7、Hive2.3.4、Hbase1.4.9 之间的数据导入导出

    目录 目录 1.什么是 Sqoop? 2.下载应用程序及配置环境变量 2.1.下载 Sqoop 1.4.7 2.2.设置环境变量 2.3.设置安装所需环境 3.安装 Sqoop 1.4.7 3.1.修 ...