Conversión forzada de tipos de campos en mybatis_if_

manifestación

Por ejemplo, ¿crees que en el siguiente código, si el tipo pasa el valor 2, la ecuación se cumple o no?

<if test="type == '2'">

El código detallado es el siguiente:
xml:

<select id="selectByUserNameTest" resultMap="BaseResultMap">
  SELECT * FROM `sys_user`
  WHERE is_delete = 0
  <if test="type == '2'">
    and is_delete = 1
  </if>
</select>

mapeador:

 SysUser selectByUserNameTest(Integer type); 

prueba:

@Test
    public void ssss() {
    
    

    getAscii('2');
    sysUserMapper.selectByUserNameTest(2);
    System.out.println(1);
}

La respuesta no es cierta, mira el resultado:
imagen.png
el sql en la ecuación no se ejecuta.
La razón es que Java es una transformación fuerte. En la comparación, los tipos de campo en ambos lados de la ecuación deben ajustarse para que sean iguales para que coincidan. El '2' aquí se considera un tipo de carácter, pero el tipo que se pasa es es un tipo numérico, por lo que si no puede coincidir, Java realizará una conversión forzada en este momento. El carácter '2' se convertirá en un valor de código ASCII (la comparación de caracteres es la comparación de ASCII). Aquí vemos que el valor ascii de '2' es 50, por lo que la expresión final se convierte en 2== 50, por lo que la ecuación no se mantendrá. En este momento, si el tipo pasa el valor 50, la ecuación se mantendrá.
imagen.png

Expandir 1

<if test="type == '22'">

Si el tipo también es numérico, el valor es 22 y la ecuación no se mantendrá.
cambia uno primero

<if test="type == 22">

¿Será esto cierto? La respuesta es definitivamente sí. Debido a que 22 en el segundo es claramente un tipo numérico, la respuesta es definitivamente verdadera.
Pero el tipo del primer '22' aún no está fijado. Se determina en función de los parámetros pasados ​​en el lado izquierdo de la ecuación. Los anteriores son números. Esto se debe a que el lado derecho de la ecuación se convertirá en un tipo numérico La respuesta también es Lo mismo es cierto.
Si el tipo es una cadena, la respuesta también es válida, porque se convertirá a un tipo de cadena para compararla más adelante.

Expansión 2

Como en el primer ejemplo, si el tipo pasa una cadena "50", la ecuación también es verdadera. Después de que se fuerza a Java a realizar la conversión, el valor ascll se convierte en la cadena "50".
imagen.png
imagen.png

Expansión 3

Aunque Java nos ayudará a forzar la transferencia, no se puede transferir todo, por ejemplo:

<if test="type == 'aa'">

type pasa un tipo numérico y el 'aa' anterior informará una excepción debido a una conversión forzada:
imagen.png

pregunta

También he visto estas situaciones e hice algunos resúmenes, pero todavía no conozco las reglas para la transferencia forzada de java en mybatis. Con respecto al ejemplo anterior, hay otro punto que no está muy claro: en mybaitis, la conversión obviamente se basa en los parámetros, pero ¿por qué el carácter '2' en la demostración no se convierte en una cadena o un número? Sea que mientras aparezca Los personajes se compararán como ascll, esta también es mi suposición. Espero que Dios pueda darme alguna orientación. Gracias Gracias.

herramienta

carácter java a código de valor ascii

 private void getAscii(char ch) {
    
    
        int asciiValue = (int) ch;
        System.out.println("ASCII value of " + ch + " is: " + asciiValue);
    }

Resumir

Es posible que no encuentre los problemas anteriores al escribir código. Siempre que escriba de acuerdo con las reglas, los valores son comparaciones numéricas y las cadenas son comparaciones de cadenas. Trate de evitar las conversiones forzadas tanto como sea posible para evitar los problemas anteriores. Pero ahora que lo he encontrado, será mejor que haga un registro para evitar que alguien me pregunte en el futuro y no quiero decir que no lo sé, jeje, ¡adiós! !

Supongo que te gusta

Origin blog.csdn.net/weixin_40741732/article/details/132235058
Recomendado
Clasificación