- 浏览: 127481 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (145)
- java (145)
- Java网络编程 (1)
- SWT 文本框Text通过GC重绘改变边框颜色 (1)
- tomcat部署web工程的两种方法 (1)
- JAX-RS 从傻逼到牛叉 1:REST 基础知识 (1)
- FreyjaJdbcTemplate 大致上完工了,想请人重构。。 (1)
- 开始认识自己 (1)
- 设计模式-Abstract Factory 模式 (1)
- 数据库中主键的设计原则 (1)
- JNI中jstring类型与c语言中的字符串的转换 (1)
- mac环境变量 (1)
- STC单片机ADC转换的例子 (1)
- myeclipse 8下安装Ibator . (1)
- OSGI与Android结合 (1)
- CSDN BLOG EXPERT (1)
- Java中网络操作的开源库CommonsNet (1)
- Apache License Version 2.0 英文内容及中文翻译 (1)
- JTest (1)
- GeoCon 用C#编写的开源的地理信息数据转换工具 (1)
- ERP简易教程 (1)
- 提高站点在搜索引擎上的排名 (1)
- Wifi (1)
- 腾讯Q+开放平台,相信又是一次成功的模仿 (1)
- C#坦克大战网络版代码 (1)
- Problem16 (1)
- Ajax 应该变成 Ajaj (关于JSON 与 XML 的比较) (1)
- ava框架数据库连接池比较(c3p0 (1)
- dbcp和proxool)bonecp (1)
- 继续向成熟男人靠拢 (1)
- Qt4.7中 默认的构造函数 (1)
- xml CDATA (1)
- 只针对中英文混合分词的中文分词器 (1)
- 典型相关分析及其适用范围和spss操作(转) (1)
- llvm (1)
- java连接数据库Oracle|DB2|Sql Server|Sybase|Informix|MySQL||PostgreSQL|access (1)
最新评论
-
xm3530:
什么鬼?都没法看,发出来干嘛
Android中利用App实现消息推送机制的代码实例 -
lvtenglongxiaohei:
太经典了!
学习一下!
ERP简易教程 -
lvtenglongxiaohei:
<br> 一天中午,丈 ...
ERP简易教程 -
hzw2312:
加油~~~!!!
开始认识自己 -
123048591:
显示乱码
tomcat部署web工程的两种方法
mybatis的这个类比较精巧,适合被“拿来用”,还是稍微分析下,也许能有点收获。
mybatis中的sqlbuilder是用来处理java程序动态拼接sql操作的,把我们从以前需要注意空格或者or,and,where等关键字处理中解脱出来,这个类设计的比较精巧,而且不依赖其他的类或者包,很适合移植到自己的项目中去,所以分离出来对其源码进行解读和改造。
首先,它用一个threadlocal对象来存储sql对象(表达sql的实体对象),这个东西我觉得表明:你可以以函数工具的方式操作它,同时,你也可以用你的dao来继承这个类,并不用担心线程安全的问题。
这个类里面定义了一个私有静态类 sql,这个类有一个statementtype的枚举对象,如下:
然后有以下类型语句集合,存储不同sql语句段,如下
你肯定想象的到,会有selectsql,insertsql,deletesql,updatesql这四个方法,分别为你返回对应的sql语句。这几个等会会详细讲解
还有一个sql()方法,通过statementtype枚举来返回你想要的xxxxsql()。
最后还有个比较重要的方法,sqlclause,这个方法通过你传入的语句/类型,为你构造sql,代码如下:
这个方法参数意思如下:
其实从参数就可以看出此方法的设计意图了。
首先builder拼接关键字,然后拼接闭合(开头)字符,在拼接第二个开始,判断是
否是and 和or关键字,这两个关键字在sqlbuilder上面会有定义成静态变量
private static final string and = ") \nand (";
private static final string or = ") \nor (";
假如是,则直接拼接,不是,则拼接多项分隔符。
最后,拼接闭合(结尾)字符,返回。
下面我们看看那四个方法(selectsql,insertsql,deletesql,updatesql)是怎样调用他们的,以selectsql为例:如下
这个sql静态类最终是为sqlbuilder来提供服务的,而sqlbuilder则暴露出我们需要的接口,提供传值的入口,我们以调用者的角度来看看sqlbuilder是怎样工作的。
一般来说,我们程序里是这样调用的:
begin的时候会new一个sql()对象放入当前线程变量threadlocal,
在select,from,where,orderby这些操作的时候会调用sql对象的相关list来进行add动作,构造list。最后从当前线程变量中取出sql对象,调用sql方法,返回。
假如值需要构造select语句,那么还有个精简版的selectbuilder可以选择。
一点思考,
mybatis中的sqlbuilder是用来处理java程序动态拼接sql操作的,把我们从以前需要注意空格或者or,and,where等关键字处理中解脱出来,这个类设计的比较精巧,而且不依赖其他的类或者包,很适合移植到自己的项目中去,所以分离出来对其源码进行解读和改造。
首先,它用一个threadlocal对象来存储sql对象(表达sql的实体对象),这个东西我觉得表明:你可以以函数工具的方式操作它,同时,你也可以用你的dao来继承这个类,并不用担心线程安全的问题。
这个类里面定义了一个私有静态类 sql,这个类有一个statementtype的枚举对象,如下:
public enum statementtype { delete, insert, select, update}分别表示增删改查操作。
然后有以下类型语句集合,存储不同sql语句段,如下
list<string> sets = new arraylist<string>(); list<string> select = new arraylist<string>(); list<string> tables = new arraylist<string>(); list<string> join = new arraylist<string>(); list<string> innerjoin = new arraylist<string>(); list<string> outerjoin = new arraylist<string>(); list<string> leftouterjoin = new arraylist<string>(); list<string> rightouterjoin = new arraylist<string>(); list<string> where = new arraylist<string>(); list<string> having = new arraylist<string>(); list<string> groupby = new arraylist<string>(); list<string> orderby = new arraylist<string>(); list<string> lastlist = new arraylist<string>(); list<string> columns = new arraylist<string>(); list<string> values = new arraylist<string>(); boolean distinct;包含了几乎所有的sql关键字
你肯定想象的到,会有selectsql,insertsql,deletesql,updatesql这四个方法,分别为你返回对应的sql语句。这几个等会会详细讲解
还有一个sql()方法,通过statementtype枚举来返回你想要的xxxxsql()。
最后还有个比较重要的方法,sqlclause,这个方法通过你传入的语句/类型,为你构造sql,代码如下:
private void sqlclause(stringbuilder builder, string keyword, list<string> parts, string open, string close, string conjunction) { if (!parts.isempty()) { if (builder.length() > 0) builder.append("\n"); builder.append(keyword); builder.append(" "); builder.append(open); string last = "________"; for (int i = 0, n = parts.size(); i < n; i++) { string part = parts.get(i); if (i > 0 && !part.equals(and) && !part.equals(or) && !last.equals(and) && !last.equals(or)) { builder.append(conjunction); } builder.append(part); last = part; } builder.append(close); } }
这个方法参数意思如下:
- builder:当前待拼接的sql语句。
- keyword:关键字,如select,from,join,inner join,having,where等等这些。
- parts:就是相对应的上面的那些list对象,比如select,join等等,传递你需要拼接的实际sql内容。
- open,close:就是此语句开始和结尾的闭合字符,比如select,form,join等这个肯定都是“”,而where和having这个肯定就是“(”和“)”
- conjunction:多个关键字语句中间的连接串,比如说select,from,group by,order by这些的多个语句块都是“, ”连接的,比如select a.name,a.pid ,order by a.id,b.id等。
- 而join多个表肯定是有多个join,left out join 后面肯定也会是left out join,where 多个肯定是 and 连接的(这里不考虑or,因为已经有or这个关键方法来表示)。
其实从参数就可以看出此方法的设计意图了。
首先builder拼接关键字,然后拼接闭合(开头)字符,在拼接第二个开始,判断是
否是and 和or关键字,这两个关键字在sqlbuilder上面会有定义成静态变量
private static final string and = ") \nand (";
private static final string or = ") \nor (";
假如是,则直接拼接,不是,则拼接多项分隔符。
最后,拼接闭合(结尾)字符,返回。
下面我们看看那四个方法(selectsql,insertsql,deletesql,updatesql)是怎样调用他们的,以selectsql为例:如下
private string selectsql() { stringbuilder builder = new stringbuilder(); if (distinct) { sqlclause(builder, "select distinct", select, "", "", ", "); } else { sqlclause(builder, "select", select, "", "", ", "); } sqlclause(builder, "from", tables, "", "", ", "); sqlclause(builder, "join", join, "", "", "join"); sqlclause(builder, "inner join", innerjoin, "", "", "\ninner join "); sqlclause(builder, "outer join", outerjoin, "", "", "\nouter join "); sqlclause(builder, "left outer join", leftouterjoin, "", "", "\nleft outer join "); sqlclause(builder, "right outer join", rightouterjoin, "", "", "\nright outer join "); sqlclause(builder, "where", where, "(", ")", " and "); sqlclause(builder, "group by", groupby, "", "", ", "); sqlclause(builder, "having", having, "(", ")", " and "); sqlclause(builder, "order by", orderby, "", "", ", "); return builder.tostring(); }
这个sql静态类最终是为sqlbuilder来提供服务的,而sqlbuilder则暴露出我们需要的接口,提供传值的入口,我们以调用者的角度来看看sqlbuilder是怎样工作的。
一般来说,我们程序里是这样调用的:
public string selectbypro() { begin(); select("p.id,p.username,p.password"); select("p.createdate,p.modifydate"); from("person p"); from("account a"); inner_join("dept d on d.id=p.id"); inner_join("company c on c.id=d.id"); where("p.id=a.id"); where("p.name like '%afei%'"); or(); where("p.sex = '1'"); group_by("p.id"); having("p.age > 20"); order_by("p.id"); order_by("p.name"); return sql();}
begin的时候会new一个sql()对象放入当前线程变量threadlocal,
在select,from,where,orderby这些操作的时候会调用sql对象的相关list来进行add动作,构造list。最后从当前线程变量中取出sql对象,调用sql方法,返回。
假如值需要构造select语句,那么还有个精简版的selectbuilder可以选择。
一点思考,
- 1, 你可以把这些方法或属性放入你的基础dao里面,不用担心线程安全的问题,这是最佳实践。
- 2, 当作工具类来用,但是这样影响代码的可读性。
- 3, 这个类里面的方法都不是同步的,而是操作了一个线程安全的变量,这样可以避免多线程在调用这个类的不同方法时被迫同步的情况。
发表评论
-
java连接数据库Oracle|DB2|Sql Server|Sybase|Informix|MySQL||PostgreSQL|access
2012-02-08 14:17 1058<div>Java数据库连接(JDBC)由 ... -
llvm
2012-02-07 16:29 880llvm ... -
典型相关分析及其适用范围和spss操作(转)
2012-02-07 15:43 1583看文章《科学学研 ... -
只针对中英文混合分词的中文分词器
2012-02-03 10:39 1013该版本说明 1、只针对中英文混合分词 需要一些中文和 ... -
xml CDATA
2012-02-03 08:45 1210<h2 style="font-si ... -
Qt4.7中 默认的构造函数
2012-02-01 09:14 1088<p><span style=&qu ... -
继续向成熟男人靠拢
2012-01-11 17:04 879转自徒儿的人人。 ... -
ava框架数据库连接池比较(c3p0,dbcp和proxool)bonecp
2012-01-11 14:13 1135<h1 style="text ... -
Ajax 应该变成 Ajaj (关于JSON 与 XML 的比较)
2011-12-28 15:23 963<span style="font- ... -
Problem16
2011-12-28 12:53 668package com.shui.mu.yao.io. ... -
C#坦克大战网络版代码
2011-12-20 13:09 983简单C#坦克大战网络版代码 写完单机版 http ... -
腾讯Q+开放平台,相信又是一次成功的模仿
2011-12-20 10:44 861今天看到两则新 ... -
Wifi
2011-12-19 13:14 1086. Confirm if Wifi is On ... -
提高站点在搜索引擎上的排名
2011-12-19 12:04 937对于拥有网站的各位站长来说,都希望自己的站点能够在各种 ... -
ERP简易教程
2011-12-16 16:47 922注明:下面的帖子 ... -
GeoCon 用C#编写的开源的地理信息数据转换工具
2011-12-14 12:29 956<p class="MsoNorma ... -
JTest
2011-12-14 09:00 1029接到parasoft公司一位先生打来的电话,说下个月第 ... -
Apache License Version 2.0 英文内容及中文翻译
2011-12-13 12:59 2338</span> <p class= ... -
Java中网络操作的开源库CommonsNet
2011-12-13 12:39 817<p class="MsoNorma ... -
CSDN BLOG EXPERT
2011-12-13 08:59 1094<img src="http://p. ...
相关推荐
mybatis SQL日志解析;查看日志时mybatis打印的日志查询条件以及参数不是拼接好的,想复制对应sql在本地执行时比较麻烦,通过前端编写页面进行日志解析,拼接sql中的问号以及参数变课轻松实现
MyBatis是一款基于Java的持久层框架,提供了强大的数据库访问能力,能够与多种数据库管理系统集成,包括MySQL、Oracle、SQL Server等。MyBatis的主要特点是使用XML文件或注解来定义数据库访问的映射关系,从而屏蔽了...
《MyBatis源码详解学习》是一份专为对MyBatis源码感兴趣的开发者准备的资料,它旨在帮助读者深入理解这个流行持久层框架的工作原理。MyBatis作为一个轻量级的ORM(对象关系映射)框架,因其简单易用、高度可定制化的...
总结起来,MyBatis源码分析涵盖了从配置加载到数据库操作的全过程,涉及到了配置解析、SQL执行、结果映射等多个关键环节,以及Executor、StatementHandler等核心组件。通过深入学习MyBatis的源码,开发者不仅可以...
标题 "mybatissql_mybatis解决sql注入" 暗示了我们正在讨论MyBatis框架如何处理SQL注入问题。SQL注入是一种常见的安全漏洞,攻击者可以通过恶意输入篡改SQL查询,获取、修改或删除数据库中的敏感数据。MyBatis,作为...
在MyBatis-Plus源码中,我们可以看到如何实现这些功能,例如,条件构造器是如何通过反射和OGNL表达式解析来动态构建SQL的,BaseMapper和BaseService是如何协同工作的,以及如何通过AutoFillMetaObjectHandler自动...
MyBatis 源码解析:通过源码深入理解 SQL 的执行过程 抓下来打包成了HTML文件, 方便离线观看
该工具可以将mybatis输出的sql日志提取出来,并将其格式化为可以直接执行的sql语句,节约开发人员时间
Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用...
mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码mybatis核心源码...
MyBatis分页插件的工作原理是动态插入SQL,它会在执行查询语句之前,根据数据库类型(如MySQL或Oracle)动态生成合适的分页SQL。例如,对于MySQL,它会将原SQL语句转换为带有LIMIT和OFFSET的分页SQL;对于Oracle,...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在深入探讨MyBatis 3.4.1的源码之前,先了解一下MyBatis的基本概念和工作原理。 MyBatis的核心是SqlSessionFactory,它是通过...
MyBatis-SQL-Dialect是MyBatis框架的一个扩展,主要目的是为了支持不同数据库系统之间的SQL方言差异。MyBatis是一个流行的Java持久层框架,它允许开发者将SQL语句直接集成到XML或Java代码中,提供了灵活的数据访问层...
通过阅读源码,我们可以了解到MyBatis-Plus是如何将用户操作转化为SQL语句的,以及它是如何处理各种数据库交互细节的。这对于理解框架的工作原理、优化数据库操作和进行二次开发都具有重要的参考价值。同时,学习...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在3.0.4版本中,MyBatis提供了一系列关键功能,帮助开发者更高效地处理数据库操作。以下是对`mybatis-3.0.4源码`的详细解析。 一、...
标题中的“Spring+SpringMVC+Mybatis框架整合源码”指的是一个基于Java的Web开发项目,它结合了三个主流的开源框架:Spring、SpringMVC和Mybatis,以实现高效且灵活的企业级应用开发。这三种框架在Java世界中扮演着...
MyBatis是一款优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射,极大地简化了传统Java开发中的数据库操作。SQLServer是微软公司推出的关系型数据库管理系统,广泛应用于企业级应用开发。本教程将通过...
MyBatis For .NET 源码 开源项目iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。iBATIS提供的...
SpringMVC、Mybatis和SQLServer是Java Web开发中常见的技术栈,它们分别负责不同的职责。SpringMVC作为Spring框架的一部分,是用于构建Web应用程序的模型-视图-控制器(MVC)架构。Mybatis是一个轻量级的持久层框架...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java...