⭐⭐⭐⭐⭐⭐
Github主页https://github.com/A-BigTree
笔记链接https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐
如果可以,麻烦各位看官顺手点个star~
如果文章对你有所帮助,可以点赞收藏⭐支持一下博主~
Mybatis框架的动态SQL技术是一种 根据特定条件动态拼装SQL语句 的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。
MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC
或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。
One of the most powerful features of MyBatis has always been its Dynamic SQL capabilities. If you have any experience with JDBC or any similar framework, you understand how painful it is to conditionally concatenate strings of SQL together, making sure not to forget spaces or to omit a comma at the end of a list of columns. Dynamic SQL can be downright painful to deal with.
if
和where
标签
<select id="selectEmployeeByCondition" resultType="com.atguigu.mybatis.entity.Employee">
select emp_id,emp_name,emp_salary from t_emp
<where>
<if test="empName != null">
or emp_name=#{empName}
if>
<if test="empSalary > 2000">
or emp_salary>#{empSalary}
if>
where>
select>
set
标签实际开发时,对一个实体类对象进行更新。往往不是更新所有字段,而是更新一部分字段。此时页面上的表单往往不会给不修改的字段提供表单项。
例如上面的表单,如果服务器端接收表单时,使用的是User这个实体类,那么userName
、userBalance
、userGrade
接收到的数据就是null
。
如果不加判断,直接用User对象去更新数据库,在Mapper配置文件中又是每一个字段都更新,那就会把userName
、userBalance
、userGrade
设置为null值,从而造成数据库表中对应数据被破坏。
此时需要我们在Mapper配置文件中,对update语句的set
子句进行定制,此时就可以使用动态SQL的set
标签。
<update id="updateEmployeeDynamic">
update t_emp
<set>
<if test="empName != null">
emp_name=#{empName},
if>
<if test="empSalary < 3000">
emp_salary=#{empSalary},
if>
set>
where emp_id=#{empId}
update>
trim
标签使用trim
标签控制条件部分两端是否包含某些字符
prefix
属性:指定要动态添加的前缀;suffix
属性:指定要动态添加的后缀;prefixOverrides
属性:指定要动态去掉的前缀,使用|
分隔有可能的多个值;suffixOverrides
属性:指定要动态去掉的后缀,使用|
分隔有可能的多个值;
<select id="selectEmployeeByConditionByTrim" resultType="com.atguigu.mybatis.entity.Employee">
select emp_id,emp_name,emp_age,emp_salary,emp_gender
from t_emp
<trim prefix="where" suffixOverrides="and|or">
<if test="empName != null">
emp_name=#{empName} and
if>
<if test="empSalary > 3000">
emp_salary>#{empSalary} and
if>
<if test="empAge <= 20">
emp_age=#{empAge} or
if>
<if test="empGender=='male'">
emp_gender=#{empGender}
if>
trim>
select>
choose/when/otherwise
标签在多个分支条件中,仅执行一个。
foreach
标签
<foreach collection="empList" item="emp" separator="," open="values" index="myIndex">
(#{emp.empName},#{myIndex},#{emp.empSalary},#{emp.empGender})
foreach>
上面批量插入的例子本质上是一条SQL语句,而实现批量更新则需要多条SQL语句拼起来,用分号分开。也就是一次性发送多条SQL语句让数据库执行。此时需要在数据库连接信息的URL地址中设置:
atguigu.dev.url=jdbc:mysql://192.168.198.100:3306/mybatis-example?allowMultiQueries=true
对应的foreach标签如下:
update t_emp set emp_name=#{emp.empName} where emp_id=#{emp.empId}
如果没有给接口中List类型的参数使用@Param
注解指定一个具体的名字,那么在collection
属性中默认可以使用collection或list来引用这个list集合。这一点可以通过异常信息看出来:
Parameter 'empList' not found. Available parameters are [arg0, collection, list]
在实际开发中,为了避免隐晦的表达造成一定的误会,建议使用@Param
注解明确声明变量的名称,然后在foreach
标签的collection属性中按照@Param
注解指定的名称来引用传入的参数。
sql
标签
<sql id="mySelectSql">
select emp_id,emp_name,emp_age,emp_salary,emp_gender from t_emp
sql>
<include refid="mySelectSql"/>