本案例是java  sping boot  2.2.1

mybtis 基础部份

第一步搭建环境:安装依赖

由于我们公司项目是1.8 环境不能乱,我现在自己的电脑是1.8环境,所以本次整理的boot 代码 也只能用1.8 boot版本为:2.2.1,新建项目后,在xml 文件中复制上以下代码

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 */;

测试用的sql 语句能生成表

配置好后

主类增加扫描位置

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

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);
}
}

最后一步是在对象类上配自动填充

java spring boot 2 开发实战 mybtis 基础部份从搭建到第一个完整测试(从环境到测试用例二部份)的更多相关文章

  1. Spring Boot国际化开发实战

    本章将讲解如何在Spring Boot和Thymeleaf中做页面模板国际化的支持,根据系统语言环境或者session中的语言来自动读取不同环境中的文字. 国际化自动配置 Spring Boot中已经 ...

  2. 三本书带您快速深入掌握Spring Boot应用开发《Spring Boot从零开始学(视频教学版)》

    #好书推荐##好书奇遇季#三本书带您快速深入掌握Spring Boot应用开发<Spring Boot从零开始学(视频教学版)><Spring Boot应用开发实战><深 ...

  3. Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  4. Spring Boot 揭秘与实战(七) 实用技术篇 - Java Mail 发送邮件

    文章目录 1. Spring Boot 集成 Java Mail 2. 单元测试 3. 源代码 Spring 对 Java Mail 有很好的支持.因此,Spring Boot 也提供了自动配置的支持 ...

  5. Spring Boot框架开发的Java项目在CentOS7上的部署

    需求:上级拿来一份Spring Boot框架开发的Java项目代码让我在服务器上运行起来,只说了一句该框架是自带了Tomcat(不用重新安装Tomcat),一份代码下有两个项目(一个管理端项目,一个用 ...

  6. Github点赞超多的Spring Boot学习教程+实战项目推荐!

    Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐!   很明显的一个现象,除了一些老项目,现在 Java 后端项目基本都是基于 Spring Boot 进行开发,毕竟它这 ...

  7. Spring boot+CXF开发WebService

    最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的w ...

  8. Spring boot+CXF开发WebService Demo

    最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的w ...

  9. Spring Boot 揭秘与实战(五) 服务器篇 - 其他内嵌服务器 发表于 2017-01-03 | Spring框架 | Spri

    文章目录 1. Jetty 的切换 2. Undertow的使用 Spring Boot 可选择内嵌 Tomcat.Jetty 和 Undertow,因此我们不需要以 war 包形式部署项目.< ...

  10. Spring Boot 揭秘与实战(四) 配置文件篇 - 有哪些很棒的特性

    文章目录 1. 使用属性文件2. YAML文件 1.1. 自定义属性 1.2. 参数引用 1.3. 随机数属性 1.4. application-{profile}.properties参数加载 3. ...

随机推荐

  1. 《最新出炉》系列入门篇-Python+Playwright自动化测试-49-Route类拦截修改请求-下篇

    1.简介 在日常工作和学习中,自动化测试的时候:在加载页面时,可能页面出现很多不是很重要或者不是我们所关注的,这个时候我们就可以选择不加载这些内容,以提高页面加载速度,节省资源.例如:可能页面上图片比 ...

  2. Java遍历Map集合的方法

    Java中遍历Map集合的常用方式主要有以下几种: 1.使用keySet()方法遍历 遍历Map的key集合,然后通过key获取value. Map<String, Integer> ma ...

  3. 第一次线上 OOM 事故,竟和 where 1 = 1 有关

    这篇文章,聊聊一个大家经常使用的编程模式 :Mybatis +「where 1 = 1 」. 笔者人生第一次重大的线上事故 ,就是和使用了类似的编程模式 相关,所以印象极其深刻. 这几天在调试一段业务 ...

  4. LeetCode 449. Serialize and Deserialize BST 序列化和反序列化二叉搜索树 (Java)

    题目: Serialization is the process of converting a data structure or object into a sequence of bits so ...

  5. vs code 中开发 .net5 mvc

    asp.net core mvc ------------ 安装vscode-solution-explorer,C# 2个扩展.遇到yes就点yes. 新建一个文件夹:D:\repos\Net5Mv ...

  6. 记Codes 重新定义 SaaS模式开源免费研发项目管理平台——多事项闭环迭代的创新实现

    1.简介 Codes 重新定义 SaaS 模式 = 云端认证 + 程序及数据本地安装 + 不限功能 + 30 人免费 Codes 是一个 高效.简洁.轻量的一站式研发项目管理平台.包含需求管理,任务管 ...

  7. maven项目创建默认目录结构

    maven项目创建默认目录结构命令 项目文件夹未创建情况下 mvn \ archetype:generate \ -DgroupId=com.lits.parent \ -DartifactId=my ...

  8. Golang支持重试的http客户端ghttp

    简介 官方仓库:https://github.com/GuoFlight/ghttp 重试的逻辑依赖了github.com/avast/retry-go 入门 client := ghttp.Clie ...

  9. Linux驱动:输入子系统(input-subsystem) 分析

    Linux驱动:输入子系统 分析 参考: https://www.cnblogs.com/lifexy/p/7542989.html https://blog.csdn.net/myselfzhang ...

  10. 基于 UDP 的 组播、广播详解

    背景 有些时候我们在网络通信中也需要用到 组播(多播).广播.现在我们来介绍如何实现. 建议:在此之前,关闭防火墙. ubuntu: service ufw stop windows: 控制面板关闭 ...