功能:
根据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. Python 包构建教程

    目录 setuptools 和 setup.py 你所需要做的事 & 一些概念 基础概念 关于源码分发文件和二进制分发文件 示例和分发选择 pure python module package ...

  2. [Linux] deepin与nginx

    deepin Linux Deepin 是一个基于 DEB 包管理的一个独立操作系统,和那些 Ubuntu(下个大版本是基于debian开发) 的衍生版仅仅只是换主题.调整ISO预置的软件包不同.Li ...

  3. javaweb中上传视频,并且播放,用上传视频信息为例

    1.上传视频信息的jsp页面uploadVideo.jsp <body background="image/bk_hero.jpg"><div id=" ...

  4. dbutils工具类使用

    1DBUtils工具类 1.1概述 DBUtils是java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码 DBUtils三个核心功 ...

  5. 设置input中placeholder的样式(placeholder设置字体)

    方法: 代码示例: .input::-webkit-input-placeholder { font-size: 3.73333333vw; color: #cccccc; } .input:-moz ...

  6. Vue 入门之目录结构介绍

    Vue 是一套用于构建用户界面的渐进式框架,与其它大型的页面框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合.另一方面,当 ...

  7. Numpy库的学习(二)

    今天来继续学习一下Numpy库的使用 接着昨天的内容继续 在Numpy中,我们如果想要进行一个判断使用“==” 我们来看下面的代码 vector = np.array([5,10,15,20,25]) ...

  8. Java:配置环境(Mac)——MySQL

    1.官网下载 2.双击开始安装,一直下一步 用旧版的密码加密 自己写个密码,最少8位 3.测试 打开系统偏好设置 4.mysql需要在系统环境变量里 1)在终端输入mysql,没有指令说明.此时就还不 ...

  9. 织梦CMS增加复制文档功能

    打开后台目录(/dede)下archives_do.php约430行下添加: /*----------------------------- //复制文档 ---------------------- ...

  10. shell 编程初级

    shell编程的简单代码 一些基础代码 直接上代码 #!/bin/bash myUrl="gggggggg" # 只读变量设置 # readonly myUrl echo &quo ...