Java技术研究

MyBatis

2018-11-19  本文已影响0人  晨曦诗雨

Mapper XML文件只有几个第一类元素(按照它们应该被定义的顺序):

选择属性

image.png

插入,更新和删除属性

image.png

参数

在所有过去的陈述中,您已经看到了简单参数的示例。参数是MyBatis中非常强大的元素。对于简单的情况,可能有90%的情况,对他们来说并不多,例如:

<select id = “selectUsers” resultType = “User” >     选择ID,用户名,密码  来自用户 其中id =#{id} </select >

上面的示例演示了一个非常简单的命名参数映射。parameterType设置为 int,因此参数可以命名为any。原始或简单数据类型(如 Integer和String)没有相关属性,因此将完全替换参数的完整值。但是,如果传入复杂对象,则行为会略有不同。例如:

 <insert id = “insertUser” parameterType = “User” >  
 插入用户(id,用户名,密码)
 值(#{id},#{username},#{password})
 </insert>

如果将User类型的参数对象传递到该语句,则将查找id,username和password属性,并将其值传递给PreparedStatement参数。
将参数传递给语句非常简单。但是参数映射还有很多其他功能。
首先,与MyBatis的其他部分一样,参数可以指定更具体的数据类型。

#{属性,java类型= INT,jdbcType为NUMERIC}

与MyBatis的其余部分一样,javaType几乎总是可以从参数对象中确定,除非该对象是HashMap。然后java类型,应规定以确保正确的类型处理器使用。

注意如果将null作为值传递,则JDBC对所有可为空的列都需要JDBC类型。您可以通过阅读PreparedStatement.setNull()方法的JavaDoc来自行调查。

要进一步自定义类型处理,还可以指定特定的TypeHandler 类(或别名),例如:

#{年龄,java类型= INT,jdbcType为数值型,类型控制器= MyTypeHandler}

所以它似乎已经变得冗长,但事实是你很少会设置任何这些。

对于数字类型,还有一个numericScale用于确定相关的小数位数。

#{高度,java类型=双,jdbcType为NUMERIC,numericScale = 2}

最后,mode属性允许您指定INOUTINOUT参数。如果参数是 OUTINOUT,则参数对象属性的实际值将会更改,就像您调用输出参数时所期望的那样。如果mode = OUTINOUTjdbcType = CURSOR(即Oracle REFCURSOR),则必须指定resultMap以将ResultSet ** 映射参数的类型。
请注意,
javaType属性在此处是可选的,它将自动设置为ResultSet中如果留空用CURSORjdbc类型**。

 #{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生成PreparedStatement属性并根据PreparedStatement参数安全地设置值(例如?)。虽然这更安全,更快速且几乎总是首选,但有时您只想将未修改的字符串直接注入SQL语句。例如,对于ORDER BY,您可以使用以下内容:

 ORDER BY $ { columnName }

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

注意接受来自用户的输入并以这种方式将其提供给未经修改的语句是不安全的。这会导致潜在的SQL注入攻击,因此您应该禁止在这些字段中输入用户,或者始终执行自己的转义和检查。

上一篇 下一篇

猜你喜欢

热点阅读