一、框架与技术栈
-
Spring Boot:用于快速开发 Java Web 应用的框架
- 提供自动配置、依赖管理等功能
- 通过
@RestController
等注解简化控制器开发
-
MyBatis:持久层框架,用于数据库操作
- 支持 XML 配置和注解两种方式编写 SQL
- 通过 Mapper 接口与 SQL 语句映射实现数据库操作
-
MySQL:关系型数据库,作为数据存储介质
-
RESTful API 设计:接口设计规范
- 使用 HTTP 方法(GET/POST/PUT/DELETE)表示操作类型
- 采用 URL 路径表示资源(如
/teacher/{id}
)
二、核心注解使用
-
Spring 相关注解
@RestController
:标识控制器类,返回 JSON 数据@Autowired
:实现依赖注入@GetMapping/@PostMapping/@PutMapping/@DeleteMapping
:映射 HTTP 请求方法@PathVariable
:获取 URL 路径中的参数@RequestBody
:接收请求体中的 JSON 数据
-
MyBatis 相关注解
@Mapper
:标识数据访问接口@Select/@Insert/@Update/@Delete
:通过注解编写 SQL 语句@Param
:指定方法参数在 SQL 中的名称
三、MyBatis XML 映射文件
-
基本结构
- 命名空间(namespace)与 Mapper 接口关联
- CRUD 标签(
<select>/<insert>/<update>/<delete>
)对应数据库操作
-
动态 SQL
<if>
:条件判断,满足条件才拼接 SQL 片段<where>
:自动处理 AND/OR 逻辑,智能去除多余连接词<trim>
:自定义前缀、后缀及需要去除的字符<foreach>
:遍历集合,常用于批量操作<choose>/<when>/<otherwise>
:多条件分支判断<bind>
:创建变量并绑定到上下文,用于模糊查询等场景
-
参数传递
#{}
:预编译参数,自动处理转义,防止 SQL 注入${}
:直接字符串替换,有 SQL 注入风险,谨慎使用
-
主键生成
useGeneratedKeys="true"
:启用自增主键keyColumn
:指定数据库中自增主键的列名keyProperty
:指定实体类中对应主键的属性名
四、数据库操作
-
CRUD 操作
- 单条记录添加、修改、删除
- 批量添加(使用
<foreach>
遍历集合) - 单条件查询、多条件组合查询
- 模糊查询(使用
like
关键字)
-
SQL 注入防护
- 使用
#{}
代替${}
进行参数绑定 - 模糊查询使用
<bind>
标签处理(如'%' + #{param} + '%'
)
- 使用
五、配置文件
- application.yml 配置
- 数据源配置:数据库 URL、用户名、密码、驱动类
- MyBatis 配置:Mapper XML 文件位置、实体类别名包
- 日志配置:设置日志级别(如 DEBUG 级别便于调试 SQL)
- 自定义配置:通过
@Value
注解注入使用
六、接口设计与实现
-
控制器层
- 按实体分类设计控制器(TeacherController、StudentController 等)
- 统一路径前缀(如
/teacher
) - 接口参数校验与处理
- 调用 Mapper 接口完成业务逻辑
-
数据访问层
- Mapper 接口定义数据库操作方法
- 方法参数与返回值设计
- 注解方式与 XML 方式结合使用
七、常见问题与注意事项
- 代码拼写错误 :如
techer
应为teacher
- SQL 语法错误:如注解中 SQL 的括号和逗号使用不当
- SQL 注入风险 :避免使用
${}
进行字符串拼接 - 方法实现不完整:如部分 edit 和 delete 方法未实现具体 SQL
- 参数校验缺失:接口未对输入参数进行合法性校验
- 逻辑错误:如批量添加时重复添加同一个对象
八、 SQL 注入
什么是sql注入
SQL 注入是一种常见的网络攻击手段,指攻击者通过在应用程序的输入参数中插入恶意 SQL 代码,从而操纵数据库执行非预期操作的攻击方式。当应用程序对用户输入的参数未进行严格过滤和转义就直接拼接进 SQL 语句时,就可能导致 SQL 注入漏洞。
sql注入的危害
- 非法查看、修改或删除数据库中的敏感数据(如用户密码、个人信息等)
- 绕过应用程序的身份验证和授权机制,非法登录系统
- 甚至可能通过数据库权限提升,获取服务器控制权
九、controller,mapper接口,mapper.xml这三者之间是如何相互配合的
在基于 Spring Boot 和 MyBatis 的项目架构中,controller
(控制器层)、mapper
接口(数据访问层接口)和mapper.xml
(MyBatis 映射文件) 三者之间通过分工协作,共同完成从接收客户端请求到操作数据库并返回结果的整个流程,具体配合方式如下:
1. controller 的角色及与 mapper 接口的交互
controller
负责接收前端客户端发送的 HTTP 请求,进行初步的请求处理和参数校验,然后调用mapper
接口中的方法来操作数据库,获取或修改数据,并将处理结果封装后返回给前端。
以TeacherController
为例:
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/teacher")
public class TeacherController {
@Autowired
private TeacherMapper teacherMapper;
// 根据ID查询教师
@GetMapping("/{id}")
public Teacher getTeacherById(@PathVariable Integer id) {
return teacherMapper.getTeacherByid(id);
}
// 查询教师列表
@GetMapping("/list")
public List<Teacher> getTeacherList() {
return teacherMapper.getTeacherList();
}
}
在上述代码中,TeacherController
通过@Autowired
注解将TeacherMapper
接口实例注入到控制器中。当客户端发送查询教师详情或列表的请求时,TeacherController
调用TeacherMapper
接口对应的方法,将业务请求转发给数据访问层。
2. mapper 接口的作用及与 mapper.xml 的关联
mapper
接口定义了一系列与数据库操作相关的抽象方法,这些方法的具体 SQL 实现则在对应的mapper.xml
文件中编写。MyBatis 会通过动态代理机制,为mapper
接口生成实现类实例,使得controller
可以调用这些方法来执行数据库操作。
以TeacherMapper
接口为例:
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface TeacherMapper {
Teacher getTeacherByid(Integer id);
List<Teacher> getTeacherList();
}
TeacherMapper
接口中定义了获取单个教师和教师列表的方法,而这些方法的 SQL 语句具体实现是在teacher_mapper.xml
文件中。
3. mapper.xml 的功能及与 mapper 接口的对应
mapper.xml
文件用于编写具体的 SQL 语句,通过namespace
属性与对应的mapper
接口关联,id
属性与mapper
接口中的方法名对应。这样 MyBatis 就能将mapper
接口的方法调用和mapper.xml
中的 SQL 语句执行对应起来。
teacher_mapper.xml
示例:
html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.TeacherMapper">
<select id="getTeacherByid" parameterType="int" resultType="Teacher">
SELECT * FROM teacher WHERE id = #{id}
</select>
<select id="getTeacherList" resultType="Teacher">
SELECT * FROM teacher
</select>
</mapper>
在teacher_mapper.xml
中,namespace
指定为TeacherMapper
接口的全限定名,id
为getTeacherByid
和getTeacherList
的<select>
标签分别对应TeacherMapper
接口中的同名方法,当TeacherMapper
接口的方法被调用时,MyBatis 会根据映射关系执行teacher_mapper.xml
中对应的 SQL 语句。
整体协作流程总结
- 前端发送 HTTP 请求到
controller
。 controller
接收请求,进行参数校验等初步处理后,调用mapper
接口中对应的方法。- MyBatis 根据
mapper
接口与mapper.xml
的映射关系,找到mapper.xml
中与被调用方法对应的 SQL 语句,并执行该 SQL 语句,完成数据库操作。 mapper
接口将数据库操作结果返回给controller
。controller
将结果进行封装处理,返回给前端客户端 。
通过这种分工协作的方式,实现了业务逻辑和数据访问的分离,使得代码结构更加清晰,便于维护和扩展。