在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.properties
或 application.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();
}
}
在这个例子中,我们使用 @SelectProvider
和 SqlProviderAdapter
来动态构建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>
元素,并在调用时使用适当的参数。