[SSM]MyBatis的注解式开发与PageHelper

news2024/12/25 12:36:11

目录

十五、MyBatis使用PageHelper

15.1 limit分页

15.2PageHelper插件

第一步:引入依赖pom.xml

第二步:在mybatis-config.xml文件中配置插件

第三步:编写Java代码

十六、MyBatis的注解式开发

16.1@Insert

16.2@Delete

16.3@Update

16.4@Select


十五、MyBatis使用PageHelper

15.1 limit分页

  • mysql的limit后面有两个数字:

    • 第一个数字:startIndex(起始下标,下标从0开始)

    • 第二个数字:pageSize(每页显示的记录条数)

  • 假设已知页码pageNum,还有每页显示的记录条数pageSize。则startIndex=(pageNum-1)*pageSize。

  • 标准通用的mysql分页SQL:

select
 *
from
 tableName ......
limit
 (pageNum - 1) * pageSize, pageSize

 

CarMapper接口

List<Car> selectByPage(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);

CarMapper.xml

 <select id="selectByPage" resultType="car">
        select *
        from t_car limit #{startIndex},#{pageSize};
    </select>

CarMapperTest

@Test
    public void testSelectByPage() {
        //获取每页显示的记录条数
        int pageSize = 3;
        //显示第几页
        int pageNum = 4;
        //计算开始的下标
        int startIndex = (pageNum - 1) * pageSize;
​
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        List<Car> cars = mapper.selectByPage(startIndex, pageSize);
        cars.forEach(car -> System.out.println(car));
        sqlSession.commit();
        sqlSession.close();
    }

15.2PageHelper插件

  • 使用PageHelper插件进行分页,更加的便捷。

第一步:引入依赖pom.xml

<dependency>
 <groupId>com.github.pagehelper</groupId>
 <artifactId>pagehelper</artifactId>
 <version>5.3.1</version>
</dependency>

第二步:在mybatis-config.xml文件中配置插件

  • typeAliases标签下面进行配置:

<plugins>
 <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

第三步:编写Java代码

CarMapper接口

List<Car> selectAll();

CarMapper.xml

<select id="selectAll" resultType="Car">
 select * from t_car
</select>
  • 注意:select语句最后不加 ;

PageTest.testPageHelper

  @Test
    public void testSelectAll(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
​
        //注意:在执行DQL语句之前,开启分页功能。
        int pageNum=2;
        int pageSize=3;
        PageHelper.startPage(pageNum,pageSize);
​
        List<Car> cars = mapper.selectAll();
        //cars.forEach(car -> System.out.println(car));
​
        //封装分页信息对象 new PageInfo()
        //pageInfo对象是PageHelper插件提供的,用来封装分页相关相关信息的对象。
        //navigatePages用来设置导航栏中的页码数量
        PageInfo<Car> carPageInfo = new PageInfo<>(cars, 3);
        System.out.println(carPageInfo);
        sqlSession.commit();
        sqlSession.close();
    }

执行结果

PageInfo{
 pageNum=2, pageSize=2, size=2, startRow=3, endRow=4, total=6, pages=3,
 list=Page{count=true, pageNum=2, pageSize=2, startRow=2, endRow=4, total=
6, pages=3, reasonable=false, pageSizeZero=false}
 [Car{id=86, carNum='1234', brand='丰⽥霸道', guidePrice=50.5, produceTime
='2020-10-11', carType='燃油⻋'},
 Car{id=87, carNum='1234', brand='丰⽥霸道', guidePrice=50.5, produceTime
='2020-10-11', carType='燃油⻋'}],
 prePage=1, nextPage=3, isFirstPage=false, isLastPage=false, hasPreviousPa
ge=true, hasNextPage=true,
 navigatePages=5, navigateFirstPage=1, navigateLastPage=3, navigatepageNum
s=[1, 2, 3]
}

十六、MyBatis的注解式开发

  • mybatis中提供了注解式开发方式,采用注解可以减少sql映射文件的配置。

  • 使用注解式开发的话,sql语句是写在java程序中的,这种方式会给sql语句的维护带来成本。

  • 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂⼀点的语句,Java 注解不仅⼒不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做⼀些很复杂的操作,最好⽤ XML 来映射语句。

  • 原则:简单sql可以注解,复杂sql使用xml。

16.1@Insert

CarMapper接口

@Insert("insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})")
    int insert(Car car);

AnnotationTest.testInsert

   @Test
    public void testInsert() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        Car car = new Car(null, "6666", "丰田霸道", 32.0, "2020-11-11", "燃油车");
        int insert = mapper.insert(car);
        System.out.println(insert);
        sqlSession.commit();
        sqlSession.close();
    }

