分页查询和事务管理


  1. 前端需要给后端传递的参数

    • page:当前页码,用于指定用户想要查看的页。
    • pageSize:每页展示记录数,用于指定每页应显示多少条记录。
  2. 后端需要给前端返回的结果

    • total:总记录数,用于告诉前端数据库中总共有多少条记录。
    • rows:结果列表,这是当前页的记录数据,前端会用这些数据来填充页面上的内容。

  3. EmpController.java
    java
    @GetMapping
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize) {
        log.info("分页请求参数: {}, {}", page, pageSize);
        PageResult<Emp> pageResult = empService.page(page, pageSize);
        return Result.success(pageResult);
    }
    EmpService.java
    java
    public PageResult<Emp> page(Integer page, Integer pageSize) {
        // 1. 获取总记录数
        Long count = empMapper.count();
        // 2. 获取每一页的数据列表
        Integer start = (page - 1) * pageSize;
        List<Emp> empList = empMapper.list(start, pageSize);
        // 3. 封装分页结果
        return new PageResult<>(count, empList);
    }
    EmpMapper.java
    java
    @Mapper
    public interface EmpMapper {
        @Select("select count(*) from emp e left join dept d on e.dept_id = d.id")
        public Long count(); // 查询总记录数
    
        @Select("select e.*, d.name deptName from emp e left join dept d on e.dept_id = d.id limit #{start}, #{pageSize}")
        public List<Emp> list(Integer start, Integer pageSize); // 查询结果列表

1.<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.7</version>
</dependency>

2.// 查询员工数据
@Select("select e.* from emp e...")

  • public List<Emp> list();

3.

  1. 设置分页参数。
  2. 调用 Mapper 接口方法。
  3. 解析并封装结果。
public PageResult<Emp> page(Integer page, Integer pageSize) {
    // 1. 设置分页参数
    PageHelper.startPage(page, pageSize);
    // 2. 调用 Mapper 接口方法
    List<Emp> empList = empMapper.list();
    // 3. 解析并封装结果
    return new PageResult<Emp>(...);
}


1. PageHelper 实现机制

a. 查询总记录数

  • 使用 select count(0) from emp e ... 来查询总记录数。这里使用 count(0) 是一种优化技巧,因为 count(*) 会计算所有列,而 count(0) 则不会计算任何列,这在某些数据库中可能会更快。

b. 分页查询

  • 使用 select ... from emp e ... limit ?, ? 来实现分页查询。这里的 ? 是占位符,用于在执行时由 PageHelper 替换为实际的 OFFSET 和 LIMIT 值。

2. 注意事项

a. SQL语句结尾不要加分号(;)

  • 当使用 PageHelper 时,SQL 语句的结尾不应该有分号。这是因为 PageHelper 需要在执行 SQL 语句之前修改它,以添加分页的 LIMIT 和 OFFSET 子句。

b. PageHelper只会对紧跟在其后的第一条SQL语句进行分页处理

  • PageHelper 只对调用 PageHelper.startPage() 方法后紧跟的第一条 SQL 语句进行分页处理。如果需要对多个查询进行分页,需要为每个查询分别调用 startPage()

1. MyBatis 中动态 SQL 的使用场景

  • 动态 SQL 用于处理 SQL 语句不固定的情况,即 SQL 语句会根据用户的输入或外部条件的变化而变化。这允许开发者构建灵活的查询,以适应不同的业务需求。

2. MyBatis 中动态 SQL 的 <if> 及 <where> 标签的作用

  • <if> 标签:用于条件判断。如果指定的条件成立,MyBatis 会将对应的 SQL 片段拼接到最终的 SQL 语句中。这允许开发者根据条件动态地添加或修改 SQL 语句的一部分。

  • <where> 标签:用于根据查询条件生成 WHERE 关键字。MyBatis 会自动处理条件,确保 WHERE 子句的正确性,例如自动去除条件前面多余的 ANDOR。这有助于避免 SQL 语法错误,并使生成的 SQL 语句更加清晰和易于维护。


新增员工-保存员工基本信息

EmpController.java

@PostMapping
public Result save(@RequestBody Emp emp) {
    log.info("请求参数emp: {}", emp);
    empService.save(emp);
    return Result.success();
}

EmpServiceImpl.java

public void save(Emp emp) {
    // 1. 补全基础属性
    emp.setCreateTime(LocalDateTime.now());
    emp.setUpdateTime(LocalDateTime.now());
    // 2. 保存员工基本信息
    empMapper.insert(emp);
}

EmpMapper.java

@Insert("insert into emp(username, name, gender, phone, job, salary, image, entry_date, dept_id, create_time, update_time) " +
        "values(#{username}, #{name}, #{gender}, #{phone}, #{job}, #{salary}, #{image}, #{entryDate}, #{deptId}, #{createTime}, #{updateTime})")
void insert(Emp emp);

说明:

  • EmpController:定义了一个 save 方法,使用 @PostMapping 注解来处理 HTTP POST 请求。它接收一个 Emp 对象作为请求体,并调用 empService.save(emp) 来保存员工信息。

  • EmpServicesave 方法首先设置员工的创建时间和更新时间,然后调用 empMapper.insert(emp) 来执行数据库插入操作。

  • EmpMapper:定义了一个 insert 方法,使用 MyBatis 的 @Insert 注解来执行 SQL 插入语句。这个方法将 Emp 对象的属性值映射到 SQL 语句中的占位符,并执行插入操作。

这种分层的架构有助于保持代码的清晰和可维护性,同时也便于进行单元测试。每个层都负责特定的职责,Controller 处理 HTTP 请求,Service 处理业务逻辑,Mapper 负责数据库操作。


1. 在插入数据之后,如何获取到主键值?

  • 使用 @Options 注解可以配置 MyBatis 在插入数据后获取数据库自动生成的主键值。
  • useGeneratedKeys=true 表示启用自动获取主键值。
  • keyProperty="id" 指定了实体类中用于存储主键值的属性名。
java
@Options(useGeneratedKeys=true, keyProperty="id")

2. <foreach> 动态 SQL 标签的作用及其属性的含义?

  • <foreach> 标签用于遍历集合或数组,以便在 SQL 语句中动态地构建包含多个元素的语句,如 IN 子句。

  • 属性含义:

    • collection:指定要遍历的集合或数组的名称。
    • item:指定遍历过程中当前元素的别名,用于在 SQL 语句中引用当前元素。
    • separator:指定遍历元素之间的分隔符,这是可选的。
    • open:指定遍历开始前要拼接的 SQL 片段,这是可选的。
    • close:指定遍历结束后要拼接的 SQL 片段,这是可选的。

xml

<foreach ...>
    <!-- SQL 片段 -->
</foreach>

使用 <foreach> 标签可以避免手动编写循环逻辑和字符串拼接,这在处理动态 SQL 时非常有用,特别是当你需要根据传入的集合或数组构建 SQL 语句时。


事务管理

1. 什么是事务?

  • 事务是一组操作的集合,它是一个不可分割的工作单位。这意味着事务中的所有操作要么全部成功,要么全部失败。这种特性确保了数据的一致性和完整性。

2. 如何控制事务?

  • 开启事务:使用 start transaction 或 begin 命令来开始一个新的事务。
  • 提交事务:使用 commit 命令来提交事务。这表示事务中的所有操作都已成功完成,并且对数据库的更改将被永久保存。
  • 回滚事务:使用 rollback 命令来回滚事务。如果事务中的任何一项操作失败,整个事务将被撤销,所有更改都不会被保存到数据库中。

3. 场景?

  • 银行转账:在银行转账过程中,需要确保从转出账户扣除金额和转入账户增加金额这两个操作都成功,否则整个转账过程应该被撤销。
  • 下单扣减库存:在电子商务中,当用户下单时,需要确保订单创建和库存扣减这两个操作都成功。如果库存扣减失败,订单创建也应该被撤销,以避免库存数量不准确。

事务管理是数据库操作中非常重要的一部分,它确保了数据的一致性和可靠性。在实际应用中,事务通常与数据库的锁定机制和并发控制一起使用,以处理多个用户或进程同时访问数据库的情况。


Spring 事务管理 - 控制事务

注解:@Transactional
  • 作用@Transactional 注解用于将当前方法的事务管理交给 Spring。在方法执行前,Spring 会开启一个事务;如果方法成功执行完毕,Spring 会提交事务;如果方法执行过程中出现异常,Spring 会回滚事务。
  • 位置@Transactional 注解可以用于业务层(service)的方法上、类上或接口上。
示例代码
  1. 方法上使用 @Transactional(推荐)

java

@Transactional
@Override
public void save(Emp emp) {
    // 1. 补全基础属性
    emp.setCreateTime(LocalDateTime.now());
    emp.setUpdateTime(LocalDateTime.now());
    // 2. 保存员工基本信息
    empMapper.insert(emp);
    int i = 1/0; // 这里故意制造一个异常,用于演示事务回滚
    // 3. 保存员工的工作经历信息 - 批量
    Integer empId = emp.getId();
    List<EmpExpr> exprList = ...
}
  1. 类上使用 @Transactional

java

@Transactional
@Service
public class EmpServiceImpl implements EmpService {
    // 类中的方法都会自动加入事务管理
}
  1. 接口上使用 @Transactional

java

@Transactional
public interface EmpService {
    // 接口中的方法都会自动加入事务管理
}
配置日志

application.yml 文件中配置日志级别,可以查看 Spring 事务管理的底层日志,这对于调试和了解事务的内部工作机制非常有用。

yaml

# 配置日志信息,查看 Spring 事务管理的底层日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

通过设置 org.springframework.jdbc.support.JdbcTransactionManager 的日志级别为 debug,可以获取到事务管理的详细信息,包括事务的开启、提交和回滚等操作的日志输出。这对于开发和维护阶段的调试非常有帮助。


1. @Transactional 注解的作用

  • @Transactional 注解用于在 Spring 管理的事务中声明性地配置事务规则。它告诉 Spring 在方法执行之前开启一个事务,并在方法执行完毕后,根据方法的执行结果来决定是提交(commit)还是回滚(rollback)这个事务。
  • 如果方法正常执行完毕,没有抛出任何异常,那么事务将会被提交。
  • 如果方法执行过程中抛出了运行时异常(RuntimeException)或者错误(Error),那么事务将会被回滚。

2. @Transactional 注解的使用位置

  • 方法上:可以将 @Transactional 注解直接加在方法上,这样只有该方法内部的代码会参与到事务中。
  • 类上:可以将 @Transactional 注解加在类上,这样类中的所有方法都会被包含在事务中,除非某些方法明确指定了不同的事务规则。
  • 接口上:在接口上使用 @Transactional 注解可以为实现该接口的所有类的方法提供事务管理。这种方式在面向切面编程(AOP)中非常有用,因为它允许你定义一个通用的事务策略,然后应用于实现接口的所有类。

使用 @Transactional 注解可以简化事务管理的代码,使得业务逻辑更加清晰,同时保持事务的一致性和可靠性。

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

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

相关文章

MATLAB深度学习(七)——ResNet残差网络

一、ResNet网络 ResNet是深度残差网络的简称。其核心思想就是在&#xff0c;每两个网络层之间加入一个残差连接&#xff0c;缓解深层网络中的梯度消失问题 二、残差结构 在多层神经网络模型里&#xff0c;设想一个包含诺干层自网络&#xff0c;子网络的函数用H(x)来表示&#x…

go语言zero框架调用自己的安装的redis服务配置与使用

在 Go 语言中调用自己安装的 Redis 服务&#xff0c;可以分为几个步骤&#xff1a;从安装 Redis 服务到配置、启动 Redis&#xff0c;最后在 Go 代码中连接并使用 Redis。以下是详细的步骤&#xff1a; ## 1. 安装 Redis 服务 ### 1.1 在 Linux 系统上安装 Redis 假设你使用…

Cerebras 推出 CePO,填补推理与规划能力的关键空白

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Google Cloud Database Option(数据库选项说明)

关系数据库 在关系数据库中&#xff0c;信息存储在表、行和列中&#xff0c;这通常最适合结构化数据。因此&#xff0c;它们用于数据结构不经常更改的应用程序。与大多数关系数据库交互时使用 SQL&#xff08;结构化查询语言&#xff09;。它们为数据提供 ACID 一致性模式&am…

ArcGIS将MultiPatch数据转换为Obj数据

文章目录 ArcGIS将MultiPatch数据转换为Obj数据1 效果2 技术路线2.1 Multipatch To Collada2.2 Collada To Obj3 代码实现4 附录4.1 环境4.2 一些坑ArcGIS将MultiPatch数据转换为Obj数据 1 效果 2 技术路线 MultiPatch --MultipatchToCollada–> Collada --Assimp–> O…

微信小程序5-图片实现点击动作和动态加载同类数据

搜索 微信小程序 “动物觅踪” 观看效果 感谢阅读&#xff0c;初学小白&#xff0c;有错指正。 一、功能描述 a. 原本想通过按钮加载背景图片&#xff0c;来实现一个可以点击的搜索button&#xff0c;但是遇到两个难点&#xff0c;一是按钮大小调整不方便&#xff08;网上搜索…

使用nmap确定扫描目标

nmap可以通过IP、主机名、域名等指定单一目标&#xff0c;也可以使用IP范围、列表文件、等指定多个IP。 单一目标 IP nmap IP主机名 nmap hostname域名 nmap domainname&#xff0c;可以通过--dns-server指定dns服务器地址&#xff0c;也可以通过--system-dns指定使用操作系统…

【C++】关联存储结构容器-set(集合)详解

目录 一、基本概念 二、内部实现 三、常用操作 3.1 构造函数 3.2 插入操作 3.3 删除操作 3.4 查找操作 3.5 访问元素 3.6 容量操作 3.7 交换操作 四、特性 五、应用场景 结语 一、基本概念 set是C标准模板库&#xff08;STL&#xff09;中的一种关联容器&#xf…

ssm-day03 aoptx

AOP AOP指的是面向对象思想编程问题的一些补充和完善 soutp、soutv 解耦通俗理解就是把非核心代码剥出来&#xff0c;减少对业务功能代码的影响 设计模式是解决某些特定问题的最佳解决方案&#xff0c;后面一点要记得学这个&#xff01;&#xff01;&#xff01; cxk唱跳哈…

谷粒商城—分布式高级①.md

1. ELASTICSEARCH 1、安装elastic search dokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2(2)配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "h…

数据仓库的性能问题及解决之道

随着数据量不断增长和业务复杂度逐渐攀升&#xff0c;数据处理效率面临巨大挑战。最典型的表现是面向分析型场景的数据仓库性能问题越来越突出&#xff0c;压力大、性能低&#xff0c;查询时间长甚至查不出来&#xff0c;跑批跑不完造成生产事故等问题时有发生。当数据仓库出现…

云和恩墨 zCloud 与华为云 GaussDB 完成兼容性互认证

近日&#xff0c;云和恩墨&#xff08;北京&#xff09;信息技术有限公司&#xff08;以下简称&#xff1a;云和恩墨&#xff09;的多元数据库智能管理平台 zCloud 与华为云计算技术有限公司&#xff08;以下简称&#xff1a;华为云&#xff09;的 GaussDB 数据库完成了兼容性互…

分布式专题(4)之MongoDB快速实战与基本原理

一、MongoDB介绍 1.1 什么是MongoDB MongoDB是一个文档数据库(以JSON为数据模型)&#xff0c;由C语言编写&#xff0c;旨在为WEB应用提供可扩展的高性能存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xf…

03篇--二值化与自适应二值化

二值化 定义 何为二值化&#xff1f;顾名思义&#xff0c;就是将图像中的像素值改为只有两种值&#xff0c;黑与白。此为二值化。 二值化操作的图像只能是灰度图&#xff0c;意思就是二值化也是一个二维数组&#xff0c;它与灰度图都属于单信道&#xff0c;仅能表示一种色调…

Linux下redis环境的搭建

1.redis的下载 redis官网下载redis的linux压缩包&#xff0c;官网地址:Redis下载 网盘链接&#xff1a; 通过网盘分享的文件&#xff1a;redis-5.0.4.tar.gz 链接: https://pan.baidu.com/s/1cz3ifYrDcHWZXmT1fNzBrQ?pwdehgj 提取码: ehgj 2.redis安装与配置 将包上传到 /…

印闪网络:阿里云数据库MongoDB版助力金融科技出海企业降本增效

客户背景 上海印闪网络科技有限公司&#xff0c;于2017年1月成立&#xff0c;投资方包括红杉资本等多家国际知名风投公司。公司业务聚焦东南亚普惠金融&#xff0c;常年稳居行业头部。创始团队来自腾讯&#xff0c;中国团队主要由运营、风控及产研人员组成&#xff0c;核心成员…

【有啥问啥】大语言模型Prompt中的“System指令”:深入剖析与误区澄清

大语言模型Prompt中的“System指令”&#xff1a;深入剖析与误区澄清 引言 在与大语言模型&#xff08;LLM&#xff09;交互时&#xff0c;“prompt”&#xff08;提示符&#xff09;这一概念已不再陌生。Prompt是引导模型生成特定类型文本的关键输入&#xff0c;决定了模型的…

【解决】Vue配置了端口号 发布项目仍会改变

1 梗概 这里记录Vue配置了端口号&#xff0c;npm run serve 发布运行仍会选择其他端口&#xff0c;一般是配置的端口号1 2 解决方案 网上有些教程说是由于 portfonder 版本问题&#xff0c;需要降低版本&#xff0c;可能这个的确是个解决方案。 还有说在package.json 中配置 &q…

uniapp-在windows上IOS真机运行(含开发证书申请流程)

前期准备 1、Itunes [Windows 32位 iTunes]下载地址、所有版本的iTunes下载地址 [Windows 64位 iTunes]下载地址、所有版本的iTunes下载地址 2、爱思助手 https://www.i4.cn/ 3、typeC转Usb接口 (物理意义的设备接口&#xff09; 4、Mac电脑&#xff08;用来生成证书&am…

网络层分析

网络访问层仍受到传输介质的性质和相关适配器的设备驱动程序的影响很大。网络层与网络适配器的硬件性质几乎是完全分离的。为什么是几乎呢&#xff1f;该层不仅负责发送和接受网络数据&#xff0c;还负责在彼此不直接连接的系统之间转发和路由分组。查找最佳路由并选择适当的网…