4.5 参数
虽然在 MyBatis 中参数大部分是像上面所描述的那样简单,但是我们还是有必要讨论一下参数的使用。我们可以通过制定参数的类型去让对应的 typeHandler 处理它们,如果你不记得 typeHandler 的用法,请复习下第 3 章。通过指定对应的 JdbcType、JavaType 我们可以明确使用哪个 typeHandler 去处理参数,或者制定一些特殊的东西,但是这里要强调的一点是:定义参数属性的时候,MyBatis 不允许换行!
4.5.1 参数配置
正如你们所看到的,我们可以传入一个简单的参数,比如 int、double 等,也可以传入 JavaBean,这些我们都讨论过。有时候我们需要处理一些特殊的情况,我们可以指定特定的类型,以确定使用哪个 typeHandler 处理它们,以便我们进行特殊的处理。
#{age,javaType=int,jdbcType=NUMERIC}
当然我们还可以指定用哪个 typeHandler 去处理参数。
#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}
此外,我们还可以对一些数值型的参数设置其保存的精度。
#{price,javaType=double,jdbcType=NUMERIC,numericScale=2}
可见 MyBatis 映射器可以通过 EL 的功能帮助完成我们所需要的多种功能,使用还是很方便的。
4.5.2 存储过程支持
对于存储过程而言,存在 3 种参数,输入参数(IN)、输出参数(OUT)、输入输出参数(INOUT)。MyBatis 的参数规则为其提供了良好的支持。我们通过制定 mode 属性来确定其是哪一种参数,它的选项有 3 种:IN、OUT、INOUT。当参数设置为 OUT,或者为 INOUT 的时候,正如你所希望的一样,MyBatis 会将存储过程返回的结果设置到你制定的参数中。当你返回的是一个游标(也就是我们制定 JdbcType=CURSOR)的时候,你还需要去设置 resultMap 以便 MyBatis 将存储过程的参数映射到对应的类型,这时 MyBatis 就会通过你所设置的 resuptMap 自动为你设置映射结果。
#{role,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=roleResultMap}
这里的 javaType 是可选的,即使你不指定它,MyBatis 也会自动检测它。
MyBatis 还支持一些高级特性,比如说结构体,但是当注册参数的时候,你就需要去指定语句类型的名称(jdbcTypeName),比方说下面的用法。
#{role,mode=OUT,jdbcType=STRUCT,jdbcTypeName=MY_TYPE,resultMap=droleResultMap}
在大部分的情况下 MyBatis 都会去推断你返回数据的类型,所以大部分情况下你都无需去配置参数类型和结果类型。要我们设置的往往只是可能返回为空的字段类型而已。因为 null 值,MyBatis 无法判断其类型。
#{roleNo}, #{roleName}, #{note, jdbcType=VARCHAR}
对于备注而言,可能是返回为空的,用 jdbcType=VARCHAR 明确告知 MyBatis,让它被 StringTypeHandler 处理即可。
这里我们暂时不给出调度过程和方法,我们会在第 9 章实用场景中对调度存储过程进行探讨,届时可以关注它们的使用。
4.5.3 特殊字符串替换和处理(#和$)
在 MyBatis 中,我们常常传递字符串,我们设置的参数#(name)在大部分的情况下 MyBatis 会用创建预编译的语句,然后 MyBatis 为它设值,而有时候我们需要的是传递 SQL 语句的本身,而不是 SQL 所需要的参数。例如,在一些动态表格(有时候经常遇到根据不同的条件产生不同的动态列)中,我们要传递 SQL 的列名,根据某些列进行排序,或者传递列名给 SQL 都是比较常见的场景,当然 MyBatis 也对这样的场景进行了支持,这些是 Hibernate 难以做到的。
例如,在程序中传递变量 columns="col1,col2,col3..."给 SQL,让其组装成为 SQL 语句。我们当然不想被 MyBatis 像处理普通参数一样把它设为"col1,col2,col3...",那么我们就可以写成如下语句。
select ${columns} from t_tablename
这样 MyBatis 就不会帮我们转译 columns,而变为直出,而不是作为 SQL 的参数进行设置了。只是这样是对 SQL 而言是不安全的,MyBatis 给了你灵活性的同时,也需要你自己去控制参数以保证 SQL 运转的正确性和安全性。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论