${}
${}在组装sql前将里面的表达式计算出来,举例子:
select * from t_user where count=${list.size}
在创建preparedStatement前就将${list.size}计算出来了,假设计算值为10,则会将sql =
"select * from t_user where count=10" 放入preparedStatement对象中.
#{}
${}在组装sql后将里面的表达式计算出来,举例子:
select * from t_user where count=${list.size}
在创建preparedStatement前就将#{list.size}替换为'?',假设计算值为10,则会将sql = "select
* from t_user where count=?"以及参数'10' 放入preparedStatement对象中.
当然了,上面这条写法是错误的,因为在mybatis源码中,有各种各样的ObjectWrapper,它们就
是专门来计算对象的属性值的,比如BeanWrapper用来调用getter方法取出对象的属性
值,MapWrapper用来取出key对应的value值,而在这里我们传入的是一个list,是一个集合,对
应的是CollectionWrapper,这个类不支持集合获取属性,所以并不是网上所说的#{}默认加了
一个引号导致了报错,这个类的源码如下:
package org.apache.ibatis.reflection.wrapper;
import java.util.Collection;
import java.util.List;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.reflection.property.PropertyTokenizer;
public class CollectionWrapper implements ObjectWrapper {
private final Collection<Object> object;
public CollectionWrapper(MetaObject metaObject, Collection<Object> object) {
this.object = object;
}
@Override
public Object get(PropertyTokenizer prop) {
throw new UnsupportedOperationException();
}
@Override
public void set(PropertyTokenizer prop, Object value) {
throw new UnsupportedOperationException();
}
@Override
public String findProperty(String name, boolean useCamelCaseMapping) {
throw new UnsupportedOperationException();
}
@Override
public String[] getGetterNames() {
throw new UnsupportedOperationException();
}
@Override
public String[] getSetterNames() {
throw new UnsupportedOperationException();
}
@Override
public Class<?> getSetterType(String name) {
throw new UnsupportedOperationException();
}
@Override
public Class<?> getGetterType(String name) {
throw new UnsupportedOperationException();
}
@Override
public boolean hasSetter(String name) {
throw new UnsupportedOperationException();
}
@Override
public boolean hasGetter(String name) {
throw new UnsupportedOperationException();
}
@Override
public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory) {
throw new UnsupportedOperationException();
}
@Override
public boolean isCollection() {
return true;
}
@Override
public void add(Object element) {
object.add(element);
}
@Override
public <E> void addAll(List<E> element) {
object.addAll(element);
}
}