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

一、框架与技术栈

  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接口的全限定名,idgetTeacherByidgetTeacherList<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将结果进行封装处理,返回给前端客户端 。

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

相关推荐
崎岖Qiu4 分钟前
【设计模式笔记19】:建造者模式
java·笔记·设计模式·建造者模式
锦瑟弦音8 小时前
微信小游戏分包(cocos自带分包)
笔记·游戏
找方案9 小时前
我的 all-in-rag 学习笔记:文本分块 ——RAG 系统的 “信息切菜术“
人工智能·笔记·all-in-rag
HXR_plume9 小时前
【Web信息处理与应用课程笔记1】网页排序(上)
笔记
qcwl669 小时前
操作系统 真象还原 学习笔记#13
笔记·学习
m0_689618289 小时前
30 分钟打印!多材料3D打印软机器人内置驱动 + 自主避障
笔记·学习·机器人
Rousson10 小时前
硬件学习笔记--93 静电防护方案(电阻、磁珠、电感、TVS等)
笔记·单片机·学习
思成不止于此10 小时前
【MySQL 零基础入门】事务精讲(二):ACID 特性与并发问题
数据库·笔记·学习·mysql
happyhappy没有句号11 小时前
嵌入式单片机一套通关学习笔记
笔记·单片机·嵌入式硬件·学习
悠哉悠哉愿意11 小时前
【嵌入式学习笔记】工程模板建立
笔记·嵌入式硬件·学习