企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # `#和$`区别 ![](https://img.kancloud.cn/47/86/4786acc3a902dde1fc4e34d61e7f94d6_1133x367.png) `${value}`是statement对象的字符串拼接 `#{value}`是PrepatedStatement的对象占位符 `${value}`适合那些不支持占位符的地方 比如分表 ~~~ select * from ${year}_salary where xxx; ~~~ # 参数处理 参数也可以指定一个特殊的数据类型: ~~~ #{property, javaType=int, jdbcType=NUMERIC} #{height, javaType=double, jdbcType=NUMERIC, numericScale=2} ~~~ * javaType通常可以从参数对象中去确定 * 如果null被当做值来传递,对于所有可能为空的列,jdbcType需要被设置,有些数据库不能识别mybatis的null的默认处理就要设置 * 对于数值类型,还可以设置小数点后保留的位数 * mode属性允许指定in,out或inout参数.如果参数为out或inout,参数对象属性的真实值将会被改变,就像在获取输出参数时所期望的那样 `jdbcType OTHER`: 无效的类型,因为mybatis对于所有的null都映射的是原生JDBC的OTHER,oracle不认 **比如oracle** 由于默认全局配置中`jdbcTypeForNull=OTHER`,oracle不支持 第一种方法: ~~~ select * from user where id = #{id} and username = #{username, jdbcType=NULL} ~~~ 第二种方法: 可以在SqlMapConfig.xml中的settings配置,就可以 ~~~ <settings> <setting name="jdbcTypeForNull" value="NULL" /> </settings> ~~~ oracle和mysql都支持这种 **参数位置支持的属性 ** javaType、jdbcType、mode(存储过程)、numericScale、resultMap、typeHandler、jdbcTypeName、expression(OGNL表达式)