您现在的位置是:网站首页> 编程资料编程资料

MyBatis 动态SQL全面详解_Mysql_

2023-05-26 419人已围观

简介 MyBatis 动态SQL全面详解_Mysql_

前言

前面mysql都是通过静态sql进行查询的,但是如果业务复杂的时候,我们会遇到引号问题,或者多一个空格,这就使得sql代码编写错误了,所以为了解决这个问题,我们有了动态sql。

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。具体是通过标签来实现的。

动态sql

1.先看一下模块目录结构

在类路径的resources下的mapper包下创建sql.xml文件(共性抽取)

2.物理建模和逻辑建模

这里省略物理建模步骤,要求数据库的表与pojo类要对应。

 package pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Employee { private Integer empId; private String empName; private Double empSalary; }

3. 引入依赖

把之前的log4j复制到类路径resouces下,另外我们引入依赖后的pom.xml如下:

4.0.0org.exampleday03-mybatis02-dynamic1.0-SNAPSHOTjarorg.projectlomboklombok1.18.8providedorg.mybatismybatis3.5.7junitjunit4.12testmysqlmysql-connector-java5.1.3runtimelog4jlog4j1.2.17

4.全局配置文件

注意: 这里有驼峰映射,别名映射,路径映射和路径映射。和以前的不同的是,我们这里做了sql语句的共性抽取,所以得加一个sql的路径映射

5.sql共性抽取文件

在类路径resources下的包mapper下创建一个sql.xml(因为我们sql是要写在映射文件中,自己本身也是映射文件,所以需要写在mapper下)。到要用的时候,在映射路径文件中需要用到这个sql语句的地方加入

 select emp_id,emp_name,emp_salary from t_emp 

共性抽取文件也可以不配置,这时候直接在映射文件中把要执行的语句重新编写就行了。

6.mapper接口

一共有七个方法

 package mapper; import org.apache.ibatis.annotations.Param; import pojo.Employee; import java.util.List; public interface EmployeeMapper { //根据员工的empId查询大于该empId的所有员工,如果empId为null,则查询全体员工 List selectEmployeeListByEmpId(Integer empId); /** * 查询大于传入的empId并且工资大于传入的empSalary的员工集合,如果传入的empId为null,则不考虑empId条件 * 传入的empSalary为null则不考虑empSalary的条件 */ List selectEmployeeListByEmpIdAndEmpSalary(@Param("empId") Integer empId, @Param("empSalary") Double empSalary); /** * 根据empId更新员工信息,如果某个值为null,则不更新这个字段 */ void updateEmployee(Employee employee); /** * 根据emp_id查询员工信息,如果0 selectEmployeeList(Integer empId); /** * 添加员工信息 */ void insertEmployee(Employee employee); /** * 批量添加员工集合 */ void insertEmployeeList(@Param("employeeList") List employeeList); /** * 根据员工的id集合查询员工集 */ List selectEmployeeListByEmpIdList(List idList); }

if

目标:根据员工的empId查询大于该empId的所有员工,如果empId为null,则查询全体员工。

Dao接口的方法为:
List selectEmployeeListByEmpId(Integer empId);

静态sql:

动态sql:

表示引用抽取出的sql片段,也可以直接写sql语句。如果是静态sql,当id为null时,查询出来的是空,动态sql则可以查出全部。if标签里面有test属性名,作为判断语句。

where

目标:

  • 查询大于传入的empId并且工资大于传入的empSalary的员工集合
  • 如果传入的empId为null,则不考虑empId条件
  • 传入的empSalary为null则不考虑empSalary的条件

Dao接口方法:

List selectEmployeeListByEmpIdAndEmpSalary(@Param("empId") Integer empId, @Param("empSalary") Double empSalary);

用if标签的动态sql:

 emp_id>#{empId}  and emp_salary>#{empSalary} 

where标签的作用:

  • 在第一个条件之前自动添加WHERE关键字
  • 自动去掉第一个条件前的连接符(AND、OR等等)

trim

trim是修建的意思,其实就是去头去尾,这里还是根据上面那个方法

trim的动态sql

trim标签:

  • prefix:指定要动态添加的前缀
  • suffix属性:指定要动态添加的后缀
  • prefixOverrides:指定要动态去掉的前缀,使用“|”分隔有可能的多个值
  • suffixOverrides属性:指定要动态去掉的后缀,使用“|”分隔有可能的多个值

set

目标:根据empId更新员工信息,如果某个值为null,则不更新这个字段

Dao接口方法:
void updateEmployee(Employee employee);
我们先用上面的trim标签来解决一下这个问题,

trim的动态sql:

 emp_name=#{empName}  , emp_
                
                

-六神源码网