7 SpringBoot框架(下):整合数据库(正好Mybatis)、主键唯一标识生成(UUID)、DBeaver客户端连接数据库

news/2025/2/22 22:44:27/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、数据库表设计 + 主键唯一标识生成(采用 UUID)
    • 1. 采用 UUID 生成唯一标识符(ID)
    • 2. 数据库表设计
    • 3. 主键自增设计(不推荐)
    • 总结
  • 二、Mybatis入门
    • 1 SpringBoot整合Mybatis快速入门
      • 1.1 准备工作
        • 1.1.1 创建springboot工程
        • 1.1.2 数据准备
      • 1.2 配置Mybatis(application.properties配置文件)
      • 1.3 编写SQL语句
      • 1.3 单元测试
    • 2 Mybatis操作数据库底层原理:JDBC、数据库连接池(Mybatis切换数据库连接池技术为Druid )
    • 3. lombok工具使用
      • 3.1 介绍
      • 4.2 使用
  • 三、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 查询
      • 6.1 根据ID查询
      • 6.2 数据封装(实体和数据库字段映射:起别名、结果映射、开启驼峰命名格式)
        • 6.2.1 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样
        • 6.2.2 手动结果映射:通过 @Results及@Result 进行手动结果映射
        • 6.2.3 开启驼峰命名(推荐):如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射
      • 6.3 模糊查询注意事项
      • 6.4 参数名说明
  • 四. 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/[数据库名]
    • jdbc:mysal:// 是固定协议内容
    • localhost:3306 服务器ip和端口
    • [数据库名] 是可选项,加上了就连接指定数据库,不加上就会连接所有数据库

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_namemode_typeprogramarray_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_namets_name 单字段索引。
    • idx_ts_valuets_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。

  • 官网:https://mybatis.org/mybatis-3/zh/index.html

在上面我们提到了两个词:一个是持久层,另一个是框架。

  • 持久层:指的是就是数据访问层(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 

http://www.ppmy.cn/news/1572854.html

相关文章

osgearth控件显示中文(八)

当前自己知道的方法大概有以下两种: (一)直接转成utf8 其实在前面的文章中已经有了。 osgEarth::Annotation::PlaceNode *pn = new osgEarth::Annotation::PlaceNode(GeoPoint(geoSRS, 110, 34), String2UTF8("中国"), style);std::wstring String2Wstring(con…

Vue 入门到实战 十

第10章 Vue Router​​​​​​​ 目录 10.1 什么是路由 10.2 Vue Router的安装 10.2.1 本地独立版本方法 10.2.2 CDN方法 10.2.3 NPM方法 10.2.4 命令行工具&#xff08;Vue CLI&#xff09;方法 10.3 Vue Router的基本用法 10.3.1 跳转与传参 10.3.2 配置路由 10.…

DeepSeek R1本地部署 DeepSeek Api接口调用 java go版本

1、本地ollama的API接口 接着上一章所本地部署deepseek&#xff0c;这一章我们调用ollama api 对应的curl&#xff1a; curl --request POST \--url http://localhost:11434/api/generate \--header Accept: */* \--header Accept-Encoding: gzip, deflate, br \--header Con…

深度学习与人工智能:解锁未来的无限可能

在当今这个科技飞速发展的时代&#xff0c;深度学习和人工智能已不再只是科幻小说中的概念&#xff0c;它们正以惊人的速度渗透到我们生活的方方面面&#xff0c;从智能手机上的语音助手到医疗领域的疾病诊断&#xff0c;从自动驾驶汽车到金融市场的风险预测&#xff0c;其影响…

驱动开发系列38 - Linux Graphics 3D 绘制流程(一)- 创建画布

一:概述 当应用程序创建 OpenGL 上下文时,它通常需要申请帧缓冲(Framebuffer,即画布)。在 X11 体系下,应用程序不会直接向内核的 DRM 模块请求创建帧缓冲,而是通过 X 服务器进行申请。 虽然从技术上讲,应用程序可以直接使用 DRM 接口创建帧缓冲对象(BO),但为了将其与…

uniapp商城之首页模块

文章目录 前言一、自定义导航栏1.静态结构2.修改页面配置3.组件安全区适配二、通用轮播组件1. 静态结构组件2.自动导入全局组件3.首页轮播图数据获取三、首页分类1.静态结构2.首页获取分类数据并渲染四、热门推荐1.静态结构2.首页获取推荐数据并渲染3.首页跳转详细推荐页五、猜…

SpringBoot实战:高效获取视频资源

文章目录 前言技术实现SpringBoot项目构建产品选取配置数据采集 号外号外 前言 在短视频行业高速发展的背景下&#xff0c;海量内容数据日益增长&#xff0c;每天都有新的视频、评论、点赞、分享等数据涌现。如何高效、精准地获取并处理这些庞大的数据&#xff0c;已成为各大平…

Spring Cloud — 微服务容错保护 Hystrix入门

微服务之间是通过网络进行相互调用&#xff0c;如果单个服务出现问题&#xff0c;用户调用相关服务时或造成调用延迟或失败&#xff0c;进而可能让整个系统奔溃。提前做好应急措施&#xff0c;当遇到问题时&#xff0c;可及时启动应急方案&#xff0c;让系统进行自我调节和保护…