题目1
SpringBoot下集成Mybatis框架(XML/注解/动态sql)

MyBatis 是一个持久层框架,用于简化 Java 应用程序与关系型数据库的交互。它通过将 SQL 语句与 Java 代码进行映射,提供了一种方便且灵活的方式来访问和操作数据库。
1. 作用
MyBatis 解决了传统 JDBC 编程中的一些问题,包括:
- 简化数据库访问jdbc操作非常繁琐:MyBatis 提供了简洁的 API 和灵活的配置方式,减少了编写繁琐的 JDBC 代码的工作量。
- 提供对象-关系映射:MyBatis 可以将数据库表中的数据映射到 Java 对象上,通过对象来进行数据的操作和处理,减少了手动处理结果集的复杂性。
- 支持动态 SQL:MyBatis 允许在 XML 配置文件中编写动态 SQL 语句,根据不同条件生成不同的 SQL,提供了更大的灵活性和可扩展性。
- 提供缓存机制:MyBatis 提供了一级缓存和二级缓存的支持,可以提高数据访问性能,减少对数据库的频繁访问。
2.配置说明
当使用 MyBatis 框架时,以下是配置要求的一些主要方面:
数据源配置:需要配置数据库的连接信息,包括数据库驱动、连接 URL、用户名和密码等。这些配置通常在 MyBatis 的配置文件中进行设置。
Mapper 文件配置:需要为每个数据访问对象(DAO)编写对应的 Mapper 文件,用于定义 SQL 语句和结果映射。Mapper 文件通常使用 XML 格式 ,也可以使用注解的方式进行配置。
映射配置:Mapper 文件中需要配置每个 SQL 语句与 Java 方法之间的映射关系,包括 SQL 语句的编写、参数映射和结果映射。可以使用 XML 格式或注解方式进行映射配置。
配置文件Boot项目不需要:MyBatis 需要一个主配置文件(通常命名为 mybatis-config.xml )来指定全局配置,例如类型别名、插件、缓存设置等。此外,还需要配置数据源和事务管理器等。
使用框架和依赖:在项目中使用 MyBatis 框架时,需要添加相应的依赖,例如 mybatis 和 mybatis-spring。这些依赖需要在项目的构建文件(如 Maven 的 pom.xml)中进行配置。
事务管理:如果需要在数据访问过程中进行事务管理,需要配置事务管理器,并确保每个数据访问操作在正确的事务上下文中执行。
运行环境配置:在一些特定的场景下,可能需要进行一些额外的配置,例如分页插件的配置、缓存设置的调优等。
3. SpringBoot下集成Mybatis
如果左边的知识,了解了,那么可以进行Mybatis初体验了!!👇
在体验之前,需要做如下准备工作:
- 项目工程创建完成后,在pom.xml文件中的dependencies标签内,导入Mybatis的起步依赖和MySQL驱动依赖
<!-- lombok的依赖,能免除get和set方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
<!-- mybatis的起步依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!-- mysql驱动包依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
准备数据
- 创建mybatis数据库,设置编码为utf-8mb4,创建user表,并导入一下假数据
-- 删除原有数据库
DROP TABLE IF EXISTS `user`;
-- 创建user表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL UNIQUE,
`password` varchar(32) NOT NULL DEFAULT '12345678',
`age` int(10) NOT NULL,
`hobby` varchar(50) DEFAULT NULL,
`description` varchar(200) NOT NULL,
`department` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('8', '赵灵儿', '12345678', '20', '阵法、法术修炼', '纯真善良的女子,拥有强大的阴阳之力', '阴阳家');
INSERT INTO `user` VALUES ('9', '楚留香', '12345678', '32', '剑术、侠义行侠', '风流倜傥的豪客,以智慧和剑术征服江湖', '江湖人士');
INSERT INTO `user` VALUES ('10', '白浅', '12345678', '26', '宫廷舞蹈、仙法修炼', '美丽高贵的仙子,守护爱与正义的力量', '青丘派');
INSERT INTO `user` VALUES ('11', '苏明玉', '12345678', '29', '医术、家族事务', '聪明伶俐的女医生,心系家族兴衰', '苏家');
INSERT INTO `user` VALUES ('13', '李逍遥', '12345678', '28', '剑术、侠义行侠', '潇洒自如的剑客,为爱与正义奋斗', '天墉城');
INSERT INTO `user` VALUES ('14', '陆展元', '12345678', '31', '龙族法术、海洋探险', '勇敢善良的龙族王子,探索海洋奥秘', '东海龙宫');
INSERT INTO `user` VALUES ('18', '萧炎', '12345678', '25', '功夫、修炼', '机缘巧合下拥有强大火焰之力的少年', '草庙村');
INSERT INTO `user` VALUES ('19', '陆九淳', '12345678', '29', '家族事务、剑术修炼', '家族责任重于一切的江湖少年', '陆家');
INSERT INTO `user` VALUES ('20', '韩立', '12345678', '22', '灵力修炼、阵法研究', '机智聪明的年轻修士,掌握神奇的法术', '韩家');
INSERT INTO `user` VALUES ('21', '顾惜朝', '12345678', '28', '法术修炼、守护门派', '心地善良的女子,为守护门派而战', '古玄门');
INSERT INTO `user` VALUES ('22', '九霄真人', '12345678', '35', '仙法修炼、教导弟子', '威严正直的仙人,指导后辈修仙道路', '蓝霞宫');
INSERT INTO `user` VALUES ('23', '姬昌', '12345678', '33', '阴阳术、仙法修炼', '智勇双全的江湖人物,掌握阴阳之力', '太阴派');
INSERT INTO `user` VALUES ('24', '西门吹雪', '12345678', '30', '剑术、侠义行侠', '风流倜傥的剑客,执着追求剑道境界', '独孤家');
INSERT INTO `user` VALUES ('25', '夏冰', '12345678', '26', '魔法修炼、冰雪之力', '美丽神秘的女子,掌握冰雪之力', '幻冥宗');
INSERT INTO `user` VALUES ('26', '杨影枫', '12345678', '27', '暗器、侠义行侠', '冷酷无情的刺客,为正义而战', '影家');
INSERT INTO `user` VALUES ('27', '白素素', '12345678', '24', '文学创作、人界事务', '善良纯真的女子,用文字记录人间百态', '人界');
INSERT INTO `user` VALUES ('28', '独孤剑', '12345678', '32', '剑术、侠义行侠', '心系家族的剑客,剑法高超', '独孤家');
INSERT INTO `user` VALUES ('29', '楚九霄', '12345678', '28', '阵法、家族事务', '机智聪明的年轻人,心系家族荣耀', '楚家');
INSERT INTO `user` VALUES ('30', '谢晓峰', '12345678', '31', '拳脚功夫、江湖恩怨', '正直勇敢的江湖豪杰,忠于兄弟情义', '铁血帮');
INSERT INTO `user` VALUES ('31', '叶孤城', '12345678', '29', '剑术、侠义行侠', '冷酷无情的剑客,追求剑道极致', '武境城');
INSERT INTO `user` VALUES ('32', '李逸风', '12345678', '25', '修炼、探险', '热血青年,勇往直前探索未知世界', '蓝枫大陆');
INSERT INTO `user` VALUES ('33', '萧霜', '12345678', '27', '冰雪法术、守护宗门', '冷艳高傲的女子,守护冰霜宗的利益', '冰霜宗');
INSERT INTO `user` VALUES ('34', '楚玉峰', '12345678', '30', '家族事务、阵法修炼', '机智聪明的年轻人,家族责任重于一切', '楚家');
INSERT INTO `user` VALUES ('35', '陆雪琪', '12345678', '24', '法术、修行', '美丽冷傲的仙子,修炼法术追求修行境界', '青云门');
INSERT INTO `user` VALUES ('36', '明月心', '12345678', '26', '琴音、舞蹈', '温柔善良的女子,以音乐传递爱与希望', '云裳派');
INSERT INTO `user` VALUES ('37', '程灵素', '12345678', '27', '仙法修炼、仙岛事务', '温柔善良的仙子,守护仙岛和平', '蓬莱仙岛');
INSERT INTO `user` VALUES ('38', '韩非', '12345678', '23', '学术研究、阵法修炼', '聪明睿智的年轻人,研究阵法和学术', '韩家');
INSERT INTO `user` VALUES ('40', '戚芳', '12345678', '23', '武功、家族事务', '机智勇敢的女子,为家族荣誉而战', '戚家');
INSERT INTO `user` VALUES ('41', '楚轩辕', '12345678', '28', '家族事务、剑术修炼', '家族责任重于一切的剑客', '楚家');
INSERT INTO `user` VALUES ('42', '秦王', '12345678', '35', '政务、战争', '智勇双全的帝王,统一六国的志向', '秦国');
INSERT INTO `user` VALUES ('43', '李寻欢', '12345678', '30', '剑术、侠义行侠', '聪明机智的江湖人物,正义心十足', '大宛城');
INSERT INTO `user` VALUES ('44', '唐三藏', '12345678', '45', '佛法修行、西行取经', '慈悲心肠的高僧,带领徒弟西天取经', '大唐');
INSERT INTO `user` VALUES ('45', '吴青烟', '12345678', '26', '法术修行、江湖事务', '冷艳高傲的女子,修炼法术追求江湖大业', '青云门');
5.配置环境
- 在application.yml配置文件下,配置数据库信息(驱动、链接、用户名、密码)
spring:
#数据库连接信息
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 1234
#Mybatis配置
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
- 将UserMapper类 将其中的方法改成抽象方法,并且将类改成接口
6.需求
需求1:查询所有用户,输出在控制台
在UserMapper接口中,创建selectAll方法,并且在方法上添上注解。点击查看图解
在test下的SpringbootdemoApplicationTests中添加一个test的测试方法。点击查看图解
在SpringbootdemoApplicationTests中自动注入
UserMapper
接口的代理对象,并在test测试方法中调用这个对象的selectAll方法,输出结果。
需求2:查询名字叫 陆雪琪的用户,输出在控制台

