Ochenta y tres, SQL dinámico del framework MyBatis

Directorio de artículos

SQL dinámico del framework MyBatis

Preparación ambiental

SQL dinámico si

¿Dónde está el SQL dinámico?

foreach de SQL dinámico

Fragmento de código para SQL dinámico


 

SQL dinámico del framework MyBatis

SQL dinámico, a través de las diversas etiquetas proporcionadas por MyBatis para juzgar las condiciones para lograr el empalme dinámico de sentencias SQL. La expresión utilizada en el juicio condicional aquí es la expresión OGNL. Las etiquetas SQL dinámicas comúnmente utilizadas son <if>, <where>, <choose/>, <foreach>, etc.

La declaración SQL dinámica de MyBatis es muy similar a la declaración en JSTL.

El SQL dinámico se utiliza principalmente para resolver el problema de las condiciones de consulta inciertas: durante la ejecución del programa, la consulta se realiza de acuerdo con las condiciones de consulta enviadas por el usuario. Las condiciones de consulta enviadas son diferentes y las sentencias SQL ejecutadas son diferentes. Si cada situación posible se enumera una por una y todas las condiciones se organizan y combinan, habrá una gran cantidad de declaraciones SQL. En este punto, se puede usar SQL dinámico para resolver este problema.

Preparación ambiental

1. Cree un nuevo proyecto maven, agregue mybatis, dependencias del controlador mysql

2. Cree la clase de entidad Estudiante, interfaz StudentDao, StudentDao.xml, mybatis.xml, clase de prueba

3. Utiliza la tabla anterior estudiante.

En el SQL dinámico del mapeador, si hay símbolos como mayor que (>), menor que (=), menor que o igual (<=), es mejor convertirlos en símbolos de entidad. De lo contrario, el XML puede experimentar errores de análisis.

En particular, el signo menor que (<) nunca debe aparecer en XML. De lo contrario, habrá un error al analizar el archivo del mapeador.

Tabla de símbolos de entidad:

< menos que <
> más que el >
>= mayor o igual a >=
<= Menos que o igual a <=

SQL dinámico si

Para la ejecución de esta etiqueta, cuando el valor de prueba sea verdadero, los fragmentos de SQL que contiene se empalmarán en la sentencia de SQL donde se encuentra.

Sintaxis: <if prueba="condición"> parte de la sentencia sql</if>

Método de interfaz:

List<Student> selectStudentIf(Student student);

archivo del mapeador:

<select id="selectStudentIf" resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student
 where 1=1
 <if test="name != null and name !='' ">
 and name = #{name}
 </if>
 <if test="age > 0 ">
 and age &gt; #{age}
 </if>
</select>

método de prueba:

@Test
public void testSelect() throws IOException {
 Student param = new Student();
 param.setName("李力");
 param.setAge(18);
 List<Student> studentList = studentDao.selectStudentIf(param);
 studentList.forEach( stu -> System.out.println(stu));
}

¿Dónde está el SQL dinámico?

Hay un lugar problemático en la etiqueta <if/>: debe agregar manualmente una cláusula 1=1 después del lugar. Porque, si todas las condiciones <if/> después de donde son falsas, y si no hay una cláusula 1=1 después de donde, entonces solo habrá una vacía donde quede en SQL, y SQL cometerá un error.

Entonces, después del dónde, debe agregar la cláusula siempre verdadera 1=1 para evitar que esto suceda. Pero cuando la cantidad de datos es grande, afectará seriamente la eficiencia de la consulta.

Usando la etiqueta <where/>, cuando hay una condición de consulta, la cláusula where se puede agregar automáticamente; cuando no hay una condición de consulta, la cláusula where no se agregará. Cabe señalar que el fragmento de SQL en la primera etiqueta <if/> puede no contener y.

Sin embargo, también es bueno escribir y, el sistema eliminará el extra y. Pero se debe escribir el y de otros fragmentos de SQL en <if/>. De lo contrario, la instrucción SQL se concatenará incorrectamente.

Sintaxis: <where> otro sql dinámico</where>

Método de interfaz:

List<Student> selectStudentWhere(Student student);

archivo del mapeador:

