Part01 ☀️
Part01 ☀️
课程内容
- 编程环境安装
- JDK安装Java运行环境
- Idea工具安装编码工具
- Idea编程插件提高编码速度!
- 项目搭建
- 项目说明和创建项目
- 面向对象语法回顾
- Swing介绍和常用组件介绍
- 登录页面实现
- 登录逻辑实现
- 注册逻辑实现
1. 实训编码的环境1
实训编码的环境
代码操作
🎯1. JDK

JDK是 java 运行环境配置的工具包,能够是 java 程序运行更加方便顺畅,帮助用户进行编程开发时代码数据库调用,
安装 JDK 是学习 java 程序语言的第一步
JDK 是整个 java 程序的核心,包含 java 运行环境、java 工具和 java 基础类库等,是 java 语言开发工作者必备的工具,让编程更加高效和简单。
安装和教程如下:

jdk-11.0.20_windows-x64_bin是JDK11的版本
jdk-8u162-windows-x64.exe是JDK8的版本
- 说明:
安装 JDK 后,配置环境变量 JAVA_HOME,并且在
cmd窗口中,输入java -version提示如下图
验证是否安装JDK,并且配置好环境变量

- Java 现在发布的版本很快,有很多版本,但是真正会被大规模使用的是 3 年一个的 LTS 版本。每 3 年发布一个 LTS(Long-Term Support),长期维护版本。意味着只有Java 8 ,Java 11, Java 17,Java 21 才可能被大规模使用。
- 企业开发中主流都是使用 jdk8或者JDK11,JDK8的版本是 2014 年发布的,JDK11的版本是 2018 年发布的,JDK17的版本是 2021 年发布的
- 本项目会使用AI大模型,因此需要安装JDK17以上的版本

🎯 2. Idea

- IDEA 全称 IntelliJ IDEA,是 java 编程语言的集成开发环境。
- IntelliJ 在业界被公认为最好的 Java 开发工具,尤其在AI代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具(git、svn 等)、JUnit(单元测试)、代码分析、 创新UI设计等方面的功能非常好用。
- IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。它的旗舰版还支持 HTML,CSS,PHP,MySQL,Python


- 安装和教程如下:

😃 安装任何一个版本都可以,编码都是一样的哦,无非就是新版本的支持的插件稍微多一些,皮肤跟好看一点
- 安装注意事项:
- 安装 idea 后,会提示是否试用,可以选择试用(30 天)
- 也可以使用免费版(社区版),但是免费版的功能有限

🎯 3. Maven

Maven 是专门用于管理和构建 Java 项目的工具Java开发几乎必用
安装教程:看焱哥在U盘或者网盘中对应的截图(只有三步哦)
Maven是什么,有什么用?后面再讲,现在先把软件安装好 👈

🎯 4. MySQL



Monty,是MySQL的CTO和联合创始人,撰写了MySQL95%的服务器端代码。在MySQL以10亿美元的价格被卖给SUN,SUN又被Oracle收购后,MySQL的所有权也落入Oracle的手中。为了保持MySQL的开源使用不受影响,Monty又在2009年创立了MariaDB。
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。
MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
项目使用 MySQL5.7或Mysql8.0版本已经安装了,不需要重装
4.1 Mysql安装包
跳转到 顶部的
环境、软件安装中下载资料中下载

注意: 如果不清楚已经是否安装了Mysql,可以查看任务管理器中的服务,是否有mysql的服务


🎯 5. 截图贴图软件
Snipaste 是一个简单但强大的贴图工具,同时也可以执行截屏、贴图、标注等功能。
你可以将代码的主要思路和语法,截图贴在屏幕的右上角上,方便你随时查看,提高编码效率
- 安装方式:压缩包解压缩后,点击启动程序即可使用(右下角会出现图标),不需要安装。

- 快捷键:
- 截屏 :默认为 F1
- 贴图 :默认为 F3
总结
课堂作业
- 参考上述讲义,完成软件和插件的安装!🎤
如果不清楚自己是否装了,可以举手问焱哥
2. 常用插件
常用插件
安装插件前,关闭电脑所有的防火墙

🎯 MavenHelper
Maven Helper
可以帮助我们在 IDEA 中更好地开发 maven 项目,主要功能包括:
- 更方便地执行 maven 命令;
- 分析和排除 Maven 冲突;
- 自定义 Maven goals;
- 在当前 Module 所在的路径中打开 Terminal;

