深入剖析

Mybatis3.4.x技术内幕(十八):Mybatis之动态Sql设计原本(下)

无人久伴 提交于 2019-11-28 12:55:49
上一篇博文中,简要介绍了Mybatis动态sql的基本用法和基本设计结构,本篇博文重点阐述一些动态sql的技术细节, #{name}和${name}的区别 ,将在本篇博文中揭晓。也许读者早已了解它们之间的区别,但是,作为技术内幕,我们不仅要了解它们的区别,还要介绍它们的工作原理,是不是很开森呢? 1. #{name}和${name}的区别。 #{name}:表示这是一个参数(ParameterMapping)占位符,值来自于运行时传递给sql的参数,也就是XXXMapper.xml里的parameterType。其值通过PreparedStatement的setObject()等方法赋值。 动态sql中的<bind>标签绑定的值,也是使用#{name}来使用的。 #{name}用在sql文本中。 ${name}:表示这是一个属性配置占位符,值来自于属性配置文件,比如jdbc.properties,其值通过类似replace方法进行静态替换。比如${driver},将被静态替换为com.mysql.jdbc.Driver。 ${name}则可以用在xml的Attribute属性,还可以用在sql文本当中。 <select id="countAll" resultType="${driver}"> select count(1) from ( select stud_id as

Mybatis3.4.x技术内幕(十七):Mybatis之动态Sql设计原本(上)

匆匆过客 提交于 2019-11-28 12:55:32
上一篇博文中,介绍了可复用的sql片段,通过<include>标签进行引入,而<include>标签内一般存放的是静态sql,其实,sql片段也是可以放置动态sql标签内容。 1. Mybatis支持的动态sql及基本用法 org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.nodeHandlers(String)部分源码。 NodeHandler nodeHandlers(String nodeName) { Map<String, NodeHandler> map = new HashMap<String, NodeHandler>(); map.put("trim", new TrimHandler()); map.put("where", new WhereHandler()); map.put("set", new SetHandler()); map.put("foreach", new ForEachHandler()); map.put("if", new IfHandler()); map.put("choose", new ChooseHandler()); map.put("when", new IfHandler()); map.put("otherwise", new OtherwiseHandler(