单个参数
#{变量名} 取出实参值
多个参数:会被封装成一个map
取值:#{param1},#{param2}....
也可以使用注解不适用paramN来获取
map的key:@param("id")
key:指定值@param("id")
value:#{指定的key}(#{id})
pojo:
如果多个参数正好是业务逻辑的数据模型,我们为您剋以直接传入pojo
#{属性名} 取出传入的pojo属性值
map:如果多个参数不是业务逻辑中的参数没有对应的pojo,为了方便我们也可以传入map
#{key} 取出map中对应的参数
如果多个参数不是业务模型中的数据,但是经常使用,推荐来编写一个To(Transfer Object)数据传输对象
page{
int index;
int size;
}
=======================例子========================
public Emp getEmp(@param("id")integer id,String name);
取值:id===》 #{id/param1} name===》#{param2}
public Emp getEmp(integer id,@param{"e"} Emp emp);
取值: id===>#{param1} name===> #{e.name/param2.name}
如果是Collection,list,set,类型或者是数组也会特别处理,把传入的list或者集合封装在map中
他们的key: Collection(collection),List(list),Array(array)
public Emp getEmpbyid(List<Integer> ids);
取值:取出其中的一个id#{list(0)}
===============================结合mabatis源码===================
没有源码的我,直接省略
====================属性取值======================
#{}:可以获取map中的值,或者pojo对象属性的值
${}:可以获取map中的值,或者pojo对象属性的值
区别:
#{}是以预编译的形式将参数设置到sql语句中,preparedStament
${}是直接将取到的值拼接到sql语句中,会有安全问题
原生sql不支持展位符我们就可以用${}进行取值 ,比如表名,排序等
·大多数情况下我们取参数的值都应该用#{}
#{}更丰富的用法:
规定参数的一些规则
javaType,jdbcType,mode(存储过程) ,numericScale
resultMap,typeHandler,jdbcTypeName, expression(未来准备支持的功能)
jdbcType:通常在某种特定的条件下设置
在数据为null时,有些数据库不能识别mybatis不能识别对null的默认处理,比如Oracle(报错)
oracle报错:jdbcType other 无效的列类型,因为mybatis对所有的null都映射成原生的jdbc的other类型,oracle不识别
mysql可以解析
由于全局配置中:jdbcTypeofNull = otherType
解决办法:
1.可以在mapping.xml中配置:ename =#{ename,jdbcType=NULL}
2.也可以再全局中去配置
<settings>
<setting name="jdbcTypeForNull" value="Null"></setting>
</settings>
#{变量名} 取出实参值
多个参数:会被封装成一个map
取值:#{param1},#{param2}....
也可以使用注解不适用paramN来获取
map的key:@param("id")
key:指定值@param("id")
value:#{指定的key}(#{id})
pojo:
如果多个参数正好是业务逻辑的数据模型,我们为您剋以直接传入pojo
#{属性名} 取出传入的pojo属性值
map:如果多个参数不是业务逻辑中的参数没有对应的pojo,为了方便我们也可以传入map
#{key} 取出map中对应的参数
如果多个参数不是业务模型中的数据,但是经常使用,推荐来编写一个To(Transfer Object)数据传输对象
page{
int index;
int size;
}
=======================例子========================
public Emp getEmp(@param("id")integer id,String name);
取值:id===》 #{id/param1} name===》#{param2}
public Emp getEmp(integer id,@param{"e"} Emp emp);
取值: id===>#{param1} name===> #{e.name/param2.name}
如果是Collection,list,set,类型或者是数组也会特别处理,把传入的list或者集合封装在map中
他们的key: Collection(collection),List(list),Array(array)
public Emp getEmpbyid(List<Integer> ids);
取值:取出其中的一个id#{list(0)}
===============================结合mabatis源码===================
没有源码的我,直接省略
====================属性取值======================
#{}:可以获取map中的值,或者pojo对象属性的值
${}:可以获取map中的值,或者pojo对象属性的值
区别:
#{}是以预编译的形式将参数设置到sql语句中,preparedStament
${}是直接将取到的值拼接到sql语句中,会有安全问题
原生sql不支持展位符我们就可以用${}进行取值 ,比如表名,排序等
·大多数情况下我们取参数的值都应该用#{}
#{}更丰富的用法:
规定参数的一些规则
javaType,jdbcType,mode(存储过程) ,numericScale
resultMap,typeHandler,jdbcTypeName, expression(未来准备支持的功能)
jdbcType:通常在某种特定的条件下设置
在数据为null时,有些数据库不能识别mybatis不能识别对null的默认处理,比如Oracle(报错)
oracle报错:jdbcType other 无效的列类型,因为mybatis对所有的null都映射成原生的jdbc的other类型,oracle不识别
mysql可以解析
由于全局配置中:jdbcTypeofNull = otherType
解决办法:
1.可以在mapping.xml中配置:ename =#{ename,jdbcType=NULL}
2.也可以再全局中去配置
<settings>
<setting name="jdbcTypeForNull" value="Null"></setting>
</settings>