很方便的调用maven的命令,而不需要点击右侧的栏目

🎯 MybatisX

MybatisX 插件可以让我们更方便地使用 Mybatis, 主要功能包括:
- 关联 Mapper 文件和 xml 文件,并且支持快速跳转;
- 代码提示;



🎯 Lombok
合理地使用 Lombok
可以极大程度地简化代码,让代码的可读性更强。 Lombok 插件让 IDEA 拥有兼容 Lombok 的能力。
@Slf4j酸辣粉日志注解:方便输出日志@Data注解: 可以免除set和get方法 需要导入依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>

🎯 TongYi
通义灵码,你的智能编码助手。你可以问我关于编码相关的问题,我们一起更高效率、更高质量地完成编码工作



用过的,都说好!👍

🎯 自动导包的设置

可以这样设置👇

3. 项目说明
3.1 PMS医药管理系统的数据库设计
前言
1.1 系统定位
PMS医药管理系统(Pharmacy Management System)是面向医药企业的轻量化库存与业务管理平台,核心覆盖用户权限、药品分类、药品档案、入库管理、出库管理、库存监控六大模块,支持药品全生命周期追溯与库存精准管控。
1.2 设计原则
- 简化业务:去除明细表,单张入库/出库单仅支持一种药品,降低操作复杂度;
- 扁平分类:分类表采用平铺结构(无层级),通过“分类类型”区分业务场景;
- 字段对齐实体:数据库字段与Java实体类严格映射(如用户表
nickname、telphone); - 可追溯性:记录操作时间、批次、操作人,支持库存变动溯源;
- 性能优先:库存表冗余存储当前库存量,避免高频联表计算。
1.3 实体关系图(E-R图)

