Tutorial cuatro de mybatis (instrucción SQL dinámica)

Declaración SQL dinámica MyBatis

En términos generales, las sentencias SQL dinámicas de mybatis tienen principalmente las siguientes categorías:

  1. declaración if (juicio condicional simple)
  2. Choose (when, otherwize), equivalente a cambiar en lenguaje java, es muy similar a elegir en jstl.
  3. recortar (agregar prefijo, o sufijo, etc., prefijo, sufijo al contenido incluido)
  4. where (utilizado principalmente para simplificar el juicio de la condición where en la declaración sql, se puede manejar y / o inteligentemente, no se preocupe por la redundancia que resulte en errores gramaticales)
  5. set (utilizado principalmente al actualizar)
  6. foreach (especialmente útil al implementar mybatis en una consulta de declaración)

Si

Lo que suele hacer el SQL dinámico es incluir condicionalmente parte de la cláusula where. como:

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE state = ‘ACTIVE’ 
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

Esta declaración proporciona una función de tipo de búsqueda de texto opcional. Si no se pasa "título", se devolverán todos los BLOG en el estado "ACTIVO"; de lo contrario, si se pasa "título", se devolverán los resultados del BLOG de la búsqueda aproximada del contenido de "título".

elegir, cuando, de lo contrario

A veces, no queremos usar todas las declaraciones condicionales, solo queremos elegir una o dos. En respuesta a esta situación, MyBatis proporciona al elegir elemento, que es un poco como la sentencia switch en Java.

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

recortar, donde, establecer

Los ejemplos anteriores han resuelto adecuadamente un notorio problema de SQL dinámico. Ahora considere volver al ejemplo "si", esta vez también estableceremos "ACTIVE = 1" como una condición dinámica para ver qué sucede.

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE 
  <if test="state != null">
    state = #{state}
  </if> 
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>

¿Qué pasa si ninguna de estas condiciones puede coincidir? Eventualmente, este SQL se volverá así:

SELECT * FROM BLOG
WHERE

Esto hará que la consulta falle. ¿Qué pasa si solo coincide la segunda condición? Este SQL terminará así:

SELECT * FROM BLOG
WHERE 
AND title like ‘yiibai.com’

MyBatis tiene un proceso simple, que es útil en el 90% de los casos. Y en lugares que no se pueden usar, puede personalizar el método de procesamiento para que funcione correctamente. Una simple modificación puede obtener el efecto deseado:

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  <where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

El elemento where sabe insertar la cláusula "WHERE" solo cuando más de una condición if tiene un valor. Además, si el contenido final comienza con "Y" u "O", el elemento where también sabe cómo eliminarlos.
Si el elemento where no sigue el patrón normal, aún podemos personalizar la función que queramos personalizando el elemento de recorte. Por ejemplo, el elemento de recorte personalizado equivalente al elemento where es:

<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>

El atributo prefixOverrides ignora la secuencia de texto separada por barras verticales (tenga en cuenta que los espacios en este ejemplo también son necesarios). El resultado es que se eliminará todo el contenido especificado en el atributo prefixOverrides y se insertará el contenido especificado en el atributo prefix. Una solución similar para las declaraciones de actualización dinámica se llama set. El elemento de conjunto se puede utilizar para incluir dinámicamente columnas que deben actualizarse, dejando otras fuera. como:

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

Aquí, el elemento set precederá dinámicamente a la palabra clave SET y también eliminará las comas superfluas, porque después de que se use la instrucción condicional, es probable que estas comas se queden atrás de la instrucción de asignación generada.
Si está interesado en cómo se ve el elemento de recorte personalizado equivalente, entonces esta debería ser su verdadera cara:

<trim prefix="SET" suffixOverrides=","> ... </trim>

para cada

Otra operación común y necesaria del SQL dinámico es la necesidad de atravesar una colección, generalmente al construir declaraciones condicionales IN . como:

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

La función del elemento foreach es muy poderosa, le permite especificar una colección, declarar elementos de colección y variables de índice que se pueden usar en el cuerpo del elemento . También le permite especificar la cadena para abrir y cerrar coincidencias y colocar separadores en medio de la iteración. Este elemento es muy inteligente, por lo que no agrega separadores adicionales accidentalmente. Tenga en cuenta que puede pasar una instancia de Lista o una matriz como un objeto de parámetro a MyBatis. Cuando haga esto, MyBatis lo envolverá automáticamente en un Mapa y usará el nombre como clave. Las instancias de lista tendrán "lista" como clave, y las instancias de matriz tendrán "matriz" como clave.

Supongo que te gusta

Origin blog.csdn.net/weixin_43278644/article/details/87861008
Recomendado
Clasificación