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

本案例是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);
    }
}

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

 

posted @ 2024-04-19 19:12  谢双元小号  阅读(10)  评论(0编辑  收藏  举报