SpringBoot与MyBatis-Plus的整合与综合实例

news2024/11/17 4:51:49

MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程、以及高级映射。MyBatis3 提供的注解可以取代 XML。例如,使用注解 @Select 直接编写 SQL 完成数据查询。MyBatis-Plus 是一个对 MyBatis 进行增强的工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

下面将介绍 SpringBoot 与 MyBatis-Plus 的整合步骤。

官方文档:《MyBatis-Plus 官方文档》 

1、创建数据表

在MySQL数据库中创建用户信息表(tb_user),并添加数据。

-- 创建数据库
CREATE DATABASE IF NOT EXISTS db_admin;

-- 使用数据库
USE db_admin;

-- 判断数据表是否存在,存在则删除
DROP TABLE IF EXISTS tb_user;
 
-- 创建“用户信息”数据表
CREATE TABLE IF NOT EXISTS tb_user
( 
	user_id BIGINT(20) AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
	user_account VARCHAR(50) NOT NULL COMMENT '用户账号',
	user_password VARCHAR(50) NOT NULL COMMENT '用户密码',
	blog_name VARCHAR(50) COMMENT '博客信息',
	blog_url VARCHAR(50) NOT NULL COMMENT '博客地址'
) COMMENT = '用户信息表';
 
-- 添加数据
INSERT INTO tb_user(user_account,user_password,blog_name,blog_url) VALUES('pan_junbiao的博客','123456','您好,欢迎访问 pan_junbiao的博客','https://blog.csdn.net/pan_junbiao');

-- 查询数据
SELECT * FROM tb_user;

2、创建项目

(1)创建 SpringBoot 项目,项目结构如下图:

(2)添加 Maven 依赖

在 pom.xml 配置文件中添加 MyBatis-Plus、 MySQL 的 JDBC 数据库驱动、Lombok插件等依赖。

<!-- MyBatis-Plus 依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.7</version>
</dependency>

<!-- MySQL的JDBC数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

<!-- lombok 依赖 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.34</version>
    <scope>provided</scope>
</dependency>

(3)配置相关信息

将默认的 application.properties 文件的后缀修改为“.yml”,即配置文件名称为:application.yml,并配置以下信息:

#Spring配置
spring:
  application:
    #项目名称
    name: ProjectManagement
  #DataSource数据源
  datasource:
    url: jdbc:mysql://localhost:3306/db_admin?useSSL=false&amp&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

#MybatisPlus配置
mybatis-plus:
  configuration:
    #配置日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.1 创建实体类(Entity层)

在 com.pjb.pm.entity 包中,创建 UserInfo 类(用户信息实体类)。

package com.pjb.pm.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * 用户信息实体类
 * @author pan_junbiao
 **/
@Data
@TableName("tb_user") //设置数据表名
public class UserInfo
{
    /**
     * 用户编号(主键、自增)
     */
    @TableId(type = IdType.AUTO) //主键生成策略:自增
    private Long userId;

    /**
     * 用户账号
     */
    private String userAccount;

    /**
     * 用户密码
     */
    private String userPassword;

    /**
     * 博客信息
     */
    private String blogName;

    /**
     * 博客地址
     */
    private String blogUrl;
}

2.2 数据库映射层(Mapper层)

在 com.pjb.pm.mapper 包中,创建 UserMapper 接口(用户信息 Mapper 动态代理接口)。

package com.pjb.pm.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pjb.pm.entity.UserInfo;
import org.apache.ibatis.annotations.Mapper;

/**
 * 用户信息 Mapper 动态代理接口
 * @author pan_junbiao
 **/
@Mapper
public interface UserMapper extends BaseMapper<UserInfo>
{
}

但是建议以后直接在 SpringBoot 启动类中加 @MapperScan("com.pjb.pm.mapper") 注解,这样会比较方便,不需要对每个 Mapper 都添加 @Mapper 注解。

package com.pjb.pm;

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

@SpringBootApplication
@MapperScan("com.pjb.pm.mapper") //扫描mapper文件
public class ProjectManagementApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(ProjectManagementApplication.class, args);
        System.out.println("项目启动成功!");
    }
}

2.3 编写 Mapper 配置文件(静态文件)

