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,一经查实,立即删除!

相关文章

流式数据库 RisingWave「Demo」:直播指标实时分析

直播因其能与观众进行实时互动的独特优势&#xff0c;成为目前最为流行的娱乐形式之一。想要优化直播效果&#xff0c;有许多指标需要跟踪。最常见的指标比如&#xff1a;人流量、评论数量、直播卡顿时长等等。 本教程将分享如何使用 RisingWave 监控直播流量指标。我们为本教…

python访问mongoDB

pip install pymongo1.建立连接 &#xff08;1&#xff09;模块引用 import pymongoClientMongoClient(host10.90.9.101,port27017)(2)访问数据库 dbclient.myDBdbconn.get_database("myDB")2.集合操作 &#xff08;1&#xff09;插入文档 colldb.get_collection(…

docker-compose version is obsolete

如果更新了docker或者docker-desktop 启动时候发现有 version is obsolete警告 删除yml第一行的version字段 上社区原文 Technically you can still define it… But you will get the warning you observed, and it won’t be used, as docker compose v2 (the cli plugin…

关于TaOTUB1的信息总结

关于TaOTUB1的信息总结 文献标题: Reducing expression of TaOTUB1s decreases tiller number in wheat 核心内容: 背景和目的: 小麦的分蘖数量是影响产量的重要农艺性状。OTUB1在水稻中被发现能够调控分蘖数量&#xff0c;而在小麦中的功能尚不明确。本研究旨在通过鉴定和分…

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

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

细说QT程序高分屏适配

文章目录 高分屏适配适配屏幕缩放禁用屏幕缩放开启系统配置属性获取当前屏幕信息在Qt中实现高分辨率屏幕的适配,主要涉及对界面元素、字体大小和布局进行优化,以保证应用程序在不同分辨率和设备像素比率(DPI)的显示屏上均能正确显示。下面是一些关键步骤和技巧,用于在Qt应用…

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

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

简单实现利用飞书机器人推送消息给相关人员群的方法

利用的飞书的自定义机器人&#xff0c;将系统中的错误信息推送给技术群的功能。 飞书文档地址&#xff1a;开发文档 - 飞书开放平台 自定义机器人只能在群聊中使用的机器人&#xff0c;在当前的群聊中通过调用webhook地址来实现消息的推送。 配置逻辑可以看飞书的官方文档&am…

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

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

CIDR地址表示法

CIDR地址表示法&#xff1a; 假如我们的服务器IP列表为&#xff1a;172.18.0.157~172.18.0.163&#xff0c;该如何表示呢&#xff1f; A. 172.18.0.157/163 B. 172.18.0.157/7 C. 172.18.0.157/24 D. 172.18.0.157/26 E. 172.18.0.0/26 F.1…

典型案例 | 基于全数字实时仿真的嵌入式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…

信创产业发展迅速,信创测试需要伴随

信创产业的发展现状呈现出蓬勃的生机与活力。这一领域不仅构成了数据安全、网络安全的基石&#xff0c;更是新型基础设施建设的重要一环。信创产业涵盖了众多关键领域&#xff0c;如云计算、软件&#xff08;包括操作系统、中间件、数据库及应用软件&#xff09;、硬件&#xf…

如何使用云硬盘备份

云硬盘系统盘备份不能直接进行数据恢复&#xff0c;可以使用该备份创建系统盘。因为重装系统时&#xff0c;系统盘的ID会发生变化。 另外弹性云主机&#xff08;windows&#xff09;可以开机的时候&#xff0c;先选中虚拟机&#xff0c;按本地的F8 进入安全模式。

C语言作业笔记

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

关于5G和卫星

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

【QT】Qt智能指针QPointer、QSharedPointer、QWeakPointer、QScopedPointer

QPointer QPointer can only point to QObject instances. It will be automatically set to nullptr if the pointed to object is destroyed. It is a weak pointer specialized for QObject. QPointer只能指向QObject实例。如果指向的对象被销毁&#xff0c;它将自动设置为 …

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

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