java spring boot 2 开发实战 mybtis 基础部份从搭建到第一个完整测试(从环境到测试用例二部份)
本案例是java sping boot 2.2.1
mybtis 基础部份
第一步搭建环境:安装依赖
由于我们公司项目是1.8 环境不能乱,我现在自己的电脑是1.8环境,所以本次整理的boot 代码 也只能用1.8 boot版本为:2.2.1,新建项目后,在xml 文件中复制上以下代码

需要配置一个数据库,8.0以上 ,并运行以下测试sql

/* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.21-log : Database - db191125_mybatis_plus ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; CREATE DATABASE /*!32312 IF NOT EXISTS*/`db191125_mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; USE `db191125_mybatis_plus`; /*Table structure for table `product` */ DROP TABLE IF EXISTS `product`; CREATE TABLE `product` ( `id` bigint(20) NOT NULL COMMENT '主键ID', `name` varchar(30) DEFAULT NULL COMMENT '商品名称', `price` int(11) DEFAULT '0' COMMENT '价格', `version` int(11) DEFAULT '0' COMMENT '乐观锁版本号', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*Data for the table `product` */ insert into `product`(`id`,`name`,`price`,`version`) values (1,'外星人笔记本',120,3); /*Table structure for table `user` */ DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL COMMENT '主键ID', `name` varchar(30) DEFAULT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMMENT '年龄', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `deleted` tinyint(1) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*Data for the table `user` */ insert into `user`(`id`,`name`,`age`,`email`,`create_time`,`update_time`,`deleted`) values (1,'Annie',28,'test1@baomidou.com',NULL,NULL,1),(2,'Jack',20,'test2@baomidou.com',NULL,NULL,1),(3,'Tom',28,'test3@baomidou.com',NULL,NULL,1),(4,'Sandy',21,'test4@baomidou.com',NULL,NULL,1),(1244892079889334273,'Annie',28,'55317332@qq.com','2020-03-31 15:39:35','2020-03-31 15:40:52',1); /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
配置好后
主类增加扫描位置
package com.example.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.demo.mapper") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
配置数据库:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://192.168.3.21:3306/db191125_mybatis_plus?serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456
java 后端处理数据库表要先有表的对应类,通常在主目录下entity 然后在下面根据表建类,比如数据库有uese 表就我建user 类,利用lombod 在类上写上@Data 自动生成对象的方法
编写一个mapper 类继承 一个基类naopper 这个类就可能对对像的增删 改查的操作,可以调用这个对象来操作对象,然后对象会关联到数据库,
简单几步我们就可以测试整 个环境配置和对象印射 是 否正确了,下面开始测试。
测试第一步注入方法到这个文件,这儿由于注入的类编辑器没有看到实现,会票红,这儿可以直接忽略或右健配置忽略,
第一个测试代码。
测试输出查看效果:这儿能看到执行的时间和结果,但是看不到执行的sql 语句,
配置红色部份,可以显示显示sql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://192.168.3.21:3306/db191125_mybatis_plus?serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456 #mybatis日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl #全局设置主键生成策略 #mybatis-plus.global-config.db-config.id-type=auto #mybatis-plus.global-config.db-config.logic-delete-value=1 #mybatis-plus.global-config.db-config.logic-not-delete-value=0
最后显示结果:
测试用例编写
环境搭建好后,先不要正式写项目,先在测试环境测试练习一增删改的方法,熟悉注入和测试用例
编写第二个测试用例
新建 一个测试文件,注入需要的mapper 主类上加上@SpringBootTest 表示这是一个测试类,在方法上加上@Test.,这样就可以先new 一个对象,然后用insert 方法插入到数据库
测试类的代码示例如下:文件名:CRUDTests
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import com.example.demo.mapper.UserMappter; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class CRUDTests { @Autowired private UserMappter userMappter; @Test public void testInsert(){ User user = new User(); user.setName( "hello" ); user.setEmail( "553355@qq.com" ); user.setAge( 18 ); int result = userMappter.insert(user); System.out.println( "影响行数" + result); System.out.println( "user id" + user.getId()); } } |
运行结果id 很长如下图:
这儿涉及到主健自增策略,和数 据库分库分表等相关概念,我们的id 在数据底层啥 也没有配,它就是产生了id 这叫全局唯一id ,
随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。
数据库的扩展方式主要包括:业务分库、主从复制,数据库分表。
解决方式:业务分库,当就是花钱买设备,还有就是一个数据库的表分开存,每个模板一个数据库。
业务分库指的是按照业务模块将数据分散到不同的数据库服务器。例如,一个简单的电商网站,包括用户、商品、订单三个业务模块,我们可以将用户数据、商品数据、订单数据分开放到三台不同的数据库服务器上,而不是将所有数据都放在一台数据库服务器上。这样的就变成了4个数据库同时承担压力,系统的吞吐量自然就提高了。
默认情况是雪花序号,如果想要自增,第一可以数据库设置,第二可以业务设置,
工作中对于测试用验的编写更为细节,但是原理一样,学习中了理解用最直接的方法,以下是复制工作的示例,收于以下内容涉及到断言,这儿只是示例一下不用细看
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.boot.test.context.SpringBootTest; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) @SpringBootTest public class UserServiceTest { @Mock private UserMapper userMapper; @InjectMocks private UserService userService = new UserServiceImpl(); // 假设你的Service类继承自ServiceImpl private User user; @BeforeEach public void setUp() { user = new User(); user.setId(1L); user.setName("TestUser"); user.setAge(30); user.setEmail("test@example.com"); } @Test public void testAddUser() { when(userMapper.insert(any(User.class))).thenReturn(1); // 模拟插入操作成功 boolean result = userService.save(user); assert result; // 断言插入操作是否成功 verify(userMapper, times(1)).insert(user); // 验证userMapper的insert方法是否被调用了一次 } @Test public void testUpdateUser() { User updatedUser = new User(); updatedUser.setId(user.getId()); updatedUser.setName("UpdatedUser"); when(userMapper.updateById(any(User.class))).thenReturn(1); // 模拟更新操作成功 boolean result = userService.updateById(updatedUser); assert result; // 断言更新操作是否成功 verify(userMapper, times(1)).updateById(updatedUser); // 验证userMapper的updateById方法是否被调用了一次 } @Test public void testDeleteUser() { when(userMapper.deleteById(any(Long.class))).thenReturn(1); // 模拟删除操作成功 boolean result = userService.removeById(user.getId()); assert result; // 断言删除操作是否成功 verify(userMapper, times(1)).deleteById(user.getId()); // 验证userMapper的deleteById方法是否被调用了一次 } @Test public void testFindUser() { when(userMapper.selectById(any(Long.class))).thenReturn(user); // 模拟查询操作返回用户信息 User resultUser = userService.getById(user.getId()); assertNotNull(resultUser); // 断言查询结果不为空 assertEquals(user.getName(), resultUser.getName()); // 断言查询结果中的用户名与预期相符 verify(userMapper, times(1)).selectById(user.getId()); // 验证userMapper的selectById方法是否被调用了一次 } // 其他测试方法可以继续添加,比如查询所有用户、根据条件查询用户等。 }
最后一个问题,对于增删改,删可能是软删 除,增加和改 除了对内容处理 ,我们也要对时间作为一个记录,比如更新时间,创建时间,我们可以在数据层配置,但是最好建议在业务层上配置
可以在业务层上配置自动填充,从而解决对更新时间,插入时间的字段。
第一步需要配置一个handler 然后几个方法包括增,更新,删除的方法,然后还得继承MetaOjecHandler
还得对这handler 使用@component 注解
第一步:
第二步:
以上代码只是截图 详细代码为:handler 类
package com.atguigu.mybatis_plus.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; /** * @author helen * @since 2020/3/31 */ @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { System.out.println("insertFill 。。。。。。"); this.setFieldValByName("createTime", new Date(), metaObject); this.setFieldValByName("updateTime", new Date(), metaObject); } @Override public void updateFill(MetaObject metaObject) { System.out.println("updateFill 。。。。。。"); this.setFieldValByName("updateTime", new Date(), metaObject); } }
最后一步是在对象类上配自动填充
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端