- 用户:1:N关联入库单/出库单(操作关系);
- 分类:1:N关联药品(分类包含药品);
- 药品:1:N关联库存(药品可有多批次库存);
- 入库单/出库单:N:1关联药品(单据对应一种药品)。
1.4 表清单与核心字段说明
| 表名 | 功能描述 | 核心字段(中文) |
|---|---|---|
| t_user(用户表) | 存储系统用户信息 | 用户ID、登录账号、昵称、加密密码、角色、联系电话、创建时间、更新时间 |
| t_category(分类表) | 存储药品分类(平铺结构) | 分类ID、分类编码、分类名称、分类类型、状态、排序序号、描述、创建时间、更新时间 |
| t_drug(药品表) | 存储药品基础档案 | 药品ID、药品编码、药品名称、规格、生产厂家、批准文号、参考零售价、所属分类ID、状态、创建时间 |
| t_stock_in(入库单表) | 存储药品入库记录 | 入库单ID、入库单号、供应商、药品ID、批次号、生产日期、效期、入库数量、入库单价、总金额、操作人ID、入库时间、备注 |
| t_stock_out(出库单表) | 存储药品出库记录 | 出库单ID、出库单号、客户名称、药品ID、批次号、出库数量、出库单价、总金额、操作人ID、出库时间、备注 |
| t_inventory(库存表) | 存储药品实时库存(含批次) | 库存ID、药品ID、批次号、当前库存量、最后更新时间 |
1.5 详细表结构(关键字段约束)
1.5.1 用户表(t_user)
| 字段名(英文) | 字段名(中文) | 类型 | 约束条件 | 说明 |
|---|---|---|---|---|
| id | 用户ID | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 用户唯一标识(Java Long) |
| username | 登录账号 | VARCHAR(50) | UNIQUE, NOT NULL | 登录用户名(唯一) |
| nickname | 昵称 | VARCHAR(50) | - | 显示用昵称(可为空) |
| password | 加密密码 | VARCHAR(255) | NOT NULL | BCrypt加密存储 |
| role | 角色 | VARCHAR(20) | NOT NULL | 枚举值:admin/purchaser/warehouse/sales |
| telphone | 联系电话 | VARCHAR(20) | - | 手机号或固话(可为空) |
| create_time | 创建时间 | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 记录创建时间 |
| update_time | 更新时间 | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 记录最后更新时间 |
1.5.2 分类表(t_category)
| 字段名(英文) | 字段名(中文) | 类型 | 约束条件 | 说明 |
|---|---|---|---|---|
| id | 分类ID | INT | PRIMARY KEY, AUTO_INCREMENT | 分类唯一标识 |
| category_code | 分类编码 | VARCHAR(50) | UNIQUE, NOT NULL | 唯一编码(如"A001") |
| name | 分类名称 | VARCHAR(100) | NOT NULL | 分类显示名称 |
| type | 分类类型 | VARCHAR(50) | NOT NULL | 业务类型(如"西药"/"中药"/"耗材") |
| status | 状态 | TINYINT | NOT NULL, DEFAULT 1 | 0-停用/1-启用 |
| sort_order | 排序序号 | INT | DEFAULT 0 | 界面排序依据(升序) |
| description | 描述 | VARCHAR(500) | - | 备注说明(可为空) |
| create_time | 创建时间 | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 记录创建时间 |
| update_time | 更新时间 | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 记录最后更新时间 |
1.5.3 药品表(t_drug)
| 字段名(英文) | 字段名(中文) | 类型 | 约束条件 | 说明 |
|---|---|---|---|---|
| id | 药品ID | INT | PRIMARY KEY, AUTO_INCREMENT | 药品唯一标识 |
| drug_code | 药品编码 | VARCHAR(50) | UNIQUE, NOT NULL | 唯一编码(如"YP2023001") |
| drug_name | 药品名称 | VARCHAR(200) | NOT NULL | 药品通用名称 |
| specification | 规格 | VARCHAR(100) | - | 规格(如"0.25g*24片") |
| manufacturer | 生产厂家 | VARCHAR(200) | - | 生产企业名称 |
| approval_number | 批准文号 | VARCHAR(100) | UNIQUE | 国家药监局批准文号 |
| reference_price | 参考零售价 | DECIMAL(10,2) | - | 参考售价(元) |
| category_id | 所属分类ID | INT | FOREIGN KEY (category_id) REFERENCES t_category(id) ON DELETE RESTRICT | 关联分类表 |
| status | 状态 | TINYINT | DEFAULT 1 | 0-停用/1-在用 |
| create_time | 创建时间 | DATETIME | DEFAULT CURRENT_TIMESTAMP | 记录创建时间 |
1.5.4 入库单表(t_stock_in)
| 字段名(英文) | 字段名(中文) | 类型 | 约束条件 | 说明 |
|---|---|---|---|---|
| id | 入库单ID | INT | PRIMARY KEY, AUTO_INCREMENT | 入库单唯一标识 |
| in_no | 入库单号 | VARCHAR(50) | UNIQUE, NOT NULL | 规则:"RK+年月日+3位序号"(如RK20231001001) |
| supplier | 供应商 | VARCHAR(200) | NOT NULL | 供应商名称 |
| drug_id | 药品ID | INT | FOREIGN KEY (drug_id) REFERENCES t_drug(id) ON DELETE RESTRICT | 关联药品表 |
| batch_no | 批次号 | VARCHAR(50) | NOT NULL | 厂家生产批次号 |
| production_date | 生产日期 | DATE | NOT NULL | 药品生产日期 |
| expiry_date | 效期 | DATE | NOT NULL | 有效期至(需>当前日期) |
| quantity | 入库数量 | INT | NOT NULL, CHECK (quantity > 0) | 入库件数 |
| unit_price | 入库单价 | DECIMAL(10,2) | NOT NULL | 单价(元) |
| total_amount | 总金额 | DECIMAL(12,2) | GENERATED ALWAYS AS (quantity * unit_price) STORED | 自动计算(数量×单价) |
| operator_id | 操作人ID | INT | FOREIGN KEY (operator_id) REFERENCES t_user(id) ON DELETE RESTRICT | 关联用户表(操作人) |
| in_time | 入库时间 | DATETIME | DEFAULT CURRENT_TIMESTAMP | 入库操作时间 |
| remark | 备注 | VARCHAR(500) | - | 补充说明(可为空) |
1.5.5 出库单表(t_stock_out)
| 字段名(英文) | 字段名(中文) | 类型 | 约束条件 | 说明 |
|---|---|---|---|---|
| id | 出库单ID | INT | PRIMARY KEY, AUTO_INCREMENT | 出库单唯一标识 |
| out_no | 出库单号 | VARCHAR(50) | UNIQUE, NOT NULL | 规则:"CK+年月日+3位序号"(如CK20231001001) |
| customer | 客户名称 | VARCHAR(200) | NOT NULL | 客户(医院/药店/个人) |
| drug_id | 药品ID | INT | FOREIGN KEY (drug_id) REFERENCES t_drug(id) ON DELETE RESTRICT | 关联药品表 |
| batch_no | 批次号 | VARCHAR(50) | NOT NULL | 出库批次号(需校验库存) |
| quantity | 出库数量 | INT | NOT NULL, CHECK (quantity > 0) | 出库件数(≤批次库存) |
| unit_price | 出库单价 | DECIMAL(10,2) | NOT NULL | 单价(元) |
| total_amount | 总金额 | DECIMAL(12,2) | GENERATED ALWAYS AS (quantity * unit_price) STORED | 自动计算(数量×单价) |
| operator_id | 操作人ID | INT | FOREIGN KEY (operator_id) REFERENCES t_user(id) ON DELETE RESTRICT | 关联用户表(操作人) |
| out_time | 出库时间 | DATETIME | DEFAULT CURRENT_TIMESTAMP | 出库操作时间 |
| remark | 备注 | VARCHAR(500) | - | 补充说明(可为空) |
1.5.6 库存表(t_inventory)
| 字段名(英文) | 字段名(中文) | 类型 | 约束条件 | 说明 |
|---|---|---|---|---|
| id | 库存ID | INT | PRIMARY KEY, AUTO_INCREMENT | 库存记录唯一标识 |
| drug_id | 药品ID | INT | FOREIGN KEY (drug_id) REFERENCES t_drug(id) ON DELETE CASCADE | 关联药品表 |
| batch_no | 批次号 | VARCHAR(50) | NOT NULL | 药品批次号 |
| current_quantity | 当前库存量 | INT | DEFAULT 0, CHECK (current_quantity >= 0) | 实时库存(≥0) |
| last_update_time | 最后更新时间 | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 库存变动时间(自动更新) |
1.6 入库流程(库存增加)
- 创建入库单:操作人(采购员/库管员)填写供应商、药品、批次、数量、单价等信息,系统生成唯一入库单号;
- 校验与保存:校验效期>当前日期、数量>0,保存入库单;
- 更新库存:根据
药品ID+批次号查找或创建库存记录,current_quantity += 入库数量,更新last_update_time; - 事务保障:入库单保存与库存更新在同一事务中,确保数据一致性。
1.7 出库流程(库存减少)
- 创建出库单:操作人(库管员/销售员)填写客户、药品、批次、数量、单价等信息,系统生成唯一出库单号;
- 校验库存:根据
药品ID+批次号查询库存,current_quantity ≥ 出库数量则允许出库; - 保存与扣减:保存出库单,
current_quantity -= 出库数量,更新last_update_time; - 事务保障:出库单保存与库存扣减在同一事务中,避免超卖。
1.8 库存查询流程
- 单药品批次库存:直接查询
t_inventory表WHERE drug_id=? AND batch_no=?; - 药品总库存:
SELECT SUM(current_quantity) FROM t_inventory WHERE drug_id=?; - 低库存预警:定时任务扫描
t_inventory表current_quantity < 阈值的记录,触发告警。
1.9 注意事项
- 一次多药品入库/出库:需拆分为多张单据(因无明细表);
- 分类编码唯一性:
category_code需全局唯一,避免重复; - 密码安全:
password字段需BCrypt加密存储,禁止明文; - 效期校验:入库时
expiry_date必须>当前日期,避免无效库存; - 并发控制:库存更新需通过事务+行锁(
SELECT ... FOR UPDATE)避免超卖。
3.2 Maven入门 ✏️
Maven入门
在创建项目之前,先要熟悉一下Maven的作用
Maven是一个项目管理工具,可以对Java项目进行构建、依赖管理。
- Maven解决了什么问题?
- Maven的本地仓库中存的是什么?
- Maven中央仓库中有世界上所有的代码吗?
3.3 PMS医药管理系统的项目结构
前言
一、工程整体定位
技术栈:Java SE + MySQL(数据存储)+Mybatis(持久层) swing/JFreeChart(界面+图表)
核心目标:用“模块化”思维组织代码,让每个功能对应明确的文件夹,方便分工协作
二、标准Java工程结构
Maven是Java最常用的构建工具,能自动管理依赖(如JFreeChart的jar包),结构规范。
最终效果图
三、核心目录/文件说明:
entity/:实体类(POJO)——数据库的“镜像”
作用:把数据库表的每一行数据,映射成一个Java对象(如Drug类对应drug_info表),避免直接操作数据库的ResultSet(难维护)。
示例:Drug.java(药品实体)
dao/:数据访问层——直接操作数据库
- 作用 :封装所有数据库操作(如“查询所有药品”“插入入库记录”),上层(service)只需调用方法,不用关心SQL怎么写。
- 示例 :DrugDao.java(药品数据访问层)
service/:业务逻辑层——处理核心规则
- 作用 :调用dao层获取数据,处理业务逻辑(如“入库后更新库存”“计算当前库存=入库-出库”),是“数据”和“界面”之间的桥梁。
- 示例 :StockService.java(库存业务逻辑)
ui/:界面层——用户交互的窗口
- 作用 :用Swing写窗口(如登录窗口、药品管理窗口),调用service层的方法获取数据,展示给用户或接收用户输入。
- 示例 :LoginFrame.java(登录窗口)
resources/:资源文件——配置与脚本
- 作用 :存放配置文件(如数据库连接信息)
- 示例 :mybatis-config.xml(Mybatis配置文件)
pom.xml:Maven依赖配置(关键! )
- 作用 :告诉Maven,这个项目需要哪些jar包(如JFreeChart、Mybatis等)
- 示例 :pom.xml(Maven依赖配置文件)
先做“能用”再“完美”:先实现“药品录入→入库→库存查询”的核心流程,再补图表、预警等功能;
四、创建项目
熟悉了项目的结构,接下来,我们根据上面的结构,创建PMS医药管理系统的项目的架子吧!!! 👇 👇
- 打开IDEA,在欢迎页面,检查配置Maven仓库路径
- 创建空的Maven项目
- 根据上面的结构,创建项目的架子
- 在pom.xml文件中,添加Mybatis的起步依赖和MySQL驱动依赖
- Idea链接数据库(可选,也可以使用Navicat连接)
1. 打开IDEA,在欢迎页面,检查配置Maven仓库路径

