可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。比如:
代码语言:javascript复制<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from some_table t1
inner join some_table t2
</select>
参数(Parameters)
这不是一个顶级元素,但很重要。 默认情况下,使用#{}格式的语法会导致 MyBatis 创建预处理语句属性并安全地设置值(比如?)。这样做更安全,更迅速,通常也是首选做法。 比如:
代码语言:javascript复制<insert id="insertUser" parameterType="User">
insert into users (id, username, password)
values (#{id}, #{username}, #{password})
</insert>
如果 User 类型的参数对象传递到了语句中,id、username 和 password 属性将会被查找,然后将它们的值传入预处理语句的参数中。你也可以
代码语言:javascript复制#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}
但其实你只需要简单指定属性名,其他的事情 MyBatis 会自己去推断,最多你需要为可能为空的列名指定 jdbcType。
代码语言:javascript复制#{firstName}
#{middleInitial,jdbcType=VARCHAR}
字符串替换 不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:
代码语言:javascript复制ORDER BY ${columnName}
这里 MyBatis 不会修改或转义字符串。 **注意:这种方式是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验(即将输入中的特殊字符转义处理,比如"&"→ "&", "<"→"<"," "→" "。
Result Maps
resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西。 ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句只需要描述它们的关系。 当应用程序使用 JavaBeans 或 POJOs(Plain Old Java Objects,普通 Java 对象)来作为领域模型,大部分可以省略 resultMap,MyBatis 会在幕后自动创建一个 ResultMap,基于属性名来映射列到 JavaBean 的属性上。 要记住类型别名是你的伙伴。使用它们你可以不用输入类的全路径。
代码语言:javascript复制<!-- In mybatis-config.xml file -->
<typeAlias type="com.someapp.model.User" alias="User"/>
<!-- In SQL Mapping XML file -->
<select id="selectUsers" resultType="User">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>