提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、数据库表设计 + 主键唯一标识生成(采用 UUID)
- 1. 采用 UUID 生成唯一标识符(ID)
- 2. 数据库表设计
- 3. 主键自增设计(不推荐)
- 总结
- 二、Mybatis入门
- 三、Mybatis基础操作
- 1 需求
- 2 准备
- 3 删除
- 3.1 功能实现
- 3.2 Mybatis日志输入
- 3.3 预编译SQL
- 3.3.1 介绍
- 3.3.2 SQL注入
- 3.3.3 SQL语句中参数占位符#{...}
- 4 新增
- 4.1 基本新增
- 4.2 主键返回功能(如果主键是自增就需要用这个功能)
- 5 更新
- 6 查询
- 四. Mybatis的XML配置文件
- 1 XML配置文件规范
- 2 XML配置文件实现
- 3 MybatisX的使用
- 五 Mybatis动态SQL
- 1 什么是动态SQL
- 2 动态SQL: < if test="条件表达式">要拼接的sql语句< /if>
- 2.1 条件查询:`<where>`只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR
- 2.2 更新员工:`<set>`:动态的在SQL语句中插入set关键字,并会删掉额外的逗号。(用于update语句中)
- 3 动态SQL-foreach:多用于批量操作,例如批量删除、插入、更新等等
- 3.1 核心属性
- 3.2 常见场景
- 3.2.1 批量删除:IN 条件查询
- 3.2.2 批量插入
- 3.2.3 批量动态更新条件
- 3.3 具体案例
- 4 动态SQL:sql&include
- 5 动态SQL: resultType(必选)和parameterType(可选) 是定义 SQL 映射时的两个重要属性
- 5.1 resultType 的作用
- 5.2. parameterType的作用
- 5.3 总结
前言
1 先安装一个DBeaver客户端连接上数据库(后面我们会使用这个客户端操作数据库)
DBeaver安装与使用教程(超详细安装与使用教程),好用免费的数据库管理工具
DBeaver驱动连接错误解决方法(提示:com.mysql.cj.jdbc.Driver错误)
DBeaver出现Network Unavailable错误解决办法
测试连接:Public Key Retrieval is not allowed错误
这是连接 8.0 以上版本的MySQL有可能出现的错误
直接切换url连接,后面加上一个为true的字段,这样就可以解决了
连接数据库的url解释:
- jdbc:mysal://localhost:3306/[数据库名]
mybatis_29">2 准备一个数据库:mybatis
下面所有操作都会在这个数据库下面进行操作。
一、数据库表设计 + 主键唯一标识生成(采用 UUID)
1. 采用 UUID 生成唯一标识符(ID)
UUID(通用唯一标识符):
- UUID 是一个 128 位的数字,通常表示为 32 个十六进制字符,分为 5 组,形式为
8-4-4-4-12
。 - 优点:
- 全局唯一,生成简单。
- 可以用来设置数据库字符串类型的主键。
- 缺点:
- 较长,设置成的字符串主键不能自增。
- 每插入一条新的数据都要手动赋值。
Java 生成 UUID 示例:
import java.util.UUID;public class UniqueIdGenerator {public static String generateUniqueId() {return UUID.randomUUID().toString();}
}
全局唯一的含义:
- 唯一性:生成的 ID 在理论上是独一无二的,不会与其他系统或同一系统中的其他 ID 重复。
- 全局性:这种唯一性不仅限于当前系统或数据库,而是在全球范围内都有效。例如,UUID 是基于时间、机器标识、随机数等因素生成的,几乎不可能重复。
这种特性使得生成的 UUID 字符串十分适合作为数据库表的字符类型主键。
2. 数据库表设计
字段类型设计原则:
- 一般我们设计数据库字段类型,能设置成字符串就设置成字符串更加方便。
- 特别是数字类型,一定要变成字符串,不然数字越来越大存不下了。
示例表设计:
CREATE TABLE `rtvc_pattern` (`pattern_id` varchar(255) NOT NULL COMMENT 'pattern文件id',`pattern_name` varchar(128) NOT NULL COMMENT 'pattern文件名字',`product_id` varchar(255) NOT NULL COMMENT '产品id',`prod_name` varchar(100) DEFAULT NULL COMMENT '产品名称',`step_id` varchar(255) NOT NULL COMMENT '站点',`mode_type` varchar(32) DEFAULT NULL COMMENT '压缩模式',`array_type` varchar(32) DEFAULT NULL,`sys_release_state` char(2) DEFAULT NULL COMMENT '01:系统初始化pattern 02:用户发布的pattern',`user_id` varchar(128) DEFAULT NULL COMMENT '用户id',`release_state` varchar(2) DEFAULT NULL COMMENT '01:已发布 02:未发布',`program` varchar(100) DEFAULT NULL COMMENT '版本号',`pattern_status` char(2) DEFAULT NULL COMMENT '01:等待解析 02:解析成功',`create_pattern_component` varchar(100) DEFAULT NULL COMMENT '01:是 02:否',`head_content` text COMMENT 'pattern头部信息',`pattern_path` varchar(128) NOT NULL COMMENT '文件路径',`fileMD5_value` varchar(255) DEFAULT NULL,`file_type` varchar(6) DEFAULT NULL COMMENT '文件类型',`drafts_state` char(2) DEFAULT NULL COMMENT '是否编辑',`create_date` datetime DEFAULT NULL COMMENT '创建时间',`create_user` varchar(64) DEFAULT NULL COMMENT '创建人',`update_date` datetime DEFAULT NULL COMMENT '更新时间',`update_user` varchar(64) DEFAULT NULL COMMENT '更新人',PRIMARY KEY (`pattern_id`), -- 主键:pattern_id,表示该列是表的主键,用于唯一标识每一行KEY `rtvc_pattern_prod_name_IDX` (`prod_name`,`mode_type`,`program`,`array_type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键点:
- 主键:
pattern_id
,表示该列是表的主键,用于唯一标识每一行。- 这里主键是字符串类型,所以每次插入新的数据必须手动赋值(这里就要使用 UUID 了),这里没有自增属性。
- 索引:
- 索引名:
rtvc_pattern_prod_name_IDX
- 索引列:
prod_name
、mode_type
、program
、array_type
- 索引类型:
USING BTREE
,表示使用 B-Tree 索引。
- 索引名:
- 存储引擎和字符集:
- 存储引擎:
InnoDB
,支持事务和外键。 - 字符集:
utf8mb4
,支持更广泛的字符集,包括表情符号。
- 存储引擎:
3. 主键自增设计(不推荐)
如果非要设计主键自增,可以如下设计(但不推荐,建议使用 UUID):
CREATE TABLE `rtvc_pattern_timing_ts` (`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id', -- 改为 BIGINT 并添加 AUTO_INCREMENT`pattern_name` varchar(128) NOT NULL COMMENT 'pattern文件名字',`product_id` varchar(255) NOT NULL COMMENT '产品id',`ts_name` varchar(255) NOT NULL COMMENT 'TS名字',`ts_value` varchar(255) NOT NULL COMMENT '纳秒单位',`create_user` varchar(64) DEFAULT NULL COMMENT '创建人',`update_user` varchar(64) DEFAULT NULL COMMENT '更新人',`create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_date` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),INDEX `idx_ts_name` (`ts_name`), -- ts_name 单字段索引INDEX `idx_ts_value` (`ts_value`) -- ts_value 单字段索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键点:
- 主键:
id
,使用BIGINT
类型并添加AUTO_INCREMENT
,表示自增主键。 - 索引:
idx_ts_name
:ts_name
单字段索引。idx_ts_value
:ts_value
单字段索引。
总结
- UUID 适合作为数据库表的字符类型主键,确保全局唯一性。
- 字段类型设计:优先使用字符串类型,避免数字类型溢出问题。
- 主键设计:推荐使用 UUID 作为主键,避免自增主键的限制。
- 索引设计:根据查询需求为常用字段添加索引,提升查询性能。
二、Mybatis入门
在前面我们学习MySQL数据库时,都是利用图形化客户端工具(如:idea、datagrip),来操作数据库的。
在客户端工具中,编写增删改查的SQL语句,发给MySQL数据库管理系统,由数据库管理系统执行SQL语句并返回执行结果。
增删改操作:返回受影响行数
查询操作:返回结果集(查询的结果)
我们做为后端程序开发人员,通常会使用Java程序来完成对数据库的操作。Java程序操作数据库,现在主流的方式是:Mybatis。
什么是MyBatis?
-
MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。
-
MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
在上面我们提到了两个词:一个是持久层,另一个是框架。
- 持久层:指的是就是数据访问层(dao),是用来操作数据库的。
- 框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础上进行软件开发更加高效、规范、通用、可拓展。
1 SpringBoot整合Mybatis快速入门
Mybatis会把数据库执行的查询结果,使用实体类封装起来(一行记录对应一个实体类对象)
下面我们就以这个查询用户表中所有用户信息的例子来快速入门。
Mybatis操作数据库的步骤:
(1)准备工作(创建springboot工程、数据库表user、实体类User)
(2)引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
(3)编写SQL语句(注解/XML)
1.1 准备工作
1.1.1 创建springboot工程
创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包。
项目工程创建完成后,自动在pom.xml文件中,导入Mybatis依赖和MySQL驱动依赖
<!-- 仅供参考:只粘贴了pom.xml中部分内容 -->
<dependencies><!-- mybatis起步依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version></dependency><!-- mysql驱动包依赖 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- spring单元测试 (集成了junit) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
1.1.2 数据准备
创建用户表user,并创建对应的实体类User。
- 用户表:
-- 用户表
CREATE TABLE `user` (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',name VARCHAR(100) COMMENT '姓名',age TINYINT COMMENT '年龄',gender TINYINT COMMENT '性别, 1:男, 2:女',phone VARCHAR(11) COMMENT '手机号'
) COMMENT '用户表';-- 省略 id 列,并给表名加上反引号
INSERT INTO `user` (name, age, gender, phone)
VALUES
('白眉鹰王', 55, 1, '18800000000'),
('金毛狮王', 45, 1, '18800000001'),
('青翼蝠王', 38, 1, '18800000002'),
('紫衫龙王', 42, 2, '18800000003'),
('光明左使', 37, 1, '18800000004'),
('光明右使', 48, 1, '18800000005');
-
实体类
-
实体类的属性名与表中的字段名一一对应。(后面会讲属性名和表中字段名不对应怎么映射)
public class User {private Integer id; //id(主键)private String name; //姓名private Short age; //年龄private Short gender; //性别private String phone; //手机号public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Short getAge() {return age;}public void setAge(Short age) {this.age = age;}public Short getGender() {return gender;}public void setGender(Short gender) {this.gender = gender;}public String getPhone() {return phone;}public void