一、MyBatis 开发准备工作

1. 基础环境搭建步骤

  1. 准备数据库表 emp:包含员工相关字段(id、username、name、gender、job、entrydate 等)
  2. 创建 SpringBoot 工程:引入依赖
    • MyBatis Framework
    • MySQL Driver
    • Lombok(简化实体类开发)
  3. 配置数据库连接信息(application.properties):

    properties

    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
    spring.datasource.username=root
    spring.datasource.password=1234
    
  4. 创建实体类 Emp(驼峰命名,配合 Lombok):

    java

    运行

    @Data
    public class Emp {
        private Integer id;
        private String username;
        private String password;
        private String name;
        private Short gender;
        private String image;
        private Short job;
        private LocalDate entrydate;
        private Integer deptId;
        private LocalDateTime createTime;
        private LocalDateTime updateTime;
    }
    
  5. 创建 Mapper 接口 EmpMapper:

    java

    运行

    @Mapper
    public interface EmpMapper {
        // 后续编写SQL方法
    }
    

二、SQL 注入问题与防护

1. 什么是 SQL 注入?

通过恶意构造输入数据,修改预定义 SQL 语句的逻辑,实现非法操作(如绕过登录、删除数据)。

  • 示例:登录场景中,输入密码 'or '1'=',会拼接出 where username='xxx' and password='' or '1'='1',条件恒为真,直接登录成功。

2. MyBatis 参数占位符对比

表格

占位符原理安全性使用场景
#{...}预编译占位符,执行时替换为?,参数由 MyBatis 安全设置安全,防止 SQL 注入绝大多数参数传递场景
${...}直接将参数拼接进 SQL 语句,无预编译不安全,存在 SQL 注入风险动态设置表名、列名等场景

三、根据主键删除示例

1. SQL 语句

sql

delete from emp where id = 17;

2. Mapper 接口方法

java

运行

@Delete("delete from emp where id = #{id}")
public void delete(Integer id);

3. 注意事项

  • 当 Mapper 接口方法只有一个普通类型参数时,#{} 内的属性名可以任意写(如 #{id}、#{value} 都可以),MyBatis 会自动识别参数。

四、MyBatis 日志配置(调试必备)

1. 开启日志输出

在 application.properties 中配置,让 SQL 执行过程打印到控制台:

properties

# 指定日志实现,输出SQL到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

2. 日志输出示例

log

==> Preparing: delete from emp where id = ?
==> Parameters: 16(Integer)
<== Updates: 1
  • Preparing:显示预编译后的 SQL 语句(? 占位符形式)
  • Parameters:显示实际传入的参数值
  • Updates:显示 SQL 执行影响的行数

五、预编译 SQL 的优势

1. 性能更高

  • 预编译 SQL 只需要解析一次,后续相同结构的 SQL 可以直接复用编译结果,减少数据库解析开销。
  • 示例:多次执行 delete from emp where id = ?,数据库只需要解析一次,缓存执行计划,后续直接执行。

2. 更安全(防止 SQL 注入)

  • 预编译时 SQL 结构已经固定,参数是后续传入的,无法通过恶意参数修改 SQL 逻辑,从根本上避免 SQL 注入攻击。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