在 resources/mapping 目录下,创建用户信息 Mapper 配置文件(UserMapper.xml)。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pjb.pm.mapper.UserMapper">

</mapper>

 2.4 业务逻辑层(Service层)

在 com.pjb.pm.service 包下,创建 UserService 接口(用户信息服务接口),并继承 IService 接口。

package com.pjb.pm.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.pjb.pm.entity.UserInfo;

/**
 * 用户信息服务接口
 * @author pan_junbiao
 **/
public interface IUserService extends IService<UserInfo>
{
    /**
     * 查询用户信息
     */
    UserInfo getUserInfo(Long userId);

    /**
     * 根据条件,查询用户信息
     */
    UserInfo getUserInfoByAccount(String userAccount);

    /**
     * 新增用户信息
     */
    boolean addUserInfo(UserInfo userInfo);

    /**
     * 修改用户信息
     */
    boolean updateUserInfo(UserInfo userInfo);

    /**
     * 新增或修改用户信息
     */
    boolean saveOrUpdateUserInfo(UserInfo userInfo);

    /**
     * 删除用户信息
     */
    boolean deleteUserInfo(Long userId);
}

在 com.pjb.pm.service.impl 包下,创建 UserServiceImpl 类(用户信息服务类),并继承 ServiceImpl 类。

package com.pjb.pm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pjb.pm.entity.UserInfo;
import com.pjb.pm.mapper.UserMapper;
import com.pjb.pm.service.IUserService;
import org.springframework.stereotype.Service;

/**
 * 用户信息服务类
 * @author pan_junbiao
 **/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, UserInfo> implements IUserService
{
    /**
     * 查询用户信息
     */
    @Override
    public UserInfo getUserInfo(Long userId)
    {
        UserInfo userInfo = this.getById(userId);
        return userInfo;
    }

    /**
     * 根据条件,查询用户信息
     */
    @Override
    public UserInfo getUserInfoByAccount(String userAccount)
    {
        //查询条件
        LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserInfo::getUserAccount,userAccount);

        //执行查询
        UserInfo userInfo = this.getOne(queryWrapper);
        return userInfo;
    }

    /**
     * 新增用户信息
     */
    @Override
    public boolean addUserInfo(UserInfo userInfo)
    {
        boolean result = this.save(userInfo);
        return result;
    }

    /**
     * 修改用户信息
     */
    @Override
    public boolean updateUserInfo(UserInfo userInfo)
    {
        boolean result = this.updateById(userInfo);
        return result;
    }

    /**
     * 新增或修改用户信息
     */
    @Override
    public boolean saveOrUpdateUserInfo(UserInfo userInfo)
    {
        boolean result = this.saveOrUpdate(userInfo);
        return result;
    }

    /**
     * 删除用户信息
     */
    @Override
    public boolean deleteUserInfo(Long userId)
    {
        boolean result = this.removeById(userId);
        return result;
    }

}

2.5 控制器方法(Controller层)

在 com.pjb.pm.controller 包中,创建 UserController 类(用户控制器),实现用户数据的查询、新增、修改、删除,并实现数据的返回。

package com.pjb.pm.controller;

import com.pjb.pm.entity.UserInfo;
import com.pjb.pm.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 用户信息控制器
 * @author pan_junbiao
 **/
@RestController
@RequestMapping("/user")
public class UserController
{
    @Autowired
    private IUserService userService;

    /**
     * 查询用户信息
     */
    @RequestMapping(value = "/getUserInfo/{id}", method = RequestMethod.GET)
    public UserInfo getUserInfo(@PathVariable("id") Long userId)
    {
        UserInfo userInfo = userService.getUserInfo(userId);
        return userInfo;
    }

    /**
     * 根据条件,查询用户信息
     */
    @RequestMapping(value = "/getUserInfoByAccount", method = RequestMethod.GET)
    public UserInfo getUserInfoByAccount(String userAccount)
    {
        UserInfo userInfo = userService.getUserInfoByAccount(userAccount);
        return userInfo;
    }

    /**
     * 新增用户信息
     */
    @RequestMapping(value = "/addUserInfo", method = RequestMethod.POST)
    public boolean addUserInfo(@RequestBody UserInfo userInfo)
    {
        boolean result = userService.addUserInfo(userInfo);
        return result;
    }

