Mybatis-Plus详解(新建maven项目、查询所有信息、打印SQL日志、实现CRUD(增删改查)、分页、条件查询且分页,前后端分离式开发)

news2024/9/20 7:50:27

Mybatis-Plus详解(新建maven项目、查询所有信息、打印SQL日志、实现CRUD(增删改查)、分页、条件查询且分页,前后端分离式开发)

MyBatis-Plus(opens new window) (简称MP) 是一个MyBatis(opens new window)的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。想查看官网相关内容的化我这里提供了官网地址:https://baomidou.com/

特点

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

损耗小:启动即会自动注入基本CRUD,性能基本无损耗,直接面向对象操作

强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现表单大部分CRUD操作,更有强大的条件构造器,满足各类使用需求

支持Lambda形式调用:同Lambda表达式,方便的编写各种类查询条,无需再担心字段写错

支持主键自动生成:支持多达4种主键策略(内容分布式唯一ID生成器 - Sequence),可自由配置,完美解决主键问题

支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需要继承Model类即可进行强大的CRUD操作

支持自定义全局通用操作:支持全局通用方法注入(write once,use anywhere)

内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller、层代码,支持模板引擎,更有超多自定义配置可以使用

内置分页插件:基本MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,编写分页等同与普通List查询

分页插件支持多种数据库:支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer等多种数据库

内置性能分析插件:可输出SQL语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

内置全局拦截插件:提供全表delete、update操作智能分析阻断,也可以自定义拦截规则,预防误 操作

MyBatis-Plus入门

创建maven项目

创建如下图所示步骤的maven项目结构:

第一步:

在这里插入图片描述

第二步:

在这里插入图片描述

点击下一步next

在这里插入图片描述

最后项目结构:

在这里插入图片描述

准备数据库:

在这里插入图片描述

添加依赖

1、向pom.xml中添加指定的依赖

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.11</version>
            </plugin>
        </plugins>
    </build>

编写配置文件yml

2、因为我这里习惯使用.yml作为属性配置文件,所以更改属性文件,并编写相关sql配置

application.yml

server:
  port: 8888

spring:
  devtools:
    restart:
      enabled: true
      additional-paths: "src/main/java"
      exclude: "static/**"
  datasource:
    username: "root"
    password: "h123456"
    driver-class-name: "com.mysql.cj.jdbc.Driver"
    url: "jdbc:mysql://localhost:3306/db_school?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false"

入门示例编写和测试

1、创建StudentMapper.java 接口

package com.etime.day15mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.etime.day15mybatisplus.pojo.Student;
import org.springframework.stereotype.Repository;

//引注入StudentMapper类
@Repository
//记得BaseMapper<T>的泛型加上学生类Student
public interface StudentMapper extends BaseMapper<Student> {
}

2、创建StudentService.java接口

package com.etime.day15mybatisplus.service;

import com.etime.day15mybatisplus.pojo.Student;

import java.util.List;

public interface StudentService {
    //获取所有学生信息
    List<Student> getAllStudent();
}

3、创建StudentService.java接口的实现类StudentServiceImpl.java

package com.etime.day15mybatisplus.service.impl;

import com.etime.day15mybatisplus.mapper.StudentMapper;
import com.etime.day15mybatisplus.pojo.Student;
import com.etime.day15mybatisplus.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

//注入service
@Service
public class StudentServiceImpl implements StudentService {

    //通过@Autowired注解将StudentMapper接口注入
    @Autowired
    private StudentMapper studentMapper;


    @Override
    public List<Student> getAllStudent() {
        //获取学生的全部信息
        List<Student> list = studentMapper.selectList(null);
        return list;
    }
}

4、创建StudentController.java类控制层

package com.etime.day15mybatisplus.controller;

import com.etime.day15mybatisplus.pojo.Student;
import com.etime.day15mybatisplus.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

//使用RestController注解可以除了包含了Controller其中都包含了@ResponseBody注解
@RestController
public class StudentController {

    //使用注解@Autowired将接口StudentService注入
    @Autowired
    private StudentService studentService;

