SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

server/2024/11/14 3:32:38/

1.MybatisPlus常用注解:

        1.1 当数据库、表名和字段名和实体类完全一致时无需加注解,不一致时:

        @TableName指定库名

        @TableId指定表名

        @TableField指定字段名

        1.2 自增主键:

        @TableId(type=IdType.AUTO)

        private Long id;

        1.3 实体类中属性不是表字段:

        @TableField(exist=false)

2.内置增删改查:

        这里如果加了@Data注解但无法生效,应该是没有安装Lombok插件,在plugin中添加即可

        2.1 增:

    @Testpublic void testInsert(){User user=new User();user.setName("lxj");user.setEmail("lxj@163.com");user.setAge(30);Assert.assertTrue(userMapper.insert(user)>0);userMapper.selectList(null).forEach(System.out::println);}

        2.1 删(3种方式):

    @Testpublic void testDelete(){//主键删除
//        userMapper.deleteById(1l);//长整型需添加l
//        userMapper.selectList(null).forEach(System.out::println);//批量删除//userMapper.delete(new QueryWrapper<User>().like("name","J"));//userMapper.delete(Wrappers.<User>query().like("name","J"));userMapper.delete(Wrappers.<User>query().lambda().like(User::getName,"J"));userMapper.selectList(null).forEach(System.out::println);}

        2.3 改:

        这里可以在实体类中添加@Accessors(chain=true)注解使set方法返回一个当前对象。

    @Testpublic void testUpdate(){//基本修改
//        userMapper.updateById(new User().setId(1l).setName("wayaya"));
//        userMapper.selectList(null).forEach(System.out::println);//批量修改
//        userMapper.update(null,Wrappers.<User>update().set("email","ppp@163.com").like("name","J"));
//        userMapper.selectList(null).forEach(System.out::println);//批量修改userMapper.update(new User().setEmail("ppp@163.com"),Wrappers.<User>update().like("name","J"));userMapper.selectList(null).forEach(System.out::println);}

        2.4 查(两种方式):

    @Testpublic void testSelectNew(){//System.out.println(userMapper.selectOne(Wrappers.<User>query().eq("name","Tom")));userMapper.selectList(new QueryWrapper<User>().select("id","name")).forEach(user -> {System.out.println(user);});}

3.分页

        原理一样都是通过分页拦截器,查询前先查询总行数,然后再查询当前页记录。

        先添加一个分页拦截器:MybatisPlusConfig

package com.lxj.quickstart.config;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true));//可优化1对1连接查询效率}
}

        3.1内置分页查询

    @Testpublic void testPage(){IPage<User> page=new Page<>(2,2);IPage<User> pr = userMapper.selectPage(page, Wrappers.<User>query());System.out.println("总行数"+pr.getTotal());System.out.println("总页数"+pr.getPages());System.out.println("每页行数"+pr.getSize());pr.getRecords().forEach(user -> {System.out.println(user);});}

        3.2自定义xml分页查询

        添加配置项:

    
#mybatisplus
mybatis-plus:type-aliases-package: com.lxj.quickstart.entity   #别名搜索mapper-locations: classpath:/mappers/*.xml         #加载映射文件

        添加xml查询:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.lxj.quickstart.mapper.UserMapper"><sql id="selectSql">SELECT*FROMuser</sql><select id="selectUserByPage" resultType="user"><include refid="selectSql"></include><where><if test="u.age != null">age = #{u.age}</if><if test="u.email != null">and email like '%${u.email}%'</if></where></select>
</mapper>

        添加mapper接口:

package com.lxj.quickstart.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lxj.quickstart.entity.User;
import org.apache.ibatis.annotations.Param;public interface UserMapper extends BaseMapper<User> {//映射的接口中有2个参数需要@Param定义参数名,映射文件中使用p.和c.调用属性public IPage<User> selectUserByPage(@Param("p") IPage<User> page, @Param("u") User condition);}

        这里注意第二个参数’u‘必须和xml中的u一致。

        添加测试:

    @Testpublic void testPage2(){IPage<User> page=new Page<>(1,2);//条件对象User u=new User();u.setAge(18);u.setEmail("@163.com");IPage<User> pr = userMapper.selectUserByPage(page, u);System.out.println("总行数"+pr.getTotal());System.out.println("总页数"+pr.getPages());System.out.println("每页行数"+pr.getSize());pr.getRecords().forEach(user -> {System.out.println(user);});}

        3.3 pageHelper分页

        添加依赖:

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

        添加拦截器:

    //两个分页插件不冲突@Beanpublic PageInterceptor pageInterceptor(){return  new PageInterceptor();}

        映射文件 :

<select id="selectUserByPage2" resultType="user"><include refid="selectSql"></include><where><if test="age != null">age = #{age}</if><if test="email != null">and email like '%${email}%'</if></where></select>

        映射文件对呀接口:

public List<User> selectUserByPage2(User condition);

        测试:

    @Testpublic void testPageHelper(){//条件对象User u=new User();u.setAge(18);u.setEmail("@163.com");PageInfo<User> page=PageHelper.startPage(1,2).doSelectPageInfo(()->{//映射文件userMapper.selectUserByPage2(u);//内置方法userMapper.selectList(Wrappers.<User>query());});List<User> list = page.getList();page.getList().forEach(System.out :: println);System.out.println("总行数"+page.getTotal());System.out.println("总页数"+page.getPages());System.out.println("每页行数"+page.getPageSize());System.out.println("当前页数"+page.getPageNum());System.out.println("起始行数"+page.getStartRow());System.out.println("每页行数"+page.getSize());System.out.println("是第一页"+page.isIsFirstPage());System.out.println("是最后一页"+page.isIsLastPage());System.out.println("有上一页"+page.isHasPreviousPage());System.out.println("有下一页"+page.isHasNextPage());System.out.println("页码列表"+Arrays.toString(page.getNavigatepageNums()));}


http://www.ppmy.cn/server/7851.html

相关文章

【Django】django.core.exceptions.AppRegistryNotReady: Apps aren‘t loaded yet.

其中django后台manage.py入口程序报错&#xff0c;检索很多问题解决方案&#xff0c;这里记录下个人问题原因 1.django启动异常问题详情 django.core.exceptions.AppRegistryNotReady: Apps aren’t loaded yet. 2.问题原因 Python第三方包安装版本不一致或缺少依赖包&…

FineBI概述

FineBI 是一款商业智能&#xff08;BI&#xff09;工具&#xff0c;旨在帮助企业分析和可视化数据&#xff0c;从而支持决策制定和业务优化。以下是对 FineBI 的概述&#xff1a; 多功能性&#xff1a;FineBI 提供了丰富的功能和工具&#xff0c;包括数据连接、数据处理、报表设…

Linux_进程

目录 1、冯诺依曼体系 2、Linux下的进程概念 3、PCB结构体 4、在Linux下查看进程 5、父子进程 6、终止进程 7、操作系统的进程状态 7.1 Linux下的进程状态 8、孤儿进程 9、进程优先级 9.1 PRI和NI 结语 前言&#xff1a; 进程作为操作系统中最核心的知识点之…

FFmpeg的详细介绍

FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。它提供了录制、转换数字音频、视频&#xff0c;并将其转化为流的库和工具。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移植性和编解码质量&#xff…

【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09; 文章目录 【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09;一、搭建…

博客摘录「 线性代数(预备知识)3」2024年4月16日

标量 标量由只有一个元素的张量表示。 在下面的代码中&#xff0c;我们实例化两个标量&#xff0c;并执行一些熟悉的算术运算&#xff0c;即加法、乘法、除法和指数。 import torchx torch.tensor(3.0) #定义两个标量&…

Spring - 1 ( 8000 字 Spring 入门级教程 )

一&#xff1a;SpringBoot 快速上手 环境准备 ⾃检Idea版本: 社区版: 2021.1 -2022.1.4专业版: ⽆要求 如果个⼈电脑安装的idea不在这个范围, 需要卸载重新安装.&#xff08;⼀定要删除注册表&#xff09; Maven Maven是⼀个项⽬管理⼯具。基于POM(Project Object Model,…

数据结构--双向链表

在讲双向链表之前&#xff0c;我们先了解一下链表的分类&#xff1a; 链表的结构⾮常多样&#xff0c;主要分为带头与不带头、单向与双向、循环与不循环。三个种类可以任意搭配&#xff0c;所以总共可以形成八种链表&#xff0c;但是最常用的是单向不带头不循环链表和双向带头循…