[MyBatis]—SQL dinámico (método del archivo de configuración)

escena:

     Cuando usamos JDBC u otros marcos similares para el desarrollo de bases de datos, generalmente necesitamos ensamblar SQL manualmente de acuerdo con las necesidades. Es algo muy doloroso de pensar, y la función de ensamblaje dinámico de declaraciones SQL proporcionada por el marco Mybatis puede ser muy conveniente Buena solución a este problema.

Visión de conjunto:

     SQL dinámico es una característica poderosa del marco MyBatis. MyBatis3 puede usar expresiones potentes basadas en OGNL para completar SQL dinámico. Elimina la mayoría de los elementos que deben entenderse en versiones anteriores y se puede completar con menos de la mitad del original. elementos trabajo requerido.

elemento SQL:

elementos SQL ilustrar
<si> Declaración de sentencia, utilizada para sentencia de rama condicional única
<elegir> (<cuando>,<de lo contrario>) Equivalente a switch... case... declaración predeterminada en Java, utilizada para el juicio de rama multicondicional
<dónde> Simplifique el juicio condicional de dónde en las declaraciones SQL
<recortar> Puede eliminar de manera flexible palabras clave redundantes
<conjunto> Resolución de sentencias de actualización dinámica
<foreach> Declaraciones de bucle, a menudo utilizadas en condiciones de enumeración, como en declaraciones
<vincular> Cree una variable a partir de una expresión OGNL y vincúlela al contexto, comúnmente utilizada en SQL para consultas difusas

<si>:

El escenario más común para usar SQL dinámico es incluir parte de una cláusula where basada en una condición

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BookMapper">

    <resultMap id="BookType" type="org.example.po.Book">
        <id property="id" column="id"></id>
        <result property="bookName" column="bookName"></result>
        <result property="price" column="price"></result>
        <result property="publisher" column="publisher"></result>
    </resultMap>

    <select id="bookSelectById" parameterType="int" resultMap="BookType">
        select * from t_book
        <where>
            <if test="id!=null and id!=''">
                id=#{id}
            </if>
        </where>
    </select>

    <select id="bookSelectByname" parameterType="string" resultMap="BookType">
        select * from t_book
        <where>
            <if test="bookNmae!=null and bookName!=''">
                bookName LIKE concat('%',#{bookName},'%')
            </if>
        </where>
    </select>

</mapper>

<elegir>:

      A veces, no queremos usar todas las condiciones, solo queremos usar una de varias condiciones. Para esta situación, MyBatis proporciona el elemento de elección, que es un poco como una declaración de cambio en Java.

Debido a que escribí una sola consulta, cité el código del sitio web oficial.

<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>

<dónde>:

     La etiqueta <where> es equivalente a where 1=1, que se usa principalmente para simplificar el juicio de la condición where en las instrucciones SQL y puede manejar inteligentemente and y o sin preocuparse por los errores de sintaxis causados ​​por palabras clave redundantes. Código de referencia <if> código de etiqueta.

<recortar>:

      Creo que esta etiqueta es la más flexible. El elemento trim también identificará automáticamente si hay un valor de retorno en su etiqueta. Si lo hay, agregará algún prefijo o sufijo al contenido incluido (primero determine si hay una declaración que contenga ), las propiedades utilizadas son

 1.    prefijo (prefijo), sufijo (sufijo)

También puede eliminar los símbolos que contienen el primer o último contenido del contenido. Los atributos utilizados son

2 , prefixOverride (cobertura de prefijo), suffixOverride (cobertura de sufijo)

Se puede decir que la función es muy poderosa y se puede usar para reemplazar el elemento where y lograr el mismo efecto que el elemento where.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BookMapper">

    <resultMap id="BookType" type="org.example.po.Book">
        <id property="id" column="id"></id>
        <result property="bookName" column="bookName"></result>
        <result property="price" column="price"></result>
        <result property="publisher" column="publisher"></result>
    </resultMap>

    <update id="bookUpdate" parameterType="book">
        UPDATE t_book
        <trim prefix="set" suffixOverrides=",">
            <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>
            <if test="price!=null and price!=''">price=#{price},</if>
            <if test="publisher!=null and publisher!=''">publisher=#{publisher}</if>
            WHERE id=#{id}
        </trim>
    </update>

</mapper>

<conjunto>:

      El elemento set se usa principalmente para operaciones de actualización. Su función principal es similar a la del elemento where. Es principalmente ingresar un conjunto antes de la declaración contenida. Si la declaración contenida termina con una coma, los paréntesis se ignorarán automáticamente . y el elemento if se puede usar para actualizar dinámicamente los campos que deben modificarse; si no es necesario cambiar los campos, ya no se pueden actualizar.

Modifique el código anterior para:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BookMapper">

    <resultMap id="BookType" type="org.example.po.Book">
        <id property="id" column="id"></id>
        <result property="bookName" column="bookName"></result>
        <result property="price" column="price"></result>
        <result property="publisher" column="publisher"></result>
    </resultMap>

    <update id="bookUpdate" parameterType="book">
        UPDATE t_book
<!--        <trim prefix="set" suffixOverrides=",">-->
<!--            <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>-->
<!--            <if test="price!=null and price!=''">price=#{price},</if>-->
<!--            <if test="publisher!=null and publisher!=''">publisher=#{publisher}</if>-->
<!--            WHERE id=#{id}-->
<!--        </trim>-->
        <set>
            <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>
            <if test="price!=null and price!=''">price=#{price},</if>
            <if test="publisher!=null and publisher!=''">publisher=#{publisher},</if>
        </set>
        WHERE id=#{id}
    </update>


</mapper>

<foreach>:

El elemento foreach generalmente se usa cuando se construye una declaración condicional, y se usa de la siguiente manera.

(1)  item : Representa el alias de cada elemento al iterar.

(2)  índice : especifique un nombre para indicar la posición de cada iteración en el proceso de iteración

(3)  open : indica con qué comienza la instrucción (la instrucción in comienza con "( ")

(4)  separador : indica que el símbolo anterior se usa como separador cada vez que se itera (la instrucción in usa "," como separador)

(5)  .close : Indica con qué termina la sentencia (la sentencia in termina con " )")

(Nota: esta apertura, separador y cierre son básicamente formatos fijos)

(6)  colección : Indica las propiedades más críticas y propensas a errores, y necesita atención especial. Este atributo debe especificarse. El valor de este atributo es diferente en diferentes casos. Hay tres casos principales:

        1) Si el parámetro de entrada es un solo parámetro y el tipo de parámetro es una lista , el valor del atributo de colección es una lista

        2) Si el parámetro de entrada es un solo parámetro y el tipo de parámetro es una matriz , el valor del atributo de colección es una matriz

        3) Si el parámetro de entrada es multiparámetro , debe encapsularse como un mapa para su procesamiento

Formato:

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

<enlace>:

   El elemento bind generalmente se usa en una declaración que requiere una consulta difusa.El elemento bind se usa para definir una variable llamada nombre_de_usuario_patrón, y el valor de atributo de valor es la cadena de consulta concatenada, donde _parámetro.getTitle() representa el parámetro pasado en (o escriba directamente el nombre de la variable del parámetro correspondiente, como nombre de usuario).

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern_username" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>

Supongo que te gusta

Origin blog.csdn.net/m0_56233309/article/details/123547225
Recomendado
Clasificación