可以被用来定义可重用的 SQL 代码段用法

2021-10-08 14:55:20 浏览数 (1)

可以被用来定义可重用的 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>

0 人点赞