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.Driverurl: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTCusername: rootpassword: 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 {@Autowiredprivate BookDao bookDao;@Testvoid 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 {@Autowiredprivate BookDao bookDao;@Testvoid 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 {@Autowiredprivate BookDao bookDao;@Testvoid testGetById() {System.out.println(bookDao.selectById(1));}@Testvoid testSave() {Book book = new Book();book.setType("历史");book.setName("历史的温度");book.setDescription("通过讲述历史人物的故事,展现了历史的温情和人性的光辉");System.out.println(bookDao.insert(book));}@Testvoid testGetAll(){System.out.println(bookDao.selectList(null));}@Testvoid testUpdate(){Book book = new Book();book.setId(7);book.setType("历史");book.setName("历史的温度1");book.setDescription("通过讲述历史人物的故事,展现了历史的温情和人性的光辉");System.out.println(bookDao.updateById(book));}@Testvoid 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.Driverurl: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTCusername: rootpassword: root#数据库前缀配置
mybatis-plus:global-config:db-config:table-prefix: tbl_id-type: autoconfiguration: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 {@Autowiredprivate BookDao bookDao;@Testvoid testGetPage() {//分页操作需要设定分页对象IPageIPage 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 {@Beanpublic 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 {@Autowiredprivate BookDao bookDao;@Testvoid 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 {@Autowiredprivate BookDao bookDao;@Testvoid 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 {@Autowiredprivate BookDao bookDao;@Testvoid 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 {@Autowiredprivate BookDao bookDao;@Testvoid 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.mzph.cn/news/866030.shtml

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

相关文章

C++视觉开发 四.手势识别

本章记录传统手势识别&#xff0c;在表示0-5六个数值时的识别问题。例如识别剪刀石头布&#xff0c;手势&#xff0c;以及其表示的动作。在识别时将手势中的凹陷区域称为凸缺陷&#xff0c;其个数作为识别的重要依据。 需要注意&#xff0c;在凸缺陷个数为0时&#xff0c;无法…

S272钡铼技术4G无线RTU支持多路DIN输入和模拟量转换至4G网络

钡铼第四代RTU S272是一款先进的工业级4G远程遥测终端&#xff0c;为各种远程工业数据采集和控制系统提供了高效解决方案。结合了现代通信技术和多功能的输入输出接口&#xff0c;S272不仅支持多路数字量和模拟量输入&#xff0c;还具备灵活的扩展性和强大的控制功能&#xff0…

WEB攻防-XSS跨站反射型存储型DOM型标签闭合输入输出JS代码解析

文章目录 XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM反射型XSS存储型XSSDOM-base型XSS XSS跨站-输入输出-原理&分类&闭合 漏洞原理&#xff1a;接受输入数据&#xff0c;输出显示数据后解析执行 基础类型&#xff1a;反射(非持续…

典型案例 | 基于全数字实时仿真的嵌入式DevOps解决方案

为丰富浙江省信息技术应用创新&#xff08;以下简称“信创”&#xff09;产业生态&#xff0c;在全社会各领域形成示范效应&#xff0c;浙江省经信厅联合省密码管理局开展2023年浙江省深化信创典型案例评选工作。 经过征集申报、专家评选、名单公示等程序&#xff0c;确定36个…

实现前端项目自动构建和部署(Gitee Go)

前言 相信所有的前端开发者都希望将自己的代码部署在服务器上让所有人都能访问到&#xff0c;但是却不知道如何进行部署。其实要是实现代码上线非常简单&#xff0c;我们只需要将build之后的代码上传到服务器&#xff0c;然后通过Nginx起一个服务指向我们build后的代码就可以了…

Cocos 7.2~7.4

这几天没更新CSDN&#xff0c;跑去玩Cocos了。自从知道我的粉丝百分之十之八九都是假人&#xff0c;更新确实没什么动力了。主要还是把这边当成一个日记本吧。 选择cocos的原因也很简单。会点js&#xff0c;技术栈比较接近&#xff0c;上手估计也快。简单记录下这几天的内容 主…

@amap/amap-jsapi-loader 实现高德地图中添加多边围栏,并可编辑,编辑后获得围栏各个点的经纬度

先上一张效果图 看看是不是大家想要的效果&#xff5e; ❤️ 希望其中的小点能帮助大家&#xff0c;主要看怎么绘制在地图上的代码即可 1.第一步要加入项目package.json中或者直接yarn install它都可以 想必大家应该都会 "amap/amap-jsapi-loader": "0.0.7&qu…

C语言作业笔记

1. 要找俩个数使其相加等于一个数&#xff0c;那么俩个数从头尾出发&#xff0c;先动一边&#xff0c;假设是尾先动&#xff0c;一开始俩个数相加大于sum&#xff08;小于的话就动头&#xff09;&#xff0c;那么总有一时刻俩数相加小于sum&#xff0c;则就在那一刻停下来&…

关于5G和卫星

手机&#xff0c;已经串联起了我们生活中的一切环节。我们随时随地拿出手机&#xff0c;都能畅快地上网。 这一切是如此地理所当然&#xff0c;以至于我们甚至想不到这样不可思议的问题&#xff1a; 移动通信网络真的无处不在吗&#xff1f; 我们都知道&#xff0c;地球虽叫…

毕业论文初稿写作方法与过程

毕业论文初稿写作方法与过程 毕业论文是大学生在学业结束前必须完成的一项重要任务&#xff0c;它不仅是对学生所学知识的综合运用&#xff0c;也是对学生研究能力和写作能力的检验。写好毕业论文初稿是完成高质量毕业论文的关键一步。下面将具体阐述毕业论文初稿的写作方法和过…

Redis 7.x 系列【18】事务

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 命令2.1 MULTI2.2 EXEC2.3 DISCARD2.4 WATCH2.5 UNWATCH 3. 事务中的错误4.…

无法识别为 cmdlet、函数、脚本文件或可运行程序的名称

一、遇到问题 PS D:\software\nacos\nacos-server-2.3.1\bin> startup.cmd -m standalone startup.cmd : 无法将“startup.cmd”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c; 请确保路径正确&#xff0c;然后…

Ubuntu su命令输入密码后提示“su: 认证失败”

在Ubuntu系统中&#xff0c;使用su命令切换到root用户时提示“su: 认证失败”通常是因为root账户默认情况下是被锁定的&#xff0c;没有设置密码。以下是一些解决这个问题的方法&#xff1a; 使用sudo命令&#xff1a;Ubuntu推荐使用sudo命令代替直接使用root用户。sudo命令允许…

Aavegotchi的Gotchiverse新地图: 沉睡的野兽即将苏醒!

Gotchi 守护者们&#xff0c;准备好了&#xff0c;因为我们要大开杀戒了&#xff01; 加入我们吧&#xff08;后果自负&#xff01;&#xff09;&#xff0c;我们将深入Gotchiverse&#xff0c;前往奥姆夫山--我们虚拟世界中所有 FOMO 的炽热源头。 请继续阅读&#xff0c;了解…

AI 绘画的常用技巧和操作方法

随着人工智能技术的飞速发展&#xff0c;AI 绘画已经成为设计和艺术领域的一股新兴力量。无论是设计师、艺术家&#xff0c;还是普通的科技爱好者&#xff0c;都能通过 AI 绘画工具创造出令人惊叹的作品。 AI 绘画的基本原理 AI 绘画的核心在于机器学习算法。通过训练大量的图像…

餐饮界的新传奇:沃可趣员工社区,让品牌关怀在指尖流淌

咖啡师与顾客发生肢体冲突、员工用咖啡粉泼顾客……某精品咖啡一天爆出两个大瓜&#xff01; 很快有网友指出咖啡店员工长期遭受重压&#xff0c;与品牌之间存在根本矛盾。 同样做餐饮的老牌快餐&#xff0c;门店密度与之不相上下&#xff0c;却很少发生这样的暴雷。 不仅因…

算法力扣刷题 三十一【150. 逆波兰表达式求值】

前言 栈和队列篇。 记录 三十一【150. 逆波兰表达式求值】 一、题目阅读 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。 每个操作…

Django创建项目(1)

运行 注意 在本次创建Django项目时&#xff0c;出现了一点小问题&#xff0c;由于我之前pip换源过&#xff0c;换源用的是http&#xff0c;结果在创建时&#xff0c;pip只支持https&#xff0c;所以如果出现创建项目失败的问题&#xff0c;那么有可能是因为换源的问题&#xf…

(三十一)Flask之wtforms库【剖析源码下篇】

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

AlphaGo 背后的人工智能:机器学习和神经网络

文章目录 一、说明二、背景三、围棋游戏四、AlphaGo 算法五、神经网络六、AlphaGo 的未来七、人工智能的未来八、结论 一、说明 棋盘游戏围棋被视为人工智能最具挑战性的任务之一&#xff0c;因为它“复杂、基于模式且难以编程”。计算机程序 AlphaGo 战胜李世石成为人工智能和…