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

一、框架与技术栈

  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将结果进行封装处理,返回给前端客户端 。

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

相关推荐
I'm a winner35 分钟前
FPGA+护理:跨学科发展的探索(二)
笔记·fpga开发
柳鲲鹏1 小时前
bitbake –s:列出所有可编译的模块
笔记
智者知已应修善业3 小时前
【51单片机数码管循环显示3位数字】2022-10-26
c语言·经验分享·笔记·嵌入式硬件·算法·51单片机
菜菜子爱学习4 小时前
Nginx学习笔记(三)——在 CentOS 7 中配置阿里云镜像源
笔记·学习·nginx·centos·运维开发·vmware
楼田莉子8 小时前
(3万字详解)Linux系统学习:深入了解Linux系统开发工具
linux·服务器·笔记·git·学习·vim
芥子须弥Office18 小时前
从C++0基础到C++入门 (第二十五节:指针【所占内存空间】)
c语言·开发语言·c++·笔记
Starry_hello world19 小时前
MySql 表的操作
数据库·笔记·mysql
使二颗心免于哀伤20 小时前
《设计模式之禅》笔记摘录 - 14.组合模式
笔记·设计模式·组合模式