mybatis-Parameters

Parameters

在之前的语句中,你已经看到了一些简单参数的示例。 MyBatis 中参数是非常强大的 在 元素。对于简单的做法,大概 90%的情况,是不用太多的,比如:       

<select id="selectUsers" parameterType="int" resultType="User">
  select id, username, password
  from users
  where id = #{id}
</select>

上面的这个示例说明了一个非常简单的命名参数映射。参数类型被设置为“int”,因此 这个参数可以被设置成任何内容。 原生的类型或简单数据类型,比如整型和没有相关属性的 字符串,因此它会完全用参数来替代。然而,如果你传递了一个复杂的对象,那么 MyBatis的处理方式就会有一点不同。比如:       

<insert id="insertUser" parameterType="User" >
  insert into users (id, username, password)
  values (#{id}, #{username}, #{password})
</insert>

如果 User 类型的参数对象传递到了语句中, username 和 password 属性将会被查找,id、 然后它们的值就被传递到预处理语句的参数中。       

这点对于传递参数到语句中非常好。但是对于参数映射也有一些其他的特性。       

首先,像 MyBatis 的其他部分,参数可以指定一个确定的数据类型。       

#{property,javaType=int,jdbcType=NUMERIC}

像 MyBatis 的剩余部分,javaType 通常可以从参数对象中来去顶,除非对象是一个HashMap。那么 javaType 应该被确定来保证使用正确类型处理器。       

注意 如果 null 被当作值来传递,对于所有可能为空的列,JDBC Type 是需要的。以可 以自己通过阅读预处理语句的 setNull()方法的 JavaDocs 文档来研究这个。       

为了自定义类型处理器,你可以指定一个确定的类型处理器类(或别名), 比如:       

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}

尽管它看起来繁琐,但是实际上是你很少设置它们其中之一。       

对于数值类型,对于决定有多少数字是相关的,有一个数值范围。       

#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}

最后,mode 属性允许你指定 IN,OUT 或 INOUT 参数。如果参数为 OUT 或 INOUT,参数对象属性的真实值将会被改变,就像你期望你需要你个输出参数。如果 mode 为 OUT (或 INOUT) ,而且 jdbcType 为 CURSOR(也就是 Oracle 的 REFCURSOR) ,你必须指定 一个 resultMap 来映射结果集到参数类型。要注意这里的 javaType 属性是可选的,如果左边 的空白是 jdbcType 的 CURSOR 类型,它会自动地被设置为结果集。       

#{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=departmentResultMap}

MyBatis 也支持很多高级的数据类型,比如结构体,但是当注册 out 参数时你必须告诉 语句类型名称。比如(再次提示,在实际中不要像这样换行):       

#{middleInitial, mode=OUT, jdbcType=STRUCT, jdbcTypeName=MY_TYPE, resultMap=departmentResultMap}

尽管所有这些强大的选项很多时候你只简单指定属性名,MyBatis 会自己计算剩余的。 最多的情况是你为 jdbcType 指定可能为空的列名。       

#{firstName}
#{middleInitial,jdbcType=VARCHAR}
#{lastName}
字符串替换       

默认情况下,使用#{}格式的语法会导致 MyBatis 创建预处理语句属性并以它为背景设 置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在 SQL 语 句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:       

ORDER BY ${columnName}

这里 MyBatis 不会修改或转义字符串。       

重要 接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会 导致潜在的 SQL 注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检 查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值