需求3:爱好中含有 "法术" 的用户,输出在控制台

题目2
训练目标: 掌握根据原型图,完成后台接口编写
需求背景: 日常工作中,产品经理提供原型图后,由程序员完成功能实现。而实现功能的第一步,根据原型图,设计数据库表,且后台java程序需要对原型中展示的功能逐一实现。
需求描述:通过SpringBoot+Mybatis的方式完成如下分类管理的需求
备注:根据接口文档开发接口,并给予postman/ApiFox进行测试即可,前端工程前端人员还未开发,所以无需联调测试。
图1:
操作步骤:
创建新的 springboot工程 ,勾选mybatis、mysql驱动、lombok工具包的依赖。
配置mybatis的配置信息,包括数据库链接配置、日志配置、驼峰命名映射开关。
创建Controller、Service、Mapper三层架构:
- controller层:CategoryController类
- service层:CategoryService接口、impl-CategoryServiceImpl实现类
- mapper层:CategoryMapper接口
resources添加CategoryMapper.xml映射文件。
需求:
- 新增分类信息 【定义mapper方法,往Category表中插入数据】。
- 根据指定 ID 查询分类信息。
- 定义CategoryMapper接口对应的XML映射配置文件,根据指定的ID 动态修改分类的信息。【动态SQL】
- 根据条件,动态查询分类信息,查询条件包括:分类名称、分类类型: 【动态SQL】
- 分类名称,支持模糊匹配
- 分类类型是精确匹配
数据准备:
数据库数据:以下代码,直接复制到数据库中运行即可。
-- 创建数据库。
create database if not exists sky-take-out;
DROP TABLE IF EXISTS `category`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `category` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`type` int DEFAULT NULL COMMENT '类型 1 菜品分类 2 套餐分类',
`name` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '分类名称',
`sort` int NOT NULL DEFAULT '0' COMMENT '顺序',
`status` int DEFAULT NULL COMMENT '分类状态 0:禁用,1:启用',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_user` bigint DEFAULT NULL COMMENT '创建人',
`update_user` bigint DEFAULT NULL COMMENT '修改人',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_category_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='菜品及套餐分类';
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `category` DISABLE KEYS */;
INSERT INTO `category` VALUES (11,1,'酒水饮料',10,1,'2022-06-09 22:09:18','2022-06-09 22:09:18',1,1);
INSERT INTO `category` VALUES (12,1,'传统主食',9,1,'2022-06-09 22:09:32','2022-06-09 22:18:53',1,1);
INSERT INTO `category` VALUES (13,2,'人气套餐',12,1,'2022-06-09 22:11:38','2022-06-10 11:04:40',1,1);
INSERT INTO `category` VALUES (15,2,'商务套餐',13,1,'2022-06-09 22:14:10','2022-06-10 11:04:48',1,1);
INSERT INTO `category` VALUES (16,1,'蜀味烤鱼',4,1,'2022-06-09 22:15:37','2022-08-31 14:27:25',1,1);
INSERT INTO `category` VALUES (17,1,'蜀味牛蛙',5,1,'2022-06-09 22:16:14','2022-08-31 14:39:44',1,1);
INSERT INTO `category` VALUES (18,1,'特色蒸菜',6,1,'2022-06-09 22:17:42','2022-06-09 22:17:42',1,1);
INSERT INTO `category` VALUES (19,1,'新鲜时蔬',7,1,'2022-06-09 22:18:12','2022-06-09 22:18:28',1,1);
INSERT INTO `category` VALUES (20,1,'水煮鱼',8,1,'2022-06-09 22:22:29','2022-06-09 22:23:45',1,1);
INSERT INTO `category` VALUES (21,1,'汤类',11,1,'2022-06-10 10:51:47','2022-06-10 10:51:47',1,1);
实体类:以下代码,直接复制到idea中pojo包下即可。
@Data
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//类型: 1菜品分类 2套餐分类
private Integer type;
//分类名称
private String name;
//顺序
private Integer sort;
//分类状态 0标识禁用 1表示启用
private Integer status;
//创建时间
private LocalDateTime createTime;
//更新时间
private LocalDateTime updateTime;
//创建人
private Long createUser;
//修改人
private Long updateUser;
}