    /**
     * 修改用户信息
     */
    @RequestMapping(value = "/updateUserInfo", method = RequestMethod.POST)
    public boolean updateUserInfo(@RequestBody UserInfo userInfo)
    {
        boolean result = userService.updateUserInfo(userInfo);
        return result;
    }

    /**
     * 新增或修改用户信息
     */
    @RequestMapping(value = "/saveOrUpdateUserInfo", method = RequestMethod.POST)
    public boolean saveOrUpdateUserInfo(@RequestBody UserInfo userInfo)
    {
        boolean result = userService.saveOrUpdateUserInfo(userInfo);
        return result;
    }

    /**
     * 删除用户信息
     */
    @RequestMapping(value = "/deleteUserInfo/{id}", method = RequestMethod.POST)
    public boolean deleteUserInfo(@PathVariable("id") Long userId)
    {
        boolean result = userService.deleteUserInfo(userId);
        return result;
    }
}

3、综合实例

【实例】实现用户信息的查询、新增、修改、删除操作。

3.1 查询用户

查询用户信息,执行结果如下图:

3.2 根据条件,查询用户信息

根据条件,查询用户信息,执行结果如下图:

3.3 新增用户

新增用户信息,执行结果如下图:

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

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

相关文章

剑指 offer 刷题集

目录 数组 1. LCR 121. 寻找目标值 - 二维数组 2. LCR 120. 寻找文件副本 3. LCR 128. 库存管理 I 4. LCR 131. 砍竹子 I 5. LCR 132. 砍竹子 II 6. LCR 135. 报数 7. LCR 139. 训练计划 I 8. LCR 158. 库存管理 II 9. LCR 159. 库存管理 III 10. LCR 160. 数据流中…

从GPS接收机灵敏度出发--理论计算GPS最低的跟踪灵敏度

思博伦售后团队 对射频工程师来说&#xff0c;自己设计的接收机灵敏度&#xff08;Receiver Sensitivity&#xff09;是最关注也是最重要的参数之一。所以我们首先来看看接收机灵敏度的定义&#xff1a; 在满足一定误码率的条件下&#xff0c;接收机能容许接受到的最小信号电平…

FPGA学习(3)-38译码器实现

目录 1.38译码器概述 2.VIVADO步骤 2.1创建工程&#xff0c;添加源文件 2.2添加仿真文件&#xff0c;并进行仿真 ​2.3添加管脚约束 2.4生成bit文件 2.5 烧录程序 3.实验结果 1.38译码器概述 即三个输入A2A1A0&#xff0c;输出的十进制数&#xff0c;例如LHL(010)2…

class 026 哈希表、有序表和比较器的用法

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. https://space.bilibili.com/8888480?spm_id_f…

Docker实践与应用:深度探索与丰富案例

一、引言 在当今的软件开发和运维领域&#xff0c;Docker已经成为了一种不可或缺的技术。它以容器化的方式改变了软件的开发、部署和运行模式&#xff0c;为企业和开发者带来了前所未有的便利和效率提升。本文将深入探讨Docker的实践操作以及丰富的应用举例&#xff0c;带您全面…

点餐小程序实战教程12菜品展示

目录 1 点餐界面2 显示菜品分类2.1 创建变量2.2 数据绑定 3 显示菜品总结 我们上一篇介绍了数据源的设计方法&#xff0c;讲解了菜品分类和菜品数据源的创建以及后台功能的开发。有了后台功能并且准备好数据之后&#xff0c;我们就需要开发小程序部分。 现实中你看到的想到的绝…

基于SpringBoot+Vue3的在线报名系统

一、项目介绍 1.1 项目介绍 本项目为一个报名系统&#xff0c;实现了基本的报名流程&#xff0c;功能完善&#xff0c;前后端皆有个人独立开发&#xff0c;功能相对不是特别难&#xff0c;但该有的功能还是都已经实现。 1.2 技术架构 主要技术栈&#xff1a; SpringBoot2 …

【LLM学习之路】9月25日26日27日 第十二、十三、十四天 Transformer Encoder

