`

myBatis3之SQL映射的XML文件(Parameters)

阅读更多

myBatis3之SQL映射的XML文件(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类型的参数对象传递到了语句中,id,username和password属性将会被查找,然后它们的值就被传递到预处理

语句的参数中。这点对于传递参数到语句中非常好。但是对于参数映射也有一些其他的特性。 首先,参数可以指定一个确定的数据类型。如: 

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

javaType被确定来保证使用正确类型处理器。如果null被当作值来传递,对于所有可能为空的列,JDBC Type是需要的。为了自定义类型处理器,你可以指定一个确定的类型处理器类(或别名),比如:

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

尽管它看起来繁琐,但是实际上是你很少设置它们其中之一。 对于数值类型,对于决定有多少数字是相关的,有一个数值范围。

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

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

#{firstName} 
#{middleInitial,jdbcType=VARCHAR} 
#{lastName} 

 

 

字符串替换

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

ORDER BY ${columnName} 

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

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics