Mybatis基础

wdadwa
1
2026-04-01

一,Mybatis介绍

MyBatis 是一款优秀的持久层(orm) 框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

  • MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013
    年11月迁移到Github。
  • 官网: mybatis – MyBatis 3 | 简介

二,Mybatis基础操作

2.1 Mybatis快速入门

首先,需要在 Maven 中导入 Mybatis 的坐标

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.2</version>
</dependency>

以 Mybatis 操作 MySQL 为例,导入 Java 操作 Mysql 的驱动:

<!--mysql8.0之前的版本-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.45</version>
</dependency>
<!--MySQL8.0及之后的版本-->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

配置 MySQL 的连接信息,在项目 application.properties 或其他配置文件中配置:

spring:
  #mysql数据库配置
  datasource:
  	#连接MYSQL的账号
    username: root
    #连接MYSQL的密码
    password: 123456
    #连接MYSQL的地址
    url: jdbc:mysql://172.31.154.122:3306/demo
    #mysql驱动的全类名,这里是8.0以上的
    #8.0之前的是:com.mysql.jdbc.Driver
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  #开启类别命名自动扫描
  typeAliasesPackage: com.normaling.**.domain
  #开启mapper扫描路径
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  configuration:
    #指定mybatis日志输出的位置,这里是输出到控制台
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #开启小驼峰命名转换。将column=a_column--->aColumn
    map-underscore-to-camel-case: true

创建对应数据库表的实体类,用于接受从数据库中查询的数据。

2953321-20231012142325902-304290924.png

在 Mapper 层的类中使用注解的方式来编写 SQL 语句

2953321-20231012142401242-2092868355.png

@Mapper 是 Mybatis 提供的注解,用于将我们的 java 类较给 IOC 容器管理。

@Select 就是查询语句了,对应的还有 @Insert,@Delete,@Update

Mybatis 编写 SQL 语句分为:

  • 静态SQL(用注解直接写SQL)
  • 动态SQL(编写xml文件)(主要通过xml编写SQL)

2.2 数据库连接池

数据库连接池:

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
  • 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏

数据库连接池标准接口:DataSource

  • 官方(sun)提供的数据库连接池接口,由第三方组织实现此接口
  • 功能:获取连接:
    2953321-20231012142905612-658081366.png
    常见的数据库连接池:

2953321-20231012142946339-866587610.png

Druid (德鲁伊)

  • Druid连接池是阿里巴巴开源的数据库连接池项目
  • 功能强大,性能优秀,是ava语言最好的数据库连接池之一

切换 Druid 数据库连接池的方法:

官方地址: https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

  1. 引入 Druid

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.16</version>
    </dependency>
    
  2. 修改数据源配置

    spring:
      datasource:
        # 基本数据库连接信息
        url: jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource  # 指定使用 Druid 连接池
    
        # Druid 连接池专属配置
        druid:
          # --- 连接池核心参数 ---
          initial-size: 5            # 初始化时建立的物理连接数(建议根据并发量调整)
          min-idle: 5                # 最小空闲连接数(长期维持的闲置连接数)
          max-active: 20             # 最大活跃连接数(高并发时可适当调高,避免等待)
          max-wait: 60000            # 获取连接时的最大等待时间(毫秒),超时则抛异常
          time-between-eviction-runs-millis: 60000  # 检查空闲连接的间隔时间(毫秒)
          min-evictable-idle-time-millis: 300000     # 连接保持空闲的最小时间,超时则被关闭
          validation-query: SELECT 1  # 用于检测连接有效性的 SQL(如 MySQL 用 SELECT 1)
          test-while-idle: true       # 空闲时是否检测连接有效性(建议开启)
          test-on-borrow: false       # 获取连接时是否检测有效性(影响性能,不建议开启)
          test-on-return: false       # 归还连接时是否检测有效性(影响性能,不建议开启)
          
          # --- 监控统计配置 ---
          stat-view-servlet:
            enabled: true             # 启用内置的监控页面
            url-pattern: /druid/*     # 监控页面的访问路径
            login-username: admin     # 监控页面登录用户名(生产环境建议修改)
            login-password: admin     # 监控页面登录密码(生产环境必须修改)
            reset-enable: false       # 禁用监控页面的 "Reset All" 功能(安全考虑)
            
          web-stat-filter:
            enabled: true             # 启用 Web 应用监控
            url-pattern: /*            # 监控所有 URL 请求
            exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"  # 排除静态资源
            session-stat-enable: true  # 统计 Session 使用情况
            principal-session-name: user  # 用户信息的 Session Key(用于监控用户行为)
            
          # --- 高级功能(可选)---
          filters: stat,wall,slf4j     # 启用统计、防火墙、日志过滤器(需添加依赖)
          filter:
            stat:
              log-slow-sql: true      # 记录慢查询
              slow-sql-millis: 2000   # 慢查询阈值(单位:毫秒)
            wall:
              config:
                multi-statement-allow: true  # 允许多条 SQL 语句(根据需求开启)
    

三,Mybatis静态SQL

3.1 参数占位符

2953321-20231017082549408-687694846.png

参数顺序和注解里面的参数顺序需要保持一致。

3.2 删除

默认返回操作影响的记录数,用 int 存储。

举例:根据主键 id 删除数据。

2953321-20231017080938867-1815765936.png

#{id} 所包含的内容在 mybatis 中会先变成? 占位符,这个叫预编译 SQL

2953321-20231017081711351-1713613024.png

预编译 SQL 和普通 SQL 语句的执行对比:

2953321-20231017082422560-1389608493.png

注:SQL 注入是通过操作输入的数据来修改事先定义好的 SQL 语句,以达到执行代码对服务器进行攻击的方法,Mybatis 能防止 SQL 注入是因为这个预编译 SQL,因为不管传入怎么样的字符串,他都会将其当作一个参数传入!

2953321-20231017082453232-106479387.png

3.3 新增

举例:新增人员信息

2953321-20231017082847425-701402916.png

其中参数占位符里面的是 Emp 类里面的属性名,一般采用小驼峰命名方法,而在数据库表中一般采用小写使用下划线分割的方式来命名。

举例:新增(主键返回)

2953321-20231017084154510-1669600521.png

即 insert 插入数据后,将对应记录里面的主键封装到你传入的参数 Emp emp 里面。这个就叫新增主键返回。

3.4 更新

默认返回操作影响的记录数,用 int 存储。

2953321-20231017084357357-1247503121.png

3.5 查询

根据主键 id 查询:

2953321-20231017084457849-1149525095.png

但是在查询回显数据的时候需要注意数据封装问题:

  • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
  • 如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装
  • 假设你查询返回的是一张表,里面每一条记录数代表的就是一个Emp信息,那么返回值可以用List<Emp>来存储整张表。

解决方法:

  1. 给数据库表中字段名和对应java属性名不一致的地方在select语句中起别名。
    2953321-20231017084800716-1609181238.png
  2. 通过**@Results,@Result**注解手动映射数据库字段和java类字段
    2953321-20231017084917159-696301516.png
    column里面是数据库表字段名,property里面是java类字段名。
  3. 在mybatis中开启小驼峰转换,让他自动映射。
    a_column ==》 aColumn这种
    mybatis:
      configuration:
        #指定mybatis日志输出的位置,这里是输出到控制台
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        #开启小驼峰命名转换。将column=a_column--->aColumn
        map-underscore-to-camel-case: true
      #开启mapper扫描路径
      mapper-locations: classpath:mapper/*.xml
    

条件查询
2953321-20231017085438120-1202094541.png
注意:
2953321-20231017085633631-307856113.png

动物装饰