本案例是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. WPF开发快速入门【3】WPF的基本特性(附加属性)

    概述 本文描述WPF的附加属性.对于使用MVVM框架的项目,附加属性是非常重要的一个特性. 在MVVM框架下,ViewModel的代码通过控件的依赖属性来控制控件的,例如: //ViewModel p ...

  2. Prism IoC 依赖注入

    现有2个项目,SinglePageApp是基于Prism创建的WPF项目,框架使用的是Prism.DryIoc,SinglePageApp.Services是C#类库,包含多种服务,下面通过使用Pri ...

  3. Anaconda安装Python的seaborn库

      本文介绍在Anaconda的环境中,安装Python语言中,常用的一个绘图库seaborn模块的方法.   seaborn模块是基于Matplotlib的数据可视化库,它提供了一种更简单.更漂亮的 ...

  4. Opencv笔记(13)积分图

    积分图时一种允许子区域快速求和的数据结构,这种求和在很多方面都很有用,值得一提的是haar小波的计算,它用于人脸识别和类似的算法.Opencv支持积分图的三种变体,分别是总和.平方求和以及倾斜求和.每 ...

  5. mysql中常用的三种插入数据的语句

    mysql中常用的三种插入数据的语句: insert into表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错: replace into表示插入替换数据,需求表中有Prim ...

  6. jsp和servlet的区别、共同点、各自应用的范围?

    JSP是Servlet技术的扩展,本质上就是Servlet的简易方式.JSP编译后是"类servlet".Servlet和JSP最主要的不同点在于: Servlet的应用逻辑是在J ...

  7. word文档生成视频,自动配音、背景音乐、自动字幕,另类创作工具

    简介 不同于别的视频创作工具,这个工具创作视频只需要在word文档中打字,插入图片即可.完事后就能获得一个带有配音.字幕.背景音乐.视频特效滤镜的优美作品. 这种不要门槛,没有技术难度的视频创作工具, ...

  8. 技术解密Java Chassis 3超实用的可观测性

    本文分享自华为云社区<Java Chassis 3技术解密:实用的可观测性>,作者:liubao68. 狭义的可观测性,指日志.调用链和指标,广义的可观测性则包含更多的内容,一般的,应用程 ...

  9. Java正则表达式语法及简单示例

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestMatcher { public st ...

  10. C# 循环枚举

    foreach (int eemun in Enum.GetValues(typeof(类名))) { string sName = Enum.GetName(typeof(类名), eemun);/ ...