【LLM学习之路】9月25日26日27日 第十二、十三、十四天 Transformer Encoder Encoder 负责将输入的词语序列转换为词向量序列&#xff0c;Decoder 则基于 Encoder 的隐状态来迭代地生成词语序列作为输出&#xff0c;每次生成一个词语。 王木头 词向量&#xff0c;使用高维向…

教师工作量|基于springBoot的教师工作量管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff…

论文笔记(四十七)Diffusion Policy: Visuomotor Policy

Diffusion Policy: Visuomotor Policy 文章概括摘要1. 介绍2. 扩散策略的公式化2.1 去噪扩散概率模型2.2 DDPM 训练2.3 用于视觉运动策略学习的扩散模型 3 关键设计决策3.1 网络架构选项3.2 视觉编码器3.3 噪声计划3.4 加速实时控制的推理 4. 扩散策略的四个引人入胜的特性4.1 …

Meta号称替代程序员的LlamaCoder效果被CodeFlying秒杀,来看实测!

在讲LlamaCoder之前咱先浅聊一下Meta 这两天Meta凭借着Connect 2024大会可谓是风头正盛&#xff0c;刚刚发布的全新开源多模态大模型Llama3.2&#xff0c;热度是一路赶超咱的小草莓啊。 作为一款开源大模型能够和闭源的4o-mini、Claude3 Haiku打的有来有回&#xff0c; 甚至L…

protobuf编码方式

protobuf编码方式 一个简单的例子 message Test1 {optional int32 a 1; }上述的proto文件&#xff0c;设置a 150&#xff0c;那么将其序列化后&#xff0c;得到的数据就是08 96 01&#xff0c;然后你使用protoscope工具去解析这些数据&#xff0c;就得到1 : 150&#xff0c…

labview更换操作系统后打开原VI闪退

labview更换操作系统后打开原VI闪退 问题描述&#xff1a; Windows11由家庭版更换为专业版后&#xff0c;重新安装labview2021&#xff0c;打开原来的项目&#xff0c;项目管理器可以正常打开&#xff0c;但是打开VI却闪退&#xff0c;并报错如下 出现这种原因主要是labview在…

Kubernetes深入详解(一)

目录 第一部分 K8s概念和架构 1、k8s概述和特性 2、K8s架构组件 3、k8s核心概念 第二部分 从零搭建k8s集群 1、搭建k8s环境平台规划 2、服务器硬件配置要求 3、搭建k8s集群部署方式 (1) 基于客户端工具kubeadm 1、安装Docker 2、添加阿里云YUM软件源 3、安 装kubea…

16.第二阶段x86游戏实战2-发包函数和怎么去找改写过的发包函数

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

Stable Diffusion 优秀博客转载

初版论文地址&#xff1a;https://arxiv.org/pdf/2112.10752 主要流程图&#xff1a; Latent Diffusion Models&#xff08;LDMs&#xff09; DDPM是"Denoising Diffusion Probabilistic Models"的缩写&#xff0c; 去噪扩散概率模型 博客&#xff1a; https://ja…

【CSS in Depth 2 精译_041】6.4 CSS 中的堆叠上下文与 z-index(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

AT89C51 利用SBIT寻址,并且在内存中实现伪动态密码的混淆

前置发现 && 分析 char bdata DB[2]; //char sbit x bdata DB[0]^7; //取内存地址数组[0]地址的的七位 这样我们可以对数组DB中索引0的位置进行修改… 例如,将密码A映射到真实密码C,这样做的好处是你的程序被逆向分析的时候,攻击者无法真正知道密码到底是什么…因为…

C语言-线程

一,线程的概念 1,线程的定义 在 C 语言中&#xff0c;线程是程序执行的最小单位&#xff0c;它是进程中的一个实体&#xff0c;是被系统独立调度和分派的基本单位。 2、线程的特点 轻型实体&#xff1a;线程是一个轻型实体&#xff0c;它只拥有必不可少的资源&#xff0c;如程…

学生党有福了!分享5个免费的AI论文生成工具

学生党在学术写作方面常常面临时间紧迫和写作能力不足的问题。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;市面上出现了许多免费的AI论文生成工具&#xff0c;极大地提高了写作效率和质量。今天&#xff0c;我将向大家推荐五款免费的AI论文生成工具&#xff0c;并…