5.基于SpringBoot的SSMP整合案例-数据层开发

news2024/11/27 10:56:17

目录

1.新建项目

2.实体类开发:

2.1在pom.xml中增加Lombok坐标:

2.2添加Book实体类

3.数据层开发:

3.1 配置MyBatisPlus与Druid

3.2创建数据层接口

3.3写测试类

3.4点击运行:

4.数据层快速开发:

4.1配置MyBatisPlus与Druid

4.2创建数据层接口:

4.3写测试类:

4.4点击运行:

4.5 测试Dao其他功能

5.开始MV运行日志:

5.1 使用配置方式开启日志,设置日志输出方式为标准输出

5.2 去掉System.out.println(),点击运行

6.分页

6.1使用IPage封装分页数据

6.2 IPage对象中封装了分页操作中的所有数据

6.3 分页操作依赖MyBatisPlus分页拦截器实现功能

6.4借助MyBatisPlus日志查阅执行SQL语句

7.条件查询功能

7.1使用QueryWrapper对象封装查询条件

7.2推荐使用LambdaQueryWrapper对象

7.3 所有查询操作封装成方法调用

7.4查询条件支持动态条件拼装

7.5  LambdaQueryWrapper其他查询条件示例:

7.5.1 添加查询条件

7.5.2 链式调用

7.5.3 使用 OR 和 AND 条件

7.5.4 模糊查询

7.5.5 排序

7.5.6 选择特定字段

7.5.7 组合查询

7.5.8 使用 LambdaQueryWrapper 进行查询


1.新建项目

点击下一步,勾选Web下的Spring web 和 SQL下面的MySQL Driver,点击创建。

打开pomxml,添加mybatis以及druid依赖到pomxml

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.20</version>
</dependency>

修改运行程序名称SpringBootJdk8SsmApplication为Application

修改application.properties配置文件的格式为 yml格式

2.实体类开发:

2.1在pom.xml中增加Lombok坐标:

Lombok,一个]ava类库,提供了一组注解,简化POJO实体类开发

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

2.2添加Book实体类

代码如下:

package com.summer.domain;

import lombok.Data;

//lombok
@Data
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
}

3.数据层开发:

3.1 配置MyBatisPlus与Druid

在1. 新建项目的时候,已经在pom.xml中导入MyBatisPlus与Druid对应的starter坐标,这时只需要在application.yml配置中 增加相应的配置就可以了

#端口配置
server:
  port: 8081

#数据库 用户名 密码 配置
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
      username: root
      password: root

#数据库前缀配置
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_

3.2创建数据层接口

代码如下所示:

package com.summer.dao;

import com.summer.domain.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface BookDao {
    @Select("select * from tbl_book where id = #{id}")
    Book getById(Integer id);

}

3.3写测试类

在test下写一个book的测试类

代码如下所示:

package com.summer.dao;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookDao bookDao;

    @Test
    void testGetById() {
        System.out.println(bookDao.getById(1));

    }

}

3.4点击运行:

4.数据层快速开发:

4.1配置MyBatisPlus与Druid

     同 3.1 

4.2创建数据层接口:

只要数据层接口集成 BaseMapper<T> 就可以了

代码如下所示:

package com.summer.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.summer.domain.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface BookDao extends BaseMapper<Book> {
//    @Select("select * from tbl_book where id = #{id}")
//    Book getById(Integer id);

}

4.3写测试类:

同3.3一样创建测试类,测试类内容如下:

package com.summer.dao;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookDao bookDao;

    @Test
    void testGetById() {
        System.out.println(bookDao.selectById(1));

    }

}

4.4点击运行:

4.5 测试Dao其他功能

具体代码如下:

package com.summer.dao;

import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookDao bookDao;

    @Test
    void testGetById() {
        System.out.println(bookDao.selectById(1));

    }

    @Test
    void testSave() {
        Book book = new Book();
        book.setType("历史");
        book.setName("历史的温度");
        book.setDescription("通过讲述历史人物的故事,展现了历史的温情和人性的光辉");
        System.out.println(bookDao.insert(book));

    }

    @Test
    void testGetAll()
    {
        System.out.println(bookDao.selectList(null));
    }


    @Test
    void testUpdate(){
        Book book = new Book();
        book.setId(7);
        book.setType("历史");
        book.setName("历史的温度1");
        book.setDescription("通过讲述历史人物的故事,展现了历史的温情和人性的光辉");
        System.out.println(bookDao.updateById(book));

    }

    @Test
    void testDelete()
    {
        bookDao.deleteById(6);
    }
    
}