    //使用查询的提交注解@GetMapping方式
    //查询所有学生信息
    @GetMapping("/student")
    public List<Student> getAllStudent(){
        return studentService.getAllStudent();
    }
}

5、在Application启动类中加入mapper的文件扫描

package com.etime.day15mybatisplus;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//注入mapper文件扫描
@MapperScan("com.etime.day15mybatisplus.mapper")
@SpringBootApplication
public class Day15mybatisPlusApplication {

    public static void main(String[] args) {
        SpringApplication.run(Day15mybatisPlusApplication.class, args);
    }

}

6、运行结果:

使用Apifox接口测试工具进行测试(如有需要可以去看这篇文章下载安装和使用:https://blog.csdn.net/m0_56245143/article/details/130270652?spm=1001.2014.3001.5501)

在这里插入图片描述

MyBatis-Plus打印SQL日志

在application.xml文件中,配置日志打印:

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

再次测试上述查看idea控制台:

在这里插入图片描述

MyBatis-Plus用在实体类属性上的注解配置

更改后的学生类对象:Student.java

package com.etime.day15mybatisplus.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
//@TableName("tb_student") //如果数据库表进行了更改,使用@TableName注解
public class Student {
    //还有一种情况是当实体类中的属性字段名和数据库表不一样,
    // 需要注意主键分别需要使用注解@TableId("")放入和数据库表主键名一样
    @TableId("sid")
    private int stuId;
    //除了主键不一样,其他属性使用@TableField("")注解
    @TableField("sname")
    private String stuName;

    @TableField("sgender")
    private String stuGender;

    @TableField("sage")
    private int stuAge;

    @TableField("semail")
    private String stuEmail;

    @TableField("sphoto")
    private String stuPhoto;
}

运行结果:

在这里插入图片描述

MyBatis-Plus实现CRUD(实现增、删、改、查功能)

新增学生信息

1、在StudentService.java接口中添加学生新增方法
//新增学生信息
    int addStudent(Student student);
2、在StudentServiceImpl对StudentService接口实现类中编写重写新增方法
//新增学生信息
    @Override
    public int addStudent(Student student) {
        return studentMapper.insert(student);
    }
3、在StudentController.java类中编写学生信息新增方法
//添加学生信息使用的是@PostMapping注解提交的方式
    @PostMapping("/student")
    public int addStudent(Student student){
        return studentService.addStudent(student);
    }
4、运行结果:

使用Apifox工具进行测试:

在这里插入图片描述

对学生信息进行修改

1、在StudentService.java接口中编写学生信息修改方法
//对学生信息进行修改
    int updateStudent(Student student);
2、在StudentServiceImpl对StudentService接口实现类中编写重写学生更新方法
//修改学生信息
    @Override
    public int updateStudent(Student student) {
        //根据学生id对学生信息进行修改阿
        return studentMapper.updateById(student);
    }
3、在StudentController.java类中编写修改学生信息的方法
//修改学生信息使用@PutMapping注解提交的方式
    @PutMapping("/student")
    public int updateStudent(Student student){
        return  studentService.updateStudent(student);
    }
4、运行结果:

在这里插入图片描述

根据学生id删除学生信息

1、在StudentService.java接口中编写根据学生id删除学生信息的方法
//根据学生id删除学生信息
    int deleteStudent(int sid);
2、在StudentServiceImpl对StudentService接口的实现类内编写根据学生id删除学生信息的方法
//根据学生id删除学生信息
    @Override
    public int deleteStudent(int sid) {
        return studentMapper.deleteById(sid);
    }
3、在控制类StudentController.java控制类中编写根据学生id删除学生信息
//根据学生id对学生信息进行删除使用@DeleteMapping注解的方式提交
    @DeleteMapping("/student/{sid}")
    public int deleteStudent(@PathVariable("sid") int sid){
        return studentService.deleteStudent(sid);
    }
4、运行结果:

在这里插入图片描述

分页查询

使用MyBatis-Plus内置的分页插件,需要配置相关内容,创建配置类MybatisPlusConfig.java完成配置

插件配置MybatisPlusConfig.java

package com.etime.day15mybatisplus.util;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration   //注入解析相关配置文件
public class MybatisPlusConfig {
    @Bean  //将当前类对象注入
    public MybatisPlusInterceptor paginationInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //指定数据库为MySQL
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

1、在StudentService.java接口类中编写查询所有数据并进行分页方法
//无条件查询数据分页
    Page<Student> getStudentByPage(int current,int size);
2、在StudentServiceImpl.java对StudentService接口实现类中编写查询所有数据并进行分页的方法
 //无条件数据查询分页(即对所有数据进行查询分页)
    @Override
    public Page<Student> getStudentByPage(int current, int size) {
        Page<Student> page = new Page<>(current,size);
        return studentMapper.selectPage(page,null);
    }
3、在控制层StudentContrroller.java类中编写实现方法
//使用无条件查询数据分页使用@GetMapping对数据进行提交和注入
	@GetMapping("/student/page")
    public Page<Student> getStudentByPage(int current,int size){
        return studentService.getStudentByPage(current,size);
    }
4、运行结果:

在这里插入图片描述

条件查询且分页

MyBatis-Plus内置的查询器,可以帮助我们来做各种各样的条件查询

如下是基本的常用方法表:

在这里插入图片描述

1、在StudentService.java接口中编写条件查询且分页的方法
//条件查询且分页
    Page<Student> getStudentBySname(String sname,int courrent,int size);
2、在StudentServiceImpl对StudentService接口实现类中编写条件查询且分页的方法
//条件查询且分页
    @Override
    public Page<Student> getStudentBySname(String sname, int courrent, int size) {
        QueryWrapper<Student> wrapper = new QueryWrapper<>();
        //将条件加入到wrapper对象中
        wrapper.like("sname",sname);
        Page<Student> page = new Page<>(courrent,size);
        return studentMapper.selectPage(page,wrapper);
    }
3、在StudentController.java控制类中添加实现条件查询且分页的方法
//条件查询且分页使用@GetMapping对数据进行提交和数据注入
    @GetMapping("student/like")
    public Page<Student> getStudentBySname(String sname,int current,int size){
        return studentService.getStudentBySname(sname,current,size);
    }

4、运行结果:

在这里插入图片描述

前后端分离式开发整合

由于前面的准备其实基本的代码时没有任何问题的,现在用上述已经完成没问题的情况下对其进行前后端分离式开发的方式采用Vue3前端进行编写html页面测试:

分页展示学生信息:

解决跨域问题

首先解决的问题是通过idea和VScode开发工具的跨域问题:

在Controller层加上注解@CrossOrigin解决跨域问题,如图:

在这里插入图片描述

在VScode中编写studentInfo.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/axios.min.js"></script>
    <script src="js/vue.global.js"></script>
</head>
<body>
    <div id="app">
        <div>
            <table>
                <tr>
                    <td>姓名</td>
                    <td>性别</td>
                    <td>年龄</td>
                    <td>邮件</td>
                    <td>头像</td>
                    <td>操作</td>
                </tr>
                <tr v-for="stu in students">
                    <td>{{stu.sname}}</td>
                    <td>{{stu.sgenger}}</td>
                    <td>{{stu.sage}}</td>
                    <td>{{stu.semail}}</td>
                    <td>
                        {{stu.sphoto}}
                    </td>
                </tr>
            </table>
            <div>
                <a href="javascript:void(0)" @click="getStudentByPage(1)">首页</a>
                <a href="javascript:void(0)" @click="getStudentByPage(prevPage)">上一页</a>
                {{current}}/{{pages}}
                <a href="javascript:void(0)" @click="getStudentByPage(nextPage)">下一页</a>
                <a href="javascript:void(0)" @click="getStudentByPage(pages)">尾页</a>
            </div>
        </div>
    </div>
    <script>
        const app =Vue.createApp({
            data(){
                return{
                    students:"",
                    current:1,
                    size:5,
                    pages:"",
                    prevPage:"",
                    nextPage:"",
                    sname:""
                }
            },
            methods:{
                getStudentByPage(page){
                    let content = new URLSearchParams();
                    content.append("current",page);
                    content.append("size",this.size);
                    axios({
                        url:"http://localhost:8888/student/page",
                        method:"get",
                        params:content
                    }).then(resp =>{
                        console.log(resp)
                        this.students = resp.data.records;
                        this.pages = resp.data.pages;
                        this.current = resp.data.current;
                        if(this.current ==1){
                            this.prevPage = 1;
                        }else{
                            this.prevPage = this.current -1;
                        }
                        if(this.current == this.pages){
                            this.nextPage = this.pages;
                        }else{
                            this.nextPage = this.current + 1;
                        }
                    });
                }
            },
            created(){
                this.getStudentByPage(1);
            }
        });
        app.mount("#app");
    </script>
</body>
</html>
运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/454013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【牛客网】最难的问题与因子个数

目录 一、编程题 1.最难的问题 2.因子个数 一、编程题 1.最难的问题 链接&#xff1a;最难的问题__牛客网 (nowcoder.com) NowCoder生活在充满危险和阴谋的年代。为了生存&#xff0c;他首次发明了密码&#xff0c;用于军队的消息传递。假设你是军团中的一名军官&#xff…

Linux网络服务之yum仓库

目录 一、yum仓库简介二. ftp搭建yum源三. 搭建国内在线源四. 本地源和在线yum同时使用五. 通过缓存的方式保存所下载的软件包六 . 制作yum仓库 一、yum仓库简介 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机…

TortoiseSVN使用-权限配置

文章目录 3.5 权限配置3.5.1 单一版本库权限配置3.5.2 多版本库共享配置 3.5 权限配置 3.5.1 单一版本库权限配置 ①要设置授权访问就需要创建用户&#xff0c;并为用户设定权限 ②打开授权访问的配置 [1]打开 D:\DevRepository\Subversion\ERP\conf\svnserve.conf [2]将第 …

Day953.以假设驱动为指引 -遗留系统现代化实战

以假设驱动为指引 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于以假设驱动为指引的内容。 很多人在做遗留系统现代化的时候呢&#xff0c;总觉得它是一个十分复杂的技术问题。 本来嘛&#xff0c;无论是代码的重构、架构的拆分&#xff0c;还是 DevOps 平台的搭…

2023年 团体程序设计天梯赛个人感悟及总结(附题解)——遗憾国三

今年也是第一次参加了天梯赛&#xff0c;在这里也写一下自己的一些赛前准备、比赛过程的一些问题&#xff0c;以及赛后的一些总结以及感悟叭&#xff01;首先赛前准备的话也不能说我准备的非常的充分吧&#xff0c;但是L2阶的题目我是真的刷的很猛很疯的呢&#xff0c;这样看来…

Python类的继承

一、类的继承 1、什么是继承 通过继承基类来得到基类的功能 所以我们把被继承的类称作父类或基类&#xff0c;继承者被称作子类 代码的重用 2、父&#xff08;基&#xff09;类与子类 子类拥有父类的所有属性和方法 父类不具备子类自有的属性和方法 3、继承的用法 定义…

vite+react+ts+mobx+antd+react-router-dom+sass+tailwindcss

写了Vue项目比较多了&#xff0c;最近想换一下react技术栈&#xff0c;锻炼自己的技术&#xff0c;废话不多说&#xff0c;开始创建项目吧&#xff0c;写这篇博客也只是记录我创建的过程&#xff0c;不通的版本难免有坑&#xff0c;欢迎一起分享讨论下! 1、npm create vite //…

【李老师云计算】Spark配置及Scala实现100个随机数找最大值

索引 前言1. Spark部署1.1 Spark下载1.2 解压Spark1.3 修改环境变量1.4 修改主机Spark配置文件1.4.1 slaves.template文件配置1.4.2 spark-env.sh.template文件配置 1.5 分享主机Spark到从机1.6 启动Spark集群(★重启后的操作)1.7 通过jps查看是否启动成功1.8 通过网页查看是否…

rk3568 适配摄像头 (mipi 单摄)

rk3568 适配摄像头 (mipi 单摄) MIPI CSI&#xff08;Mobile Industry Processor Interface Camera Serial Interface&#xff09;是一种用于移动设备的高速串行接口标准&#xff0c;用于连接图像传感器和图像处理器。MIPI CSI接口使用差分信号传输技术&#xff0c;将数据分为…

C/C++ 高精度(加减乘除)算法二进制优化

高级精度算法系列 第一章 简单实现 第二章 压位优化 第三章 二进制优化(本章) 文章目录 高级精度算法系列前言一、基本原理1、存储方式2、计算方式 二、关键实现1、整型转高精度数组&#xff08;二进制&#xff09;2、字符串转高精度数组&#xff08;二进制&#xff09;3、高精…

小程序进阶

1.1组件基础 自定义组件的结构与页面是一致的&#xff0c;即也包含有4个部分&#xff0c;分别为: .wxml 组件的布局结构 .js 组件的处理逻辑 .json 组件的配置文件 .wxstngs 组件的布局样式 1.1.1创建组件 通常将组件放到独立的目录components当中这个目录需要手动创建 …

Spring Boot的配置文件

目录 配置文件的作用 配置文件的格式 properties配置文件 格式 注释乱码问题 读取配置文件 properties的优缺点分析 YAML yml基本语法 yml配置的读取 注意事项:value的值加单双引号 配置对象 yml优点分析 properties和yml的区别 设置不同环境的配置文件 配置文件的…

Linux-搭建web服务器

综合练习&#xff1a;请给openlab搭建web网站 ​ 网站需求&#xff1a; ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.…

SpringCloud --- Ribbon负载均衡

一、负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1&#xff0c;怎么变成了http://localhost:8081的呢&#xff1f; 二、源码跟踪 为什么我们只输入了service名称就…

浅谈: 计算机—JVM—Java线程—池

计算机的基本组成 计算机的基本组成 计算机存储模型(CPU、寄存器、高速缓存、内存、外存) 现代计算机系统CPU和内存之间其实是有一个cache的层级结构的。比内存速度更快的存储介质(SRAM)&#xff0c;普通内存一般是DRAM&#xff0c;这种读写速度更快的介质充当CPU和内存之间的…

3 连续模块(二)

3.5 零极点增益模块 在控制系统设计和分析中&#xff0c;常用的函数包括 传递函数&#xff08;tf&#xff09;、零极点&#xff08;zpk&#xff09;和状态空间&#xff08;ss&#xff09;函数 传递函数&#xff08;tf&#xff09;&#xff1a;用于表示线性时不变系统的输入输出…

SQL Compliance Manager Crack

SQL Compliance Manager Crack 新的SQL CM云代理-扩展了当前SQL CM代理的功能&#xff0c;以支持EC2上Microsoft SQL服务器的远程审核。允许用户添加在共享网络位置上活动的SQL Server&#xff0c;以写入/读取数据并支持DBaaS SQL Server实例。云代理包含与当前SQL代理相同的行…

VS code 插件之中英文间自动添加空格

前言 不知道大家在开发过程中是不是会遇到写代码注释或者文本内容时中英文之间没有空格的情况&#xff0c;很多时候在写代码尤其是写注释的时候容易忘记加空格&#xff0c;但回过头来看又难以忍受&#xff0c;于是我就想着自己写一个 vscode 插件来解决这个问题&#xff0c;希…

跟我一起开启 linux 的学习吧

跟我学 CentOS 的安装 一、安装 VMware二、创建虚拟机三、安装 CentOS 7四、linux 的登录 一、安装 VMware VMware 计算机虚拟化软件 从官网 https://www.vmware.com/cn.html 下载并安装 这里就不再展示安装过程啦&#xff01; 有需要的可以 点击这里 →→→ VMware 下载安装过…

postgresql 源码结构分析

专栏内容&#xff1a;postgresql内核源码分析个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 源码下载 源码结构 核心代码目录 结尾 前言 本文对postgresql源码目…