MyBatis的XML文件(二)--参数(Parameters)

来源:互联网 发布:火影忍者手办淘宝 编辑:程序博客网 时间:2024/06/01 09:32

  • 参数Parameters

参数(Parameters)

  前面的所有语句中,你见到的都是简单参数的例子,实际上参数是MyBatis非常强大的元素,对于简单的做法,大概90%的情况参数都很少,比如

    <select id = "selectUsers" resultType = "User">        SELECT id,username,password         FROM users        WHERE id = #{id}    </select>

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

    <insert id = "insertUser" parameterType = "User">        INSERT INTO users             (id,username,password)        VALUES            (#{id},#{username},#{password})    </insert>

   如果User类型的参数对象传递到了语句中,id,username,password属性将会被查找,然后将它们的值传入预处理语句的参数中。
    这点对于向语句中传参是比较好的而且又简单,不过参数映射的功能远不止于此。
  首先,像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}    #{middlelnitial,jdbcType=VARCHAR}    #{lastName}

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

    ORDER BY ${columnName }

  这里MyBatis不会修改或转义字符串。
注:以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的SQL注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。

阅读全文
0 0