在测试保存数据功能时,要在application.yml内加一行id-type: auto ,不然系统会默认assign_id,运行会报错

5.开始MV运行日志:

5.1 使用配置方式开启日志,设置日志输出方式为标准输出

代码如下:

#端口配置
server:
  port: 8081

#数据库 用户名 密码 配置
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
      username: root
      password: root

#数据库前缀配置
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_
      id-type: auto
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.2 去掉System.out.println(),点击运行

去掉1处的System.out.println(), 执行步骤 2.点击运行,出现如下图3所示,具体的日志信息

6.分页

6.1使用IPage封装分页数据

分页操作需要设定分页对象IPage,代码如下所示:

package com.summer.dao;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookDao bookDao;

    @Test
    void testGetPage() {
        //分页操作需要设定分页对象IPage
        IPage page = new Page(1,5);
        bookDao.selectPage(page,null);
    }

}

6.2 IPage对象中封装了分页操作中的所有数据

  • 数据
  • 当前页码值
  • 每页数据总量
  • 最大页码值
  • 数据总量

6.3 分页操作依赖MyBatisPlus分页拦截器实现功能

分页操作是在MyBatisP1us的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现。

创建拦截器MPConfig,如下图所示:

代码如下所示:

package com.summer.config;

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 MPConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return  interceptor;

    }
}

6.4借助MyBatisPlus日志查阅执行SQL语句

运行testGetPage方法,打开日志,如下图所示:

7.条件查询功能

7.1使用QueryWrapper对象封装查询条件

package com.summer.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookDao bookDao;


    @Test
    void testGetBy()
    {
        QueryWrapper<Book> qw = new QueryWrapper();
        qw.like("name","Spring");
        bookDao.selectList(qw);
    }

}

点击运行,如下图所示:


7.2推荐使用LambdaQueryWrapper对象

在下面testGetBy2测试方法中

        if(name != null){
            lqw.like( Book::getName,name);
        }

 lqw.like(name != null, Book::getName,name);

表达的意思是一样的, lqw.like(name != null, Book::getName,name);  表达的意思就是 当name 不等于 null的时候 sql执行like功能

package com.summer.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookDao bookDao;


    @Test
    void testGetBy2()
    {
        String name = null;
        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();

//        if(name != null){
//            lqw.like( Book::getName,name);
//        }

        lqw.like(name != null, Book::getName,name);
        bookDao.selectList(lqw);
    }


}

针对testGetBy2测试方法,点击运行,如下图所示,没有执行like条件语句:

如果testGetBy2测试方法里面的name变量赋上值,点击运行,如下图所示,执行了like语句:

7.3 所有查询操作封装成方法调用

分页查询Page所支持的函数如下所示

package com.summer.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.apache.logging.log4j.util.Strings;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookDao bookDao;

    @Test
    void testGetByCondition()
    {
        IPage page = new Page(1,2);
        String name = "历史";
        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();
        lqw.like(name != null, Book::getName,name);
        bookDao.selectPage(page,lqw);
        System.out.println( page.getCurrent());//当前页
        System.out.println(page.getPages());//页数
        System.out.println(page.getSize());//每页显示数据条数
        System.out.println(page.getTotal());//总计数据条数
        System.out.println(page.getRecords());//当前页的所有记录
    }

}

点击运行,如下图所示:

7.4查询条件支持动态条件拼装

package com.summer.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTestCase {

    @Autowired
    private BookDao bookDao;

  @Test
    void testGetByCondition()
    {
        IPage page = new Page(1,5);
        String name = "历史";
        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();
        lqw.like(name != null, Book::getName,name);
        bookDao.selectPage(page,lqw);
    }

}

7.5  LambdaQueryWrapper其他查询条件示例:

7.5.1 添加查询条件

  • 使用 Lambda 表达式添加条件,例如,添加一个条件来查询用户的年龄大于 18:

