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

目录

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.mfbz.cn/a/775564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Camera link(学习笔记)

Camera Link协议是一种专门针对机器视觉应用领域的串行通信协议&#xff0c;它使用低压差分信号(LVDS)进行数据的传输和通信。Camera Link标准是在ChannelLink标准的基础上多加了6对差分信号线&#xff0c;其中4对用于并行传输相机控制信号&#xff0c;另外2对用于相机和图像采…

植物学(书籍学习资料)

包含观赏植物学、植物学、植物学百科图鉴等多本植物学方面的书籍学习资料。 图2、3为观赏植物学截图&#xff1b; 图4、5为植物学百科图鉴截图&#xff1b; 图6、7为植物学学习指南截图。

YOLO V7项目使用

YOLO V7项目使用 根据官方论文中提供的项目地址&#xff1a;使用git clone将项目下载到本地。 https://github.com/WongKinYiu/yolov7 git clone https://github.com/WongKinYiu/yolov7 使用pycharm打开项目&#xff0c;根据官方提供的requirement.txt文件下载项目启动所需要的…

ERROR | Web server failed to start. Port 8080 was already in use.

错误提示&#xff1a; *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the process thats listening on port 8080 or configure thi…

ubuntu下后台启动程序

1.启动 nohup python detect_mq.py > output.out 2>&1 & 这个命令是用来在后台运行一个 Python 脚本 detect_mq.py&#xff0c;并将脚本的输出重定向到文件 output.out。下面是这个命令的详细解释&#xff1a; nohup&#xff1a;这是一个命令&#xff0c;它告诉…

【东奥会计-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

有哪些有效的策略可以提升独立站的外链数量?

有哪些有效的策略可以提升独立站的外链数量&#xff1f;提升独立站的外链数量并不难&#xff0c;难得是不被谷歌惩罚把你的网站判定为作弊&#xff0c;正因如此&#xff0c;了解并应用GNB自然外链策略是个不错的开始&#xff0c;GNB外链的核心价值在于它提高了网站外链资源的自…

2024亚太赛(中文)数学建模B题Python代码+结果表数据教学

B题题目&#xff1a;洪水灾害的数据分析与预测 完整论文也写完了 第二问代码&#xff08;1、3、4问、还有论文见文末&#xff09; import pandas as pd from sklearn.cluster import KMeans import matplotlib.pyplot as plt import seaborn as sns from matplotlib import rc…

2024年软件测试岗必问的100+个面试题【含答案】

一、基础理论 1、开场介绍 介绍要领&#xff1a;个人基本信息、工作经历、之前所做过的工作及个人专长或者技能优势。扬长避短&#xff0c;一定要口语化&#xff0c;语速适中。沟通好的就多说几句&#xff0c;沟通不好的话就尽量少说两句。举例如下&#xff1a; 面试官你好&…

.net core 的 winform 的 浏览器控件 WebView2

在.NET Core WinForms应用程序中&#xff0c;没有直接的“浏览器控件”&#xff0c;因为WinForms不支持像WebBrowser控件那样的功能。但是&#xff0c;你可以使用WebView2控件&#xff0c;它是一个基于Chromium的浏览器内核&#xff0c;可以在WinForms应用程序中嵌入Web内容。 …

Science Robotics 麻省理工学院最新研究,从仿真中学习的精确选择、定位和抓放物体的视触觉方法

现有的机器人系统在通用性和精确性两个性能目标上难以同时兼顾&#xff0c;往往会陷入一个机器人解决单个任务的情况&#xff0c;缺乏"精确泛化"。本文针对精准和通用的同时兼顾提出了解决方法。提出了SimPLE(Pick Localize和placE的仿真模拟)作为精确拾取和放置的解…

昇思25天学习打卡营第9天|MindSpore使用静态图加速(基于context的开启方式)

在Graph模式下&#xff0c;Python代码并不是由Python解释器去执行&#xff0c;而是将代码编译成静态计算图&#xff0c;然后执行静态计算图。 在静态图模式下&#xff0c;MindSpore通过源码转换的方式&#xff0c;将Python的源码转换成中间表达IR&#xff08;Intermediate Repr…

电气-伺服(6)脉冲控制

一、脉冲模式原理&#xff1a; 运动控制器输出脉冲信号给伺服驱动器 伺服驱动器工作于位置模式 伺服驱动器内部要完成三闭环&#xff08;位置闭环 、速度闭环、电流环&#xff09; 脉冲和伺服控制环&#xff1a;脉冲的个数作用于位置环。脉冲的频率作用于速度环 二、脉冲的两…

ATFX汇市:美国大非农数据来袭,美指与欧元或迎剧烈波动

ATFX汇市&#xff1a;今日20:30&#xff0c;美国劳工部将公布6月非农就业报告&#xff0c;其中新增非农就业人口数据最受关注&#xff0c;前值为27.2万人&#xff0c;预期值19万人&#xff0c;预期降幅高达8.2万人。如果公布值确实如预期一般&#xff0c;美联储降息预期将增强&…

mysql 字符集(character set)和排序规则(collation)

文章目录 概念1、字符集1.1、举例1.2、常见字符集 utf8 和 utf8mb4 区别1.3、字符集 使用 2、排序规则2.1、举例2.2、常见的排序规则 utf8mb4_bin 、utf8mb4_general_ci、utf8mb4_unicode_ci2.3、使用 概念 在 MySQL 中&#xff0c;字符集&#xff08;character set&#xff0…

昇思25天学习打卡营第8天|ResNet50迁移学习

一、迁移学习定义 迁移学习&#xff08;Transfer Learning&#xff09;&#xff1a;在一个任务上训练得到的模型包含的知识可以部分或全部地转移到另一个任务上。允许模型将从一个任务中学到的知识应用到另一个相关的任务中。适用于数据稀缺的情况&#xff0c;可减少对大量标记…

【代码大全2 选读】看看骨灰级高手消灭 if-else 逻辑的瑞士军刀长啥样

文章目录 1 【写在前面】2 【心法】这把瑞士军刀长啥样3 【示例1】确定某个月份的天数&#xff08;Days-in-Month Example&#xff09;4 【示例2】确定保险费率&#xff08;Insurance Rates Example&#xff09;5 【示例3】灵活的消息格式&#xff08;Flexible-Message-Format …

Windows10删除文件有较长延误的修复方法

Windows10删除文件有较长延误的修复方法 问题描述处理方法 问题描述 电脑配置很好&#xff0c;但是执行文件等删除操作时很长时间才有反应&#xff0c;才会弹出是否删除对话框。或者将文件移动到回收站&#xff0c;也是同样如此。 处理方法 第一步&#xff1a;以管理员身份启…

gitLab使用流程

标题1.配置账户 git config --global user.name git config --global user.email mygitlabmali.cn 标题2.生成秘匙 ssh-keygen -t rsa -C “mygitlabmail.cn” 。 //输入命令后一直回车 &#xff0c;输入命令后一直回车&#xff08;密码可以不填&#xff09;&#xff0c;至…

国际上备考所有AWS云计算/IT证书的五大优质免费课程网站

最近越来越多的小伙伴来问小李哥&#xff0c;小李哥亚马逊云科技AWS认证大满贯是在哪里上课复习的呢&#xff1f;全部上付费课程那不是一笔巨款吗&#xff1f;小李哥这次来盘点备考国际上IT证书的5大优质免费课程网站(不只是亚马逊云科技AWS的课程&#xff0c;其他课程同样可以…