2. 创建空的Maven项目


3. 根据上面的结构,创建项目的架子
在src-main-java下,先创建
cn.yangeit包,然后在这个包下创建entity、dao、service、ui文件夹和Application.java文件启动类,如下:👇


4. 在pom.xml文件中,添加Mybatis的起步依赖和MySQL驱动依赖
项目用到了其他的jar包,需要在pom.xml文件中添加依赖,不需要直接使用jar包,而是使用Maven的依赖管理机制,自动下载jar包。

<dependencies>
<!--小辣椒lombok依赖,可以免除getset方法,减少代码量-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
<!--mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!--hutool工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.37</version>
</dependency>
<!--Java Swing外观组件库-->
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf</artifactId>
<version>3.2</version>
</dependency>
</dependencies>
缺图
5. Idea链接数据库(可选,也可以使用Navicat连接)
5.1. 按照下图,连接数据库:👇

5.2. 创建pms数据库,设置编码为utf-8mb4,创建t_user表,并导入一下假数据
-- 创建数据库 mybatis
create database if not exists pms default character set utf8mb4 collate utf8mb4_general_ci;
-- 使用数据库
use pms;
-- 删除原有的user表
DROP TABLE IF EXISTS `t_user`;
-- 创建user表 有id,username,nickname,password,role,telphone,创建时间,更新时间
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL UNIQUE,
`nickname` varchar(32) NOT NULL,
`password` varchar(32) NOT NULL DEFAULT '12345678',
`role` varchar(32) NOT NULL DEFAULT 'user', -- user:普通用户,admin:管理员
`telphone` varchar(32) ,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
-- 插入数据
INSERT INTO `t_user` VALUES (1, 'admin', '管理员', '12345678', 'admin', '12345678901', '2024-06-25 16:00:00', '2024-06-25 16:00:00');
INSERT INTO `t_user` VALUES (2, 'zhangsan', '张三', '12345678', 'user', '12345678902', '2024-06-25 16:00:00', '2024-06-25 16:00:00');

如果在Idea中执行sQL,全选后,点击左上角的运行,会自动执行SQL语句,数据库和数据表会自动创建。

3.4 集成Mybatis
前言
根据上面的项目模块可知,我们的数据是存在数据库中的,我们需要从数据库中获取数据,所以我们需要一个工具来操作数据库,Mybatis就是一个工具,它可以帮助我们操作数据库。

接下来,我们就来集成Mybatis吧!!! 👇 👇
步骤如下:
- 在resources目录下,创建mybatis-config.xml文件,用于配置Mybatis,如数据库连接信息,Mybatis的映射文件路径等
- 在config目录下,创建MybatisConfig.java文件,用于配置Mybatis
- 在entity目录下,创建User.java实体类,用于存放数据库中的数据(字段和类型要和数据库中的字段和类型一致)
- 在dao目录下,创建UserDao.java文件和UserMapper.java接口,用于操作数据库
- 在resources目录下,创建mappers目录,用于存放Mybatis的映射文件
- 更新mybatis-config.xml文件,添加映射文件路径
- 在Application的main方法中,进行测试

提示:看上去很繁琐,其实一点也不简介,如果后期学习了SpringBoot,会发现SpringBoot已经帮我们做了这些步骤,只需要在配置文件中配置数据库连接信息,就可以直接使用了。
1. 在resources目录下,创建mybatis-config.xml文件,用于配置Mybatis,如数据库连接信息,Mybatis的映射文件路径等

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 驼峰命名规则 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 数据库连接信息 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/pms?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件路径 -->
<mappers>
</mappers>
</configuration>

2. 在config目录下,创建MybatisConfig.java文件,用于配置Mybatis

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
/**
* @description: mybatis 配置类 加载mybatis-config.xml
* 采用单例模式
*/
public class MybatisConfig {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
e.printStackTrace();
}
}
private MybatisConfig() {
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
3. 在entity目录下,创建User.java实体类,用于存放数据库中的数据(字段和类型要和数据库中的字段和类型一致)

User.java类
import lombok.Data;
import java.time.LocalDateTime;
/**
* @Description 用户实体类(字段和类型要与数据库字段和类型一致)
*/
@Data
public class User {
private Long id;
private String username;
private String nickname;
private String password;
private String role;
private String telphone;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
4. 在dao目录下,创建UserDao.java文件和UserMapper.java接口,用于操作数据库
UserDao.java这个是一个类,主要对外提供一个方法,用于获取SqlSession对象,然后通过SqlSession对象,获取UserMapper对象,然后调用UserMapper对象的方法,来操作数据库。
package cn.yangeit.dao;
import cn.yangeit.config.MybatisConfig;
import cn.yangeit.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
/**
* @description: 用户数据访问层 对外提供方法
*/
public class UserDao {
private SqlSessionFactory sqlSessionFactory;
// 构造方法,用于获取SqlSessionFactory对象
public UserDao() {
sqlSessionFactory = MybatisConfig.getSqlSessionFactory();
}
/**
* 根据用户名查询用户
*
* @param username 用户名
* @return 用户
*/
public User getUserByUsername(String username) {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserByUsername(username);
sqlSession.close();
return user;
}
/**
* 添加用户
*
* @param user 用户
* @return 添加结果
*/
public int addUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int count = userMapper.addUser(user);
sqlSession.commit();
sqlSession.close();
return count;
}
}
UserMapper.java 这个是一个接口,主要定义了操作数据库的方法,如查询用户,添加用户等。
import cn.yangeit.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
// 用户映射接口,用于定义用户映射的方法
//此处为了方便演示,通过@Select注解和@Insert注解来定义方法
public interface UserMapper {
@Select("select * from user where username = #{username}")
User getUserByUsername(String username);
int addUser(User user);
//查询用户列表(不显示密码)
@Select("select id, username, nickname, role, telphone, create_time, update_time from user")
List<User> getAllUsersWithoutPassword();
//删除用户
@Delete("delete from user where id = #{id}")
int deleteUser(Long id);
//修改密码
@Update("update user set password = #{password} where id = #{id}")
int updatePassword(Long id, String password);
}
5. 在resources目录下,创建mappers目录,用于存放Mybatis的映射文件
UserMapper.xml 这个是映射文件,用于定义映射方法的SQL语句。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.yangeit.dao.UserMapper">
<insert id="addUser">
insert into user(username,nickname,password,role,telphone,create_time,update_time)
values (#{username},#{nickname},#{password},#{role},#{telphone},#{createTime},#{updateTime})
</insert>
</mapper>
注意: namespace的值要和UserMapper接口的全类名一致

6. 更新MybatisConfig.java文件,添加映射文件路径

7. 测试
在Application中创建一个testUserMapper方法,用于测试UserMapper接口的方法。👇

恭喜你,完成了项目搭建,接下来就可以完成其他模块了

