本案例是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. mac for docker访问宿主机服务

    转载链接 https://blog.csdn.net/weixin_33860528/article/details/91461648

  2. 理解Vue 3响应式系统原理

    title: 理解Vue 3响应式系统原理 date: 2024/5/28 15:44:47 updated: 2024/5/28 15:44:47 categories: 前端开发 tags: Vu ...

  3. 和必应对话之mysql分区分表

    mysql单表数据量太大 导致查询缓慢问题如何解决 您好,这是Bing.根据网络搜索结果,mysql单表数据量太大导致查询缓慢的问题有以下几种可能的解决方案: 使用索引.索引是一种数据结构,可以帮助数 ...

  4. ajax 请求接口实例

    通过 HTTP 请求加载远程数据. jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() 返回其创建的 XMLHttpRequest 对象.大多数 ...

  5. 一个或多个C文件编译KO

    参考文档:.c文件如何编译为ko的MAKEFILE文件编写 - young525 - 博客园 (cnblogs.com) 文档组织结构 header目录:存放头文件 source目录:存放源文件 单个 ...

  6. ts interface

    在TypeScript中,接口(interface)用于定义对象的结构,可以描述对象的属性.方法等.下面是一个简单的例子,演示如何使用 TypeScript 接口: // 定义一个接口表示一个人的信息 ...

  7. jq 下载带上token设置form表单并且兼容ie8

    先在publice公共资源里面或者自己随便写一个函数自己记得调用就行 先加载form表单组件 /** * 添加form下载组件 * @param {*} wrp */ appendFormDownlo ...

  8. C++面向对象语言自制多级菜单

    因为要做一个小应用,需要一个菜单类,在网上找了许久,也没有找到一款心仪的菜单类,索性用C++语言,自制一个命令行级别的菜单类,并制作成库,现记录下来,供以后借鉴. 一.特性 无限制条目 无限制层级 用 ...

  9. echarts柱状图横(x)轴文字显示不全,一招解决

    柱状图底部X轴文字过长时,将会出现文字显示不全的问题,这是echarts为了美观默认的设置 现在我们把文章倾斜旋转点角度即可全部显示 以下是代码 scale() { var chartDom = do ...

  10. java.util.Date和java.sql.Date有什么区别?

    java.util.Date包含日期和时间,而java.sql.Date只包含日期信息,而没有具体的时间信息.如果你想把时间信息存储在数据库       里,可以考虑使用Timestamp或者Date ...