项目代码涉及的知识点笔记整理

一、框架与技术栈

  1. Spring Boot:用于快速开发 Java Web 应用的框架

    • 提供自动配置、依赖管理等功能
    • 通过@RestController等注解简化控制器开发
  2. MyBatis:持久层框架,用于数据库操作

    • 支持 XML 配置和注解两种方式编写 SQL
    • 通过 Mapper 接口与 SQL 语句映射实现数据库操作
  3. MySQL:关系型数据库,作为数据存储介质

  4. RESTful API 设计:接口设计规范

    • 使用 HTTP 方法(GET/POST/PUT/DELETE)表示操作类型
    • 采用 URL 路径表示资源(如/teacher/{id})

二、核心注解使用

  1. Spring 相关注解

    • @RestController:标识控制器类,返回 JSON 数据
    • @Autowired:实现依赖注入
    • @GetMapping/@PostMapping/@PutMapping/@DeleteMapping:映射 HTTP 请求方法
    • @PathVariable:获取 URL 路径中的参数
    • @RequestBody:接收请求体中的 JSON 数据
  2. MyBatis 相关注解

    • @Mapper:标识数据访问接口
    • @Select/@Insert/@Update/@Delete:通过注解编写 SQL 语句
    • @Param:指定方法参数在 SQL 中的名称

三、MyBatis XML 映射文件

  1. 基本结构

    • 命名空间(namespace)与 Mapper 接口关联
    • CRUD 标签(<select>/<insert>/<update>/<delete>)对应数据库操作
  2. 动态 SQL

    • <if>:条件判断,满足条件才拼接 SQL 片段
    • <where>:自动处理 AND/OR 逻辑,智能去除多余连接词
    • <trim>:自定义前缀、后缀及需要去除的字符
    • <foreach>:遍历集合,常用于批量操作
    • <choose>/<when>/<otherwise>:多条件分支判断
    • <bind>:创建变量并绑定到上下文,用于模糊查询等场景
  3. 参数传递

    • #{}:预编译参数,自动处理转义,防止 SQL 注入
    • ${}:直接字符串替换,有 SQL 注入风险,谨慎使用
  4. 主键生成

    • useGeneratedKeys="true":启用自增主键
    • keyColumn:指定数据库中自增主键的列名
    • keyProperty:指定实体类中对应主键的属性名

四、数据库操作

  1. CRUD 操作

    • 单条记录添加、修改、删除
    • 批量添加(使用<foreach>遍历集合)
    • 单条件查询、多条件组合查询
    • 模糊查询(使用like关键字)
  2. SQL 注入防护

    • 使用#{}代替${}进行参数绑定
    • 模糊查询使用<bind>标签处理(如'%' + #{param} + '%')

五、配置文件

  1. application.yml 配置
    • 数据源配置:数据库 URL、用户名、密码、驱动类
    • MyBatis 配置:Mapper XML 文件位置、实体类别名包
    • 日志配置:设置日志级别(如 DEBUG 级别便于调试 SQL)
    • 自定义配置:通过@Value注解注入使用

六、接口设计与实现

  1. 控制器层

    • 按实体分类设计控制器(TeacherController、StudentController 等)
    • 统一路径前缀(如/teacher)
    • 接口参数校验与处理
    • 调用 Mapper 接口完成业务逻辑
  2. 数据访问层

    • Mapper 接口定义数据库操作方法
    • 方法参数与返回值设计
    • 注解方式与 XML 方式结合使用

七、常见问题与注意事项

  1. 代码拼写错误 :如techer应为teacher
  2. SQL 语法错误:如注解中 SQL 的括号和逗号使用不当
  3. SQL 注入风险 :避免使用${}进行字符串拼接
  4. 方法实现不完整:如部分 edit 和 delete 方法未实现具体 SQL
  5. 参数校验缺失:接口未对输入参数进行合法性校验
  6. 逻辑错误:如批量添加时重复添加同一个对象

八、 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 语句。

整体协作流程总结

  1. 前端发送 HTTP 请求到controller。
  2. controller接收请求,进行参数校验等初步处理后,调用mapper接口中对应的方法。
  3. MyBatis 根据mapper接口与mapper.xml的映射关系,找到mapper.xml中与被调用方法对应的 SQL 语句,并执行该 SQL 语句,完成数据库操作。
  4. mapper接口将数据库操作结果返回给controller。
  5. controller将结果进行封装处理,返回给前端客户端 。

通过这种分工协作的方式,实现了业务逻辑和数据访问的分离,使得代码结构更加清晰,便于维护和扩展。

相关推荐
前进的李工6 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
蒸蒸yyyyzwd8 小时前
后端学习笔记三个知识
笔记·八股
Zhao-Jichao10 小时前
AI Prompting for Everyone 课程笔记 - P19 数据分析 Data Analysis
人工智能·笔记·数据分析
旖旎夜光10 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
ACP广源盛1392462567311 小时前
选型笔记:Type‑C 扩展坞方案评估|DP1.2 转 HDMI2.0 桥接芯片 GSV2201D@ACP
笔记·硬件架构·硬件工程·视频·国产芯片
李长渊哦12 小时前
Qoder 自定义子智能体(Subagent)学习笔记
chrome·笔记·学习
pixelpilot12 小时前
Deta Surf:把笔记、文件和网页塞进同一个 AI 工作台
笔记·其他
蒸蒸yyyyzwd13 小时前
学习笔记 复盘
笔记·八股
旖旎夜光13 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
一支蜉蝣16 小时前
Day26 XD安全学习笔记--PHP 应用&模版引用&Smarty渲染&MVC 模型&数据联动&RCE 安全
笔记·网络安全·html·php