1.什么是动态SQL
动态SQL是一种根据不同条件动态生成SQL语句的技术。它允许在运行时根据不同的条件拼接SQL语句,从而实现更灵活的查询和操作数据库的方式。
动态SQL通常用于构建复杂的查询语句,例如根据用户输入的不同条件进行筛选、排序和分页等操作。它可以根据条件的存在与否动态添加相应的SQL片段,从而实现灵活的查询。
动态SQL可以使用各种编程语言和框架实现,例如Java中的MyBatis、Python中的SQLAlchemy等。它通常使用字符串拼接、条件判断和循环等技术来动态生成SQL语句,以满足不同的需求。
动态SQL的优点是可以根据不同的条件生成不同的SQL语句,从而提高查询的灵活性和效率。但同时也需要注意安全性问题,避免SQL注入等安全漏洞。
2.动态SQL的作用
动态SQL是一种在运行时根据条件动态生成SQL语句的技术,其作用主要包括以下几个方面:
1. 条件灵活:动态SQL可以根据不同的条件动态生成不同的SQL语句,使得查询、更新、删除等操作可以根据实际需求进行灵活调整。
2. 提高性能:动态SQL可以根据不同的查询条件生成不同的执行计划,从而提高查询的性能。例如,可以根据查询条件动态选择不同的索引,或者动态调整SQL语句的结构,以优化查询性能。
3. 动态拼接:动态SQL可以根据输入的参数动态拼接SQL语句,从而实现动态条件的查询。这样可以避免手动拼接SQL语句的繁琐和容易出错的问题。
4. 动态权限控制:动态SQL可以根据用户的权限动态生成不同的SQL语句,从而实现对不同用户的不同数据权限控制。
总的来说,动态SQL的作用是使得SQL语句的生成更加灵活和高效,可以根据不同的条件和需求生成不同的SQL语句,从而提高系统的性能和可维护性。
3.动态SQL的常用标签
在常见的动态SQL框架中,常用的标签包括以下几种:
1. if标签:用于根据条件判断是否包含某段SQL语句。可以根据条件动态生成不同的SQL语句。例如:
```xml
<if test="condition">
SQL statement
</if>
```
2. choose、when、otherwise标签:用于实现多条件判断,类似于Java中的switch语句。可以根据不同的条件生成不同的SQL语句。例如:
```xml
<choose>
<when test="condition1">
SQL statement 1
</when>
<when test="condition2">
SQL statement 2
</when>
<otherwise>
SQL statement 3
</otherwise>
</choose>
```
3. foreach标签:用于循环遍历集合或数组,并生成对应的SQL语句。可以根据集合中的元素动态生成SQL语句。例如:
```xml
<foreach collection="list" item="item" separator=",">
#{item}
</foreach>
```
4. set标签:用于动态生成更新语句中的SET子句。可以根据条件动态生成更新的字段和值。例如:
```xml
<set>
<if test="condition1">
column1 = #{value1},
</if>
<if test="condition2">
column2 = #{value2},
</if>
</set>
```
这些标签可以根据不同的条件和需求动态生成SQL语句,使得SQL语句的生成更加灵活和高效。不同的动态SQL框架可能会有一些特定的标签和语法,但以上标签是比较常见和通用的。
4.批量新增
下图是批量新增的SQL语句
4.1 collection
在MyBatis中,动态SQL中的collection属性用于指定要遍历的集合对象。它通常与foreach标签一起使用,用于遍历集合中的元素,并在SQL语句中动态生成对应的SQL片段。
具体来说,collection属性可以接收一个集合对象的名称,该集合对象可以是List、Set、数组等类型。MyBatis会遍历该集合对象,并将集合中的元素作为上下文对象传递给foreach标签内部的SQL语句。
以下是一个示例:
```xml
<select id="getUserList" parameterType="java.util.List" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
```
在上面的示例中,collection属性指定了要遍历的集合对象为list,foreach标签会遍历list集合中的元素,并将每个元素赋值给item变量。在SQL语句中,使用#{item}来引用每个元素的值,从而动态生成了一个IN子句。
使用动态SQL中的collection属性可以方便地处理包含多个元素的集合对象,动态生成对应的SQL语句,提高了SQL语句的灵活性和可重用性。
4.2 item
在动态SQL中,item是foreach标签中的一个属性,用于表示集合中的每个元素。item属性可以自定义命名,用于在循环中引用集合中的每个元素。
例如,在以下代码中:
```xml
<foreach collection="list" item="item" separator=",">
#{item}
</foreach>
```
item属性被设置为"item",表示集合中的每个元素将被命名为"item"。在循环体中,可以使用#{item}来引用集合中的每个元素。
这样,循环会遍历集合中的每个元素,并将每个元素替换为#{item},从而动态生成对应的SQL语句。在生成的SQL语句中,#{item}会被替换为集合中的每个元素的值。
item属性可以根据实际需求自定义命名,以便更好地理解和使用集合中的元素。
4.3 separator
在动态SQL的foreach标签中,separator属性用于指定在循环生成的每个元素之间的分隔符。它可以用来控制生成的SQL语句中每个元素之间的分隔方式。
当循环生成SQL语句时,如果需要在每个元素之间添加分隔符,可以使用separator属性来指定分隔符。分隔符将在每个元素之间插入,但不会在循环的开头或结尾插入。
例如,在以下代码中:
```xml
<foreach collection="list" item="item" separator=",">
#{item}
</foreach>
```
separator属性被设置为",",表示在生成的SQL语句中,每个元素之间将用逗号分隔。循环将遍历集合中的每个元素,并将每个元素替换为#{item},同时在每个元素之间插入逗号。
这样,生成的SQL语句将会是类似于"item1, item2, item3"的形式,其中每个元素之间都用逗号分隔。
separator属性可以根据实际需求自定义,以适应不同的分隔符需求。它可以在生成的SQL语句中控制元素之间的分隔方式,使得SQL语句的生成更加灵活和符合实际需求。
这个是批量新增的方法
这个就是测试类里面的代码。