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
- sql1直接根据hbm获取对应实体查询
- sql2将paramsMap中的参数替换到sql1获取的sql(目前这个方法存在疑问,待详细研究)
- 从hbm中获取sqlName的sql,将其中#if(${engId}) 。。#end 等字符串,按照${}中的内容与model与paramsMap中的值进行比较,如果${}的值为true,则将#if(${engId}) 。。#end中间部分内容添加到初始的sql中。
- 与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源码分析的更多相关文章
- Spring中Bean命名源码分析
Spring中Bean命名源码分析 一.案例代码 首先是demo的整体结构 其次是各个部分的代码,代码本身比较简单,不是我们关注的重点 配置类 /** * @Author Helius * @Crea ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- Netty中的ChannelPipeline源码分析
ChannelPipeline在Netty中是用来处理请求的责任链,默认实现是DefaultChannelPipeline,其构造方法如下: private final Channel channel ...
- Springboot中注解@Configuration源码分析
Springboot中注解@Configuration和@Component的区别 1.先说结论,@Configuration注解上面有@Component注解,所以@Component有的功能@Co ...
- DRF中的APIView源码分析
首先写一个简单的drf接口 from rest_framework.views import APIView from rest_framework.response import Response ...
- Java并发包中CyclicBarrier的源码分析和使用
CyclicBarrier的介绍和源码分析 CyclicBarrier的字母意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫做同步点)时被阻塞 ...
- redux中的compose源码分析
1. redux中compose用来组合各种中间件来实现链式调用,例子如下 compose( applyMiddleware, devTools, persistState, createStore ...
- java集合中的HashMap源码分析
1.hashMap中的成员分析 transient Node<K,V>[] table; //为hash桶的数量 /** * The number of key-value mapping ...
- Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
本文转载 https://www.javadoop.com 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.c ...
随机推荐
- Mondrian + JPivot 环境配置
一.环境准备 特别说明:Mondrian + JPivot 环境笔者已整理调试通过,可直接部署运行. 1.1 环境要求 JDK1.8+ 1.2 环境包说明 从 https://pan.baidu.co ...
- 【转】IIS上的反向代理
http://blog.csdn.net/yuanguozhengjust/article/details/23576033 一直说在IIS上做反向代理,由于沉迷在nginx一行指令完事的美好情景当中 ...
- jQuery(四)、文档处理
1 内部插入 1.1 append(content | fn) 向每个匹配的元素内部追加内容. 参数: (1) content:要追加到目标中的内容. (2) function(index, html ...
- @Data注解使用后在eclipse中get/set报错解决方法
Maven项目中已经导入相关的lombok.jar包但是使用后仍提示无set/get方法 安装完成之后,请确认eclipse安装路径下是否多了一个lombok.jar包,并且其 配置文件eclipse ...
- mysql索引结构及其原理
1.定义 索引是一种数据结果,帮助提高获取数据的速度 为了提高查找速度,有很多查询优化算法.但是每种查找算法都只能应用于特定数据结构之上. 索引就是数据库创建的满足特定查找算法的数据结构,这些数据结构 ...
- Gerrit系统框架介绍
Gerrit目录介绍 转自:https://blog.csdn.net/tanshizhen119/article/details/79889242 先上图 bin/ : 主要是放gerrit.sh启 ...
- axios+Vue上传文件显示进度
一,前言 最近在用Vue,然后上传文件时需要显示进度,于是网上搜了一下,经过自己实测终于也弄明白了 二,效果 三,代码 HTML代码 <div id="app"> &l ...
- C# CAD批量转换为图片
最近写了个工具,将指定目录下的CAD文件批量转换为图片格式. 首先需要添加对应的引用 : 在AutoCAD2008的环境下对应AutoCAD 2008 Type Library 和 AutoCAD/O ...
- 海量数据,大数据处理技术--【Hbase】
- Python 强制停止多线程运行
强制停止多线程运行 by:授客 QQ:1033553122 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' ...