<select id="selectStudentWhere" 
resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student
 <where>
 <if test="name != null and name !='' ">
 and name = #{name}
 </if>
 <if test="age > 0 ">
 and age &gt; #{age}
 </if>
 </where>
</select>

método de prueba:

@Test
public void testSelectWhere() throws IOException {
 Student param = new Student();
 param.setName("李力");
 param.setAge(18);
 List<Student> studentList = studentDao.selectStudentWhere(param);
 studentList.forEach( stu -> System.out.println(stu));
}

foreach de SQL dinámico

La etiqueta <foreach/> se utiliza para recorrer matrices y colecciones. Al usarlo, debe prestar atención a:

  • colección representa el tipo de colección a recorrer, lista, matriz, etc.
  • open, close y separator son empalmes de SQL del contenido atravesado.

gramática:

<foreach collection="集合类型" open="开始的字符" close="结束的字符" 
 item="集合中的成员" separator="集合成员之间的分隔符">
 #{item 的值}
</foreach>

1. Lista de poligonales <tipo simple>

La Lista en la expresión está representada por list, y su tamaño está representado por list.size.

Requisito: la identificación del estudiante de consulta es 1002,1005,1006

Método de interfaz:

List<Student> selectStudentForList(List<Integer> idList);

archivo del mapeador:

<select id="selectStudentForList" 
resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student
 <if test="list !=null and list.size > 0 ">
 where id in
 <foreach collection="list" open="(" close=")" 
 item="stuid" separator=",">
 #{stuid}
 </foreach>
 </if>
</select>

método de prueba:

@Test
public void testSelectForList() {
 List<Integer> list = new ArrayList<>();
 list.add(1002);
 list.add(1005);
 list.add(1006);
 List<Student> studentList = studentDao.selectStudentForList(list);
 studentList.forEach( stu -> System.out.println(stu));
}

2. Lista poligonal<tipo de objeto>

Método de interfaz:

List<Student> selectStudentForList2(List<Student> stuList);

archivo del mapeador:

<select id="selectStudentForList2" 
resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student
 <if test="list !=null and list.size > 0 ">
 where id in
 <foreach collection="list" open="(" close=")"
 item="stuobject" separator=",">
 #{stuobject.id}
 </foreach>
 </if>
</select>

método de prueba:

@Test
public void testSelectForList2() {
 List<Student> list = new ArrayList<>();
 Student s1 = new Student();
 s1.setId(1002);
 list.add(s1);
 s1 = new Student();
 s1.setId(1005);
 list.add(s1);
 List<Student> studentList = studentDao.selectStudentForList2(list);
 studentList.forEach( stu -> System.out.println(stu));
}

Fragmento de código para SQL dinámico

La etiqueta <sql/> se usa para definir fragmentos SQL para que otras etiquetas SQL los reutilicen. Para que otras etiquetas utilicen este fragmento de SQL, se requiere la subetiqueta <include/>. La etiqueta <sql/> puede definir cualquier parte de la instrucción SQL, por lo que la subetiqueta <include/> se puede colocar en cualquier parte del SQL dinámico.

Método de interfaz:

List<Student> selectStudentSqlFragment(List<Student> stuList);

archivo del mapeador:

<!--创建 sql 片段 id:片段的自定义名称--> 
<sql id="studentSql">
 select id,name,email,age from student
</sql>
<select id="selectStudentSqlFragment" 
resultType="com.bjpowernode.domain.Student">
 <!-- 引用 sql 片段 --> 
 <include refid="studentSql"/>
 <if test="list !=null and list.size > 0 ">
 where id in
 <foreach collection="list" open="(" close=")" 
 item="stuobject" separator=",">
 #{stuobject.id}
 </foreach>
 </if>
</select>

método de prueba:

@Test
public void testSelectSqlFragment() {
 List<Student> list = new ArrayList<>();
 Student s1 = new Student();
 s1.setId(1002);
 list.add(s1);
 s1 = new Student();
 s1.setId(1005);
 list.add(s1);
 List<Student> studentList = studentDao.selectStudentSqlFragment(list);
 studentList.forEach( stu -> System.out.println(stu));
}


 

Supongo que te gusta

Origin blog.csdn.net/m0_54925305/article/details/123607625
Recomendado
Clasificación