queryWrapper.gt(User::getAge, 18); // gt 表示 greater than

7.5.2 链式调用

  • LambdaQueryWrapper 支持链式调用,可以连续添加多个条件:

queryWrapper
    .eq(User::getName, "张三") // eq 表示 equal
    .lt(User::getAge, 30); // lt 表示 less than

7.5.3 使用 OR 和 AND 条件

  • 可以添加 OR 或 AND 条件组:

queryWrapper
    .eq(User::getName, "张三")
    .and(w -> w.lt(User::getAge, 30))
    .or(w -> w.gt(User::getSalary, 5000));

7.5.4 模糊查询

进行模糊查询,例如,查询用户名包含 "user" 的用户:

queryWrapper.like(User::getName, "user");

7.5.5 排序

对查询结果进行排序:

queryWrapper.orderByAsc(User::getAge); // 升序 queryWrapper.orderByDesc(User::getSalary); // 降序

7.5.6 选择特定字段

选择查询结果中的特定字段:

queryWrapper.select(User::getId, User::getName); // 只选择 id 和 name 字段

7.5.7 组合查询

可以组合多个条件,例如,组合 IN 和 LIKE:

queryWrapper
    .in(User::getId, Arrays.asList(1, 2, 3))
    .like(User::getName, "user");

7.5.8 使用 LambdaQueryWrapper 进行查询

最后,你可以使用 LambdaQueryWrapper 与 MyBatis-Plus 的 Mapper 接口一起使用,执行查询:

List<User> users = userMapper.selectList(queryWrapper);

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

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

相关文章

【数据结构】02.顺序表

一、顺序表的概念与结构 1.1线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0…

HighConcurrencyCommFramework c++通讯服务器框架 :简介-信号处理

项目是4月份左右做的现在整理到博客上&#xff0c;顺便加深一下印象 介绍 项目描述:该项目是使用 C 实现的高并发服务器脚手架&#xff0c;包含线程池和连接池等技术&#xff0c;支持开发者进行二次开发复用&#xff0c;只需 要添加对应业务逻辑即可完成通信服务器、网络交易…

【Termius】详细说明MacOS中的SSH的客户端利器Termius

希望文章能给到你启发和灵感~ 如果觉得有帮助的话,点赞+关注+收藏支持一下博主哦~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、软件的安装2.1 Termius界面介绍2.1.1 Hosts 主机列表2.1.2 SFTP 文件传输2.1.3 Port ForWarding 端口转发2.1.4 Snippets 片…

afrog-漏洞扫描(挖洞)工具【了解安装使用详细】

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、afrog介绍 afrog 是一款性能卓越、快速稳定、PoC可定…

全面教程:在Ubuntu上快速部署ZeroTier,实现Windows与VSCode的局域网无缝访问

文章目录 1 背景介绍2 Windows上的操作3 Ubuntu上的操作4 连接 1 背景介绍 在现代工作环境中&#xff0c;远程访问公司内网的Ubuntu主机对于开发者来说是一项基本需求。然而&#xff0c;由于内网的限制&#xff0c;传统的远程控制软件如向日葵和todesk往往无法满足这一需求。作…

【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化

任何中间件的面试说到底都是以高可用、高性能和高并发为主&#xff0c;而高性能和高并发基本是同时存在的。 性能优化一直被看作一个高级面试点&#xff0c;因为只有对原理了解得很透彻的人&#xff0c;在实践中才能找准性能优化的关键点&#xff0c;从而通过各种优化手段解决性…

YOLOv5改进 | 损失函数 | EIoU、SIoU、WIoU、DIoU、FocuSIoU等多种损失函数

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 …

VsCode允许JSON文件注释

打开设置 配置 输入&#xff1a;文件关联或者Files: Associations

Qt实现检测软件是否多开

Qt实现检测软件是否多开 在桌面软件开发中&#xff0c;软件通常要设置只允许存在一个进程&#xff0c;像一些熟知的音乐软件&#xff0c;QQ音乐这种。而这些软件在限制只有一个进程的同时&#xff0c;通常还会有双击桌面图标唤醒已运行的后台进程的功能。关于双击桌面唤醒已运…

Android广播机制

简介 某个网络的IP范围是192.168.0.XXX&#xff0c;子网 掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口&#xff0c;这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知&…

Android使用http加载自建服务器静态网页

最终效果如下图&#xff0c;成功加载了电脑端的静态网页内容&#xff0c;这是一个xml文件。 电脑端搭建http服务器 使用“Apache Http Server”&#xff0c;下载地址是&#xff1a;https://httpd.apache.org/download.cgi。具体操作步骤&#xff0c;参考&#xff1a;Apache …

使用 urllib OpenSSL 时遇到的问题及解决

题意&#xff1a; ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1, currently the ssl module is compiled with LibreSSL 2.8.3 当前使用的 urllib3 版本&#xff08;v2.0&#xff09;仅支持 OpenSSL 1.1.1 或更高版本&#xff0c;但你的 Python 环境中的 ssl 模块…

Windows 11 安装 Python 3.11 完整教程

Windows 11 安装 Python 3.11 完整教程 一、安装包安装 1. 下载 Python 3.11 安装包 打开浏览器,访问 Python 官方下载页面。点击“Download Python 3.11”,下载适用于 Windows 的安装包(Windows installer)。 2. 安装 Python 3.11 运行下载的安装包 python-3.11.x-amd6…

django @login_required 为什么会自动重定向到/accounts/login/?next=/myblog/post/new/

在Django中&#xff0c;login_required 装饰器用于确保用户在访问某个视图时已经登录。如果用户未登录&#xff0c;那么Django会自动重定向用户到登录页面。默认情况下&#xff0c;Django使用/accounts/login/作为登录URL。如果用户试图访问一个需要登录的视图&#xff0c;比如…

eNSP-VLAN虚拟局域网

一、出现Vlan的原因 同一个局域网&#xff0c;使用交换机连接&#xff0c;虽然比集线器相连&#xff0c;降低了广播风暴&#xff0c;但是局域网主机数量够多的时候&#xff0c;正常的广播数据(arp、dhcp)也很影响网络性能&#xff0c;所以还需要进一步降低广播风暴——VLAN (图…

Altium Designer专业PCB设计软件下载安装 Altium Designer安装包下载获取

在电子设计的广袤领域中&#xff0c;PCB设计无疑占据着重要的地位。而Altium Designer作为一款业界领先的电子设计自动化软件&#xff0c;其提供的先进布局工具&#xff0c;无疑为设计师们打开了一扇通往高效、精确设计的大门。 在PCB设计的核心环节——布局中&#xff0c;Alti…

xinput1_4.dll丢失怎么办?如何来解决xinput1_4.dll丢失问题

在电脑启动游戏时候经常会出现一些问题导致游戏无法打开运行&#xff0c;其中找不到xinput1_4.dll文件丢失就是常见问题之一&#xff0c;那么当遇到xinput1_4.dll丢失怎么办呢&#xff1f;今天就教大家如何来解决xinput1_4.dll丢失问题。 一、xinput1_4.dll文件详解 XINPUT1_4…

一款优秀、亮眼的开源堡垒机

介绍 在运维的日常工作中&#xff0c;登陆服务器操作不可避免&#xff0c;为了更安全的管控服务器&#xff0c;但凡有点规模的公司都会上线堡垒机系统&#xff0c;堡垒机能够做到事前授权、事中监控、事后审计&#xff0c;同时也可以满足等保合规要求。 提到堡垒机&#xff0…

小白 | 华为云docker设置镜像加速器

一、操作场景 通过docker pull命令下载镜像中心的公有镜像时&#xff0c;往往会因为网络原因而需要很长时间&#xff0c;甚至可能因超时而下载失败。为此&#xff0c;容器镜像服务提供了镜像下载加速功能&#xff0c;帮助您获得更快的下载体验。 二、约束与限制 构建镜像的客…

LVS+Nginx高可用集群--基础篇

1.集群概述 单体部署&#xff1a; 可以将上面内容分别部署在不同的服务器上。 单体架构的优点&#xff1a; 小团队成型就可完成开发&#xff0c;测试&#xff0c;上线 迭代周期短&#xff0c;速度快 打包方便&#xff0c;运维简单 单体架构的挑战&#xff1a;单节点宕机造成…