16.2@Delete

CarMapper接口

@Delete("delete from t_car where id = #{id}")
    int deleteById(Long id);

AnnotationTest.testInsert

   @Test
    public void testDeleteById(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        mapper.deleteById(41L);
        sqlSession.commit();
        sqlSession.close();
    }

16.3@Update

CarMapper接口

 @Update("update t_car set car_num=#{carNum},brand=#{brand},guide_price=#{guidePrice},produce_time=#{produceTime},car_type=#{carType} where id=#{id}")
    int update(Car car);

AnnotationTest.testInsert

    @Test
    public void testUpdate(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        Car car = new Car(47L, "6666", "丰田霸道", 32.0, "2020-11-11", "燃油车");
        int insert = mapper.update(car);
        System.out.println(insert);
        sqlSession.commit();
        sqlSession.close();
    }

16.4@Select

CarMapper接口

@Select("select * from t_car where id=#{id}")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "carNum", column = "car_num"),
            @Result(property = "brand", column = "brand"),
            @Result(property = "guidePrice", column = "guide_price"),
            @Result(property = "produceTime", column = "produce_time"),
            @Result(property = "carType", column = "car_type")
    })
    Car selectById(Long id);

AnnotationTest.testInsert

@Test
    public void testSelectById() {
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        Car car = mapper.selectById(39L);
        System.out.println(car);
        sqlSession.commit();
        sqlSession.close();
    }

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

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

相关文章

Java设计模式之结构型-外观模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 一、基础概念 外观模式&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 二、UML类图 三、角色设计 角…

自动驾驶与智能网联场地测试一体化装备应用

自动化驾驶层级与结构 L1:能够辅助驾驶员玩车某些驾驶任务制动防抱死系统 (ABS),车身电子稳定系统 (ESP)等,这些配置就是L1级别的运用。 L2:部分自动化,在L2的级别里,必须要具备的是自适应巡航系统,主动车道保持系统自动刹车辅助系统以及自动泊车系统等系统。 L3:有条件…

JavaWeb(2)——HTML、CSS、JS 快速入门

一、JavaScript快速入门 一个完整的JavaScript实现由3个不同部分组成&#xff1a;核心&#xff08;ECMAScript&#xff09;、文档对象模型&#xff08;DOM&#xff09;和浏览器对象模型&#xff08;BOM&#xff09;&#xff0c;如图所示。 ECMAScript是一种通过ECMA-262标准化…

iview table选中项显示在上方tag标签并可以取消

如图表格多选功能选中项显示在table的上方并且支持跨页&#xff0c;table上方加tag标签 <spanclass"select_tips"><Tagv-for"item in selection":key"item.id":name"item.id"closableon-close"handleClose">{{…

Python GUI编程利器:Tkinker中的消息对话框(13)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日目标 学习Tkinter中的消息对话框的使用&#xff0c;实现如下效果&#xff1a; 文本消息对话框 可以通过showinfo()创建文…

AtcoderABC258场

A - When? A - When? 题目大意 给定一个整数K&#xff0c;表示从日本标准时间21:00开始经过的分钟数。要求将该时间转换为24小时制的时间&#xff08;HH:MM格式&#xff09;。 思路分析 可直接分时间打印。关于格式&#xff0c;填充0&#xff0c;打印时间&#xff0c;题解…

DP83TG720RWRHARQ1汽车以太网PHY,NTHL020N120SC1 通孔 N-CH 1200V 103A(MOSFET)

DP83TG720RWRHARQ1汽车以太网PHY是一款符合IEEE 802.3bp和Open Alliance标准的汽车以太网物理层收发器。该器件通过屏蔽/屏蔽单双绞线提供传输和接收数据所需的所有物理层功能。该器件支持RGMII与MAC连接。 应用&#xff1a; 远程信息处理控制单元&#xff08;TCU、TBOX&#x…

接口测试 [分享] 自动化测试与持续集成方案--Jmeter 测试接口及性能

目录 前言&#xff1a; 一、什么是接口测试&#xff1f; 二、接口测试的流程 三、编写接口测试脚本 四、接口持续集成 补上性能测试报告&#xff1a; 前言&#xff1a; 接口测试是软件测试中的重要环节&#xff0c;它用于验证系统的不同组件之间的通信和数据传输是否正常…

一起学SF框架系列5.7-模块Beans-BeanDefinition使用

SF如何使用BeanDefinition达成其目标IoC&#xff0c;我们通过跟踪BeanDefinition使用来了解。 使用起点 跟踪SF初始化过程&#xff0c;第一个点在&#xff1a;DefaultListableBeanFactory.preInstantiateSingletons。如下图&#xff1a; RootBeanDefinition是运行时Spring B…

前端白屏检测方案

早期因为浏览器、技术、兼容性等诸多问题&#xff0c;导致网页的显示效果非常的单一&#xff0c;基本都是静态页&#xff0c;后续随着Angular、React、Vue等前端框架的出现&#xff0c;采用SPA单页面应用的方案越来越多。 用户和企业对于页面的稳定性、性能有了更高的诉求&…

openssl为什么从1.1跳跃到3.0,为什么没有2.0版本?

OpenSSL在版本号上从1.1跳跃到3.0是因为在其发展过程中发生了一些特定的情况和变化&#xff0c;导致开发团队做出了这样的决定。以下是一些可能的原因&#xff1a; 历史背景&#xff1a;OpenSSL的版本号体系并不是连续递增的&#xff0c;而是根据项目的发展和变化进行调整。在过…

UFS 15 - UFS RPMB操作

UFS 15 - UFS RPMB操作 1 Request Type Message Delivery&#xff08;请求类型消息传递&#xff09;2 Response Type Message Delivery&#xff08;响应类型消息传递&#xff09;3 Authentication Key Programming3.1 Authentication Key Programming3.2 报文示例3.2.1 Authent…

【工具使用】使用J-link离线下载芯唐MCU固件

一&#xff0c;简介 本文主要介绍如何使用J-link工具&#xff0c;离线下载M483的程序。 二&#xff0c;操作步骤 主要分为以下三个步骤&#xff1a; 1&#xff0c;使用SWD接口连接硬件&#xff1b; 2&#xff0c;配置上位机工程&#xff1b; 3&#xff0c;下载程序到芯片&am…

LiveGBS流媒体平台GB/T28181功能-作为上级平台对接海康大华华为宇视等下级平台监控摄像机NVR硬件执法仪等GB28181设备

LiveGBS作为上级平台对接海康大华华为宇视等下级平台监控摄像机NVR硬件执法仪等GB28181设备 1、背景说明2、部署国标平台2.1、安装使用说明2.2、服务器网络环境2.3、信令服务配置 3、监控摄像头设备接入3.1、海康GB28181接入示例3.2、大华GB28181接入示例3.3、华为IPC GB28181接…

图像处理之比特平面分层和重构

一、比特平面分层 像素是由比特组成的数字。例如在256级灰度图像中&#xff0c;每个像素的灰度是由8比特&#xff08;一个字节&#xff09;组成。如下图所示&#xff0c;一幅8比特图像由8个1比特平面组成&#xff0c;其中平面1包含图像中所有像素的最低阶比特&#xff0c;而平…

Linux开发工具gdb篇

文章目录 &#x1f3bb;0.前言&#x1f3bc;debug版本&#x1f3bc;release版本 &#x1fa95;1. gcc/g的默认版本&#x1f3b8;2. gdb使用&#x1f3b5;进入 & 退出&#x1f3b5;查看代码&#x1f3b5;断点 & 跳断点&#x1f3b5;逐过程 & 逐语句&#x1f3b5;监视…

Spring Boot 核心运行原理介绍

Spring Boot 核心运行原理介绍 引言整体介绍1. 核心运行原理图2. 自动配置的整体流程3. 各核心功能和组件初步介绍 总结 引言 还记得&#xff0c;笔者在前面的博文《Spring Boot 项目介绍》中提到了&#xff0c;Spring Boot 最核心的功能就是自动配置&#xff0c;该功能的实现…

编辑距离算法(Levenshtein Distance Algorithm)的概念理解及其应用

概念&#xff1a; 编辑距离&#xff0c;由俄罗斯科学家Vladimir Levenshtein于1965年提出&#xff0c;因此又称为Levenshtein Distance&#xff0c;简称LD&#xff0c;是指两个字串之间&#xff0c;由一个转成另一个所需的最少编辑操作次数。 可用的编辑操作包括&#xff1a;…

使用docker的常见bug

BUG1&#xff1a;磁盘被占满导致docker无法使用 docker ps 【查看docker能否正常使用】 正常的话会打印下图信息: 不正常的话打印如下图信息&#xff1a; journalctl -u docker 【查看docker无法正常使用的原因】&#xff0c;本次测试中遇到下图bug&#xff0c;意思是/var/l…

短视频抖音seo矩阵源码saas--技术开发部署分享

抖音seo源码开发&#xff0c;抖音矩阵源码&#xff0c;短视频seo源码&#xff0c;短视频矩阵源码技术开发部署&#xff0c;模式采用SaaS形式&#xff0c;用户角色分为&#xff1a;总后台&#xff0c;加盟商&#xff0c;企业用户&#xff0c;角色权限划分清楚&#xff0c;多模式…