一,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
创建对应数据库表的实体类,用于接受从数据库中查询的数据。

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

@Mapper 是 Mybatis 提供的注解,用于将我们的 java 类较给 IOC 容器管理。
@Select 就是查询语句了,对应的还有 @Insert,@Delete,@Update
Mybatis 编写 SQL 语句分为:
- 静态SQL(用注解直接写SQL)
- 动态SQL(编写xml文件)(主要通过xml编写SQL)
2.2 数据库连接池
数据库连接池:
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
数据库连接池标准接口:DataSource
- 官方(sun)提供的数据库连接池接口,由第三方组织实现此接口
- 功能:获取连接:

常见的数据库连接池:

Druid (德鲁伊)
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是ava语言最好的数据库连接池之一
切换 Druid 数据库连接池的方法:
官方地址: https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
-
引入 Druid
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.16</version> </dependency> -
修改数据源配置
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 参数占位符

参数顺序和注解里面的参数顺序需要保持一致。
3.2 删除
默认返回操作影响的记录数,用 int 存储。
举例:根据主键 id 删除数据。

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

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

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

3.3 新增
举例:新增人员信息

其中参数占位符里面的是 Emp 类里面的属性名,一般采用小驼峰命名方法,而在数据库表中一般采用小写使用下划线分割的方式来命名。
举例:新增(主键返回)

即 insert 插入数据后,将对应记录里面的主键封装到你传入的参数 Emp emp 里面。这个就叫新增主键返回。
3.4 更新
默认返回操作影响的记录数,用 int 存储。

3.5 查询
根据主键 id 查询:

但是在查询回显数据的时候需要注意数据封装问题:
- 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
- 如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装
- 假设你查询返回的是一张表,里面每一条记录数代表的就是一个Emp信息,那么返回值可以用List<Emp>来存储整张表。
解决方法:
- 给数据库表中字段名和对应java属性名不一致的地方在select语句中起别名。

- 通过**@Results,@Result**注解手动映射数据库字段和java类字段

column里面是数据库表字段名,property里面是java类字段名。 - 在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
条件查询

注意:
