He estado usando el marco ORM myBatis, y he usado algunas funciones comunes en mybatis. Hoy, en el desarrollo de proyectos, hay un negocio que requiere restringir a los usuarios de consultar campos en ciertas tablas y si se muestran ciertos campos, como ciertos campos en una determinada tabla no se les permite ser consultados por los usuarios. En este caso, es necesario construir SQL para pasar dinámicamente los nombres y nombres de campo. Ahora resumiré la solución, y espero que sea útil para mis socios que se encuentran con el mismo problema.
Dynamic SQL es una de las potentes características de MyBatis. Antes de precompilar declaraciones SQL, MyBatis analizará dinámicamente SQL y lo analizará en un objeto BoundSQL, que también se procesa aquí. Primero nos familiaricemos con el uso de #{} y $ {} en mybatis:
En el proceso dinámico de análisis SQL, los efectos de #{} y $ {} son diferentes:
#{} analizado como un marcador de parámetros para una declaración precompilada JDBC.
Como se muestra en la siguiente declaración SQL
Seleccione * del usuario donde nombre = #{name};Se analizará como:
Seleccione * del usuario donde nombre =?;
¿Puede ver que #{} se analiza en un marcador de posición de parámetro? .
$ {} es solo un reemplazo de cadena pura. El reemplazo variable se realizará durante la etapa dinámica de análisis SQL, como la siguiente instrucción SQL:
Seleccione * del usuario donde nombre = $ {name};Cuando pasamos el parámetro "Sprite", SQL analizará como:
seleccionar * del usuario donde nombre = "Sprite";
Puede ver que la instrucción SQL antes de la precompilación ya no contiene nombre de variable.
En resumen, la etapa de reemplazo de la variable de $ {} está en la etapa dinámica de análisis SQL, mientras que el reemplazo de la variable de #{} está en el DBMS.
La diferencia entre #{} y $ {} se puede resumir simplemente de la siguiente manera:
#{} trata el parámetro aprobado como una cadena y agrega una cotización doble al parámetro aprobado
$ {} mostrará directamente los parámetros pasados en SQL, y no se agregarán cotizaciones
#{} puede evitar la inyección de SQL en Chengdu, pero $ {} no puede evitar la inyección de SQL
$ {} ha sido reemplazado por variables antes de la precompilación, lo que presenta el riesgo de inyección SQL. Como sigue SQL
Seleccione * de $ {Tablename} donde nombre = $ {name}Si el nombre de parámetro pasado es usuario; Eliminar usuario; -, luego, después de un análisis dinámico de SQL, el SQL antes de la precompilación se convertirá:
seleccionar * del usuario; Eliminar usuario; - donde nombre =?
-¡Las declaraciones posteriores no funcionarán como comentarios, y mis amigos y yo estábamos aturdidos! ! ! ¿Viste que la declaración de consulta original realmente contiene un SQL que elimina los datos de la tabla, que es eliminar, eliminar, eliminar! ! ! Dije cosas importantes tres veces, y puedes imaginar cuán grande es el riesgo.
$ {} generalmente se usa para transferir el nombre de la tabla, el nombre del campo, etc. de la base de datos.
Intente no usar $ {} donde pueda usar #{}
Ir al tema, a través del análisis anterior, creo que puede tener algunas ideas sobre cómo llamar dinámicamente los nombres de las tabla y los nombres de campo. Los ejemplos son los siguientes:
<select id = "getUser" dentType = "java.util.map" parametertype = "java.lang.string" DeclaryType = "Declaración"> Seleccionar $ {columnas} de $ {TableName} Where Company_remark = $ {Company} </elect>Para implementar nombres de tabla de llamadas dinámicas y nombres de campo, no se puede utilizar la precompilación. Debe agregar DeclarationType = "Declaración" ".
DeclarationType: cualquiera de la declaración (no precompilada), preparada (precompilada) o llamable, lo que le dice a myBatis que use la declaración, preparación o callableStatement respectivamente. Valor predeterminado: preparado. Obviamente, la precompilación no se puede usar aquí, debe cambiarse a la no recompilación.
En segundo lugar, el valor de la variable en SQL es $ {xxx}, no #{xxx}.
Debido a que $ {} es para mostrar directamente los parámetros pasados para generar SQL, por ejemplo, los parámetros pasados en $ {xxx} son datos de cadena, las comillas deben agregarse antes de que se pase el parámetro, como:
Name de cadena = "sprite"; name = "'" + name + "'";
Resumir
Lo anterior es la solución al nombre de la tabla de llamadas dinámicas de MyBatis y el nombre de campo que le presenta el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!
Este artículo se reproduce de: http://www.yuanrengu.com/index.php/mybatis1021.html