在Spring Boot + MyBatis项目中调用MySQL存储过程/函数,可以通过以下步骤来实现:

步骤 1: 定义存储过程

首先,在MySQL数据库中定义一个存储过程。例如,我们定义一个名为 GetEmployeesByDepartment 的存储过程,用于获取特定部门的所有员工:

DELIMITER //
CREATE PROCEDURE GetEmployeesByDepartment(IN dept_id INT)
BEGIN
    SELECT * FROM employees WHERE department_id = dept_id;
END //
DELIMITER ;

步骤 2: 配置数据源

确保Spring Boot应用配置了正确的MySQL数据源。通常情况下,这是在 application.propertiesapplication.yml 文件中完成的。

spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

步骤 3: 创建Mapper接口

接下来,你需要创建一个Mapper接口来调用存储过程。MyBatis提供了 @Select@Update 等注解来映射SQL语句,但对于存储过程,你可以使用 @Options 注解来处理结果集。

import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.jdbc.SQL;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.spring.SqlProviderAdapter;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
public interface EmployeeMapper {

    @SelectProvider(type = SqlProviderAdapter.class, method = "dynamicSql")
    @Options(resultMap = "EmployeeResultMap")
    List<Map<String, Object>> getEmployeesByDepartment(Integer departmentId);

    static String getEmployeesByDepartment(Integer departmentId) {
        return new SQL() {
            {
                SELECT("*");
                FROM("employees");
                WHERE("department_id = #{dept_id}");
            }
        }.toString();
    }
}

在这个例子中,我们使用 @SelectProviderSqlProviderAdapter 来动态构建SQL语句。@Options(resultMap = "EmployeeResultMap") 指定使用的结果映射。

步骤 4: 创建Mapper XML文件(可选)

如果你选择使用XML文件来定义SQL语句和结果映射,可以在 resources 目录下创建对应的XML文件。

<!-- resources/mapper/EmployeeMapper.xml -->
<mapper namespace="com.example.mapper.EmployeeMapper">
    <select id="getEmployeesByDepartment" parameterType="int" resultMap="EmployeeResultMap">
        CALL GetEmployeesByDepartment(${departmentId})
    </select>

    <resultMap id="EmployeeResultMap" type="com.example.model.Employee">
        <!-- 映射字段 -->
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="departmentId" column="department_id" jdbcType="INTEGER"/>
        <!-- 更多字段映射 -->
    </resultMap>
</mapper>

步骤 5: 使用存储过程

现在你可以在Spring Boot应用中的任何地方注入 EmployeeMapper 并调用 getEmployeesByDepartment 方法。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class EmployeeController {

    private final EmployeeMapper employeeMapper;

    @Autowired
    public EmployeeController(EmployeeMapper employeeMapper) {
        this.employeeMapper = employeeMapper;
    }

    @GetMapping("/employees/{departmentId}")
    public List<Map<String, Object>> getEmployeesByDepartment(@PathVariable Integer departmentId) {
        return employeeMapper.getEmployeesByDepartment(departmentId);
    }
}

这样设置后,当访问 /employees/{departmentId} URL 时,就会调用存储过程并返回该部门的所有员工信息。

注意事项

  • 确保数据库连接正确配置并且可用。
  • 存储过程的名称和参数应该与你在MySQL数据库中定义的一致。
  • 如果存储过程返回多个结果集,你可能需要在XML文件中定义多个 <resultMap> 元素,并在调用时使用适当的参数。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