返回介绍

4.5 参数

发布于 2025-04-26 13:08:33 字数 2277 浏览 0 评论 0 收藏

虽然在 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 运转的正确性和安全性。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。