Mybatis3.4.x技术内幕(十八):Mybatis之动态Sql设计原本(下)
上一篇博文中,简要介绍了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