MyBatis实现分页查询

2023-05-16

目录

一、基于注解的简单分页查询

1.定义对象

 2.Mapper接口

3.Controller类

4.功能实现

二、基于注解的较复杂分页查询

1.定义shop实体类和page分页类

2.Mapper接口

3.Controller类

4.功能实现

三、基于mapper.xml的复杂分页查询

1.首先要配置一下xxxMapper.xml文件的地址:

1.定义Page类

2.Mapper接口

3.pageMapper.xml

4.pageService

5.pageService的实现类pageServiceImpl

6.功能实现

7.可扩展性测试

四、基于pagehelper插件的复杂分页查询

1. 导入依赖

2. 添加配置

3.OrderMapper与orderMapper.xml

 4. OrderService与OrderServiceImpl

5.OrderController

6.功能实现

7.Mybatis 分页插件 Pagehelper 的 PageInfo 字段属性解释

五、MybtisPlus插件自动分页配置

1、引入依赖

2、MybatisPlusConfig配置文件

3、项目中各层具体写法:


项目中经常遇到需要查询数据列表的功能,一般需要前端去调用后端的相应数据列表的分页接口,所以后端需要实现数据库SQL的分页查询:

一、基于注解的简单分页查询

1.定义对象

注意数据库要有相对应的数据库表

import ...

@Entity
@Data
@Table(name = "shop")
public class Shop {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;
}

 2.Mapper接口

import ...

@Repository
public interface ShopMapper {
    //分页查询
    @Select("select * from shop limit #{pageBegin}, #{pageSize}")
    List<Shop> findByPage(@Param("pageBegin") Integer pageBegin,@Param("pageSize") Integer pageSize);

3.Controller类

import ...

@RestController
@RequestMapping("shop")
public class ShopController {
    @Autowired
    private ShopMapper shopMapper;

    //分页查询
    @GetMapping("/allByPage")
    public List<Shop> findByPage(Integer page,Integer pageSize) {
        Integer pageBegin = (page-1) * pageSize;
        return shopMapper.findByPage(pageBegin,pageSize);
    }

4.功能实现

请求路径:http://localhost:8080/shop/allByPage?page=3&pageSize=5

请求结果:

[{"id":11,"name":"馒头店"},{"id":12,"name":"包子店"},{"id":13,"name":"豆腐脑油条"},{"id":14,"name":"北京烤鸭"},{"id":15,"name":"煎饼果子"}]

简单的分页查询功能已实现,但是功能需求多的话显然还不够用,比如要向前端展示一下共有多少页,有多少数据条,这些数据是从哪行到哪行等等,就实现不了了,因此对于分页的功能实现远远不止于此,下面就来进阶一下。

二、基于注解的较复杂分页查询

逻辑上跟简陋版是一样的,只不过多了一个Page类。这个类里面就包含了上边的Shop类,也就是之前返回的shop类的数组变成了Page类的一个属性值。

1.定义shop实体类和page分页类

Shop类用之前的就可以,下面是Page分页类:

import ...

@Data
public class ShopPage {
    //第几页
    private Integer pageNum;
    //每页数据条数
    private Integer pageSize;
    //总数据条数
    private Integer size;
    //起始(末尾)数据
    private Integer startRow;
    private Integer endRow;
    //总页数
    private Integer pages;
    //上(下)一页页码
    private Integer prePage;
    private Integer nextPage;
    //是否是第(最后)一行
    private Boolean isFirstPage;
    private Boolean isLastPage;
    //有无前(后)页
    private Boolean hasPreviousPage;
    private Boolean hasNextPage;
    private Integer navigatePages;
    private List navigatePageNums;
    //数据数组
    private List<Shop> data;
    private Integer navigateFirstPage;
    private Integer navigateLastPage;
    //第(最后)一页
    private Integer firstPage;
    private Integer lastPage;
}

这样就定义好了调用接口时所返回的数据类型,可以看到里面有一个List<Shop>,这就是我们查到的数据,和主要数据一起传给前端的还有各种各样的页码和条数数据,总之就是几乎将这些数据条的所有信息都传给前端。

2.Mapper接口

import ...

@Repository
public interface ShopPageMapper {


    @Select("select * from shop limit #{pageBegin}, #{pageSize}")
    List<Shop> findData(@Param("pageBegin") Integer pageBegin, @Param("pageSize") Integer pageSize);

    @Select("select count(*) from shop")
    int findSize();
}

这里先简单写一下,之后还得再修改。

3.Controller类

import ...

@RestController
@RequestMapping("page")
public class ShopPageController {

    @Autowired
    private ShopPageMapper shopPageMapper;

    @GetMapping("/shop")
    public ShopPage page(Integer page, Integer pageSize){
        ShopPage shopPage = new ShopPage();
        Integer pageBegin = (page-1) * pageSize;

        //当前页码
        shopPage.setPageNum(page);
        //前(后)一页页码
        shopPage.setPrePage(page - 1);
        shopPage.setNextPage(page + 1 );
        //总数据条数
        shopPage.setSize(shopPageMapper.findSize());
        //开始(末尾)数据是第几行
        shopPage.setStartRow(pageBegin + 1);
        shopPage.setEndRow(pageBegin + pageSize + 1);
        //每页数据条数
        shopPage.setPageSize(pageSize);
        //总页数
        Integer div = shopPage.getSize()/pageSize;
        Integer pages = shopPage.getSize() % pageSize == 0 ? div : div + 1;
        shopPage.setPages(pages);
        //是否是第(最后)一页,是否有前(后)一页
        shopPage.setIsFirstPage(page == 1);
        shopPage.setHasPreviousPage(page != 1);
        shopPage.setIsLastPage(page.equals(pages));
        shopPage.setHasNextPage(!page.equals(pages));
        //查询到的数据
        shopPage.setData(shopPageMapper.findData(pageBegin,pageSize));
        return shopPage;
    }
}

4.功能实现

请求路径:http://localhost:8888/page/shop?page=3&pageSize=5

请求结果:


{
"pageNum":3,
"pageSize":5,
"size":1000,
"startRow":11,
"endRow":16,
"pages":200,
"prePage":2,
"nextPage":4,
"isFirstPage":false,
"isLastPage":false,
"hasPreviousPage":true,
"hasNextPage":true,
"navigatePages":null,
"navigatePageNums":null,
"data":[{"id":11,"name":"小安汽修",
        {"id":12,"name":"大壮副食"},
        {"id":13,"name":"小牛电动"},
        {"id":14,"name":"哈哈笑超市"},
        {"id":15,"name":"包子"}],
"navigateFirstPage":null,
"navigateLastPage":null,
"firstPage":null,
"lastPage":null
}  

这样请求的时候只需要传入page(页码)、pageSize(每页数量),就可以将数据和分页信息查询到。

存在的问题:上边的ShopPage、ShopMapper类和ShopPageController类都是跟实体类写死的,也就是跟实体类有很大的耦合性,那这样以后如果要给别的实体类写一个分页查询,还要大量重复这些相近的代码,所以完全可以将pageMapper类和pageController类写成所有实体类都可以使用的,这样再多传入一个动态的参数(也就是实体的名字),就可以实现Page类、PageMapper接口和PageController类的复用,这样就在实现功能的同时降低了代码的耦合性,减少代码。

三、基于mapper.xml的复杂分页查询

上面提到了将分页类和实体类都写在一起了,下面就将它们拆开来,将Page、PageMapper、PageController写成能够被所有类使用的分页功能,下面是实现代码:

1.首先要配置一下xxxMapper.xml文件的地址:

在com....包下面的config文件夹(没有就新建)中写一个CustomMybatisConfig类来对SqlSession进行配置:

import ...

@Configuration
public class CustomMybatisConfig {

    @Autowired
    private DataSource dataSource;

    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean() throws IOException {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resolver.getResources("classpath:.../*.xml");
        sqlSessionFactoryBean.setMapperLocations(resources);

        return sqlSessionFactoryBean;

    }
}

getResources("classpath:.../*.xml")里面要写.xml文件的路径,这个路径也可以这样指定:在application.properties里面添加如下配置用来指定xml文件的存放位置是一样的:

mybatis.mapper-locations=classpath:/mybatis/mapper/*.xml

1.定义Page类

import ...

@Data
public class Page {
    //第几页
    private Integer pageNum;
    //每页数据条数
    private Integer pageSize;
    //总数据条数
    private Integer size;
    //起始(末尾)数据
    private Integer startRow;
    private Integer endRow;
    //总页数
    private Integer pages;
    //上(下)一页页码
    private Integer prePage;
    private Integer nextPage;
    //是否是第(最后)一行
    private Boolean isFirstPage;
    private Boolean isLastPage;
    //有无前(后)页
    private Boolean hasPreviousPage;
    private Boolean hasNextPage;
    private Integer navigatePages;
    private List navigatePageNums;
    //数据数组
    private List<Map<String,Object>> tableData;
    private Integer navigateFirstPage;
    private Integer navigateLastPage;
    //第(最后)一页
    private Integer firstPage;
    private Integer lastPage;

}

2.Mapper接口

import ...

@Mapper
public interface PageMapper {

    List<Map<String,Object>>  selectTableData(String entity, Integer pageBegin, Integer pageSize);

    int selectSize(String entity);
}

这里推荐一个常用的插件:mybatis-helper,可以实现从xxxMapper到XXXMapper.xml方法的快捷跳转,效果如下:

3.pageMapper.xml

新建一个xml文件,按照规范,名字应跟Mapper接口一致,然后将SQL写在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.....PageMapper">   <!--namespace就是mapper文件的路径,文件名必须跟Dao类名字一致,因为是根据文件名做关联-->

    <select id="selectSize" statementType="STATEMENT" resultType="int" >
        select count(*) from
            ${entity}
    </select>

    <select id="selectTableData" resultType="map" >
        select * from
            ${entity}
        limit
            #{pageBegin}, #{pageSize}
    </select>

</mapper>

4.pageService

import ...

public interface PageService {

    int selectSize(String entity);

    Page paging(String entity, Integer pageNumber, Integer pageSize);

    List<Map<String,Object>> selectTableData(String entity, Integer pageBegin, Integer pageSize);
}

5.pageService的实现类pageServiceImpl

import ...

@Service
public class PageServiceImpl implements PageService {

    @Autowired
    private PageMapper pageMapper;

    @Override
    public int selectSize(String entity) {
        return pageMapper.selectSize(entity);
    }

    @Override
    public Page paging(String entity, Integer pageNumber, Integer pageSize) {
        Page page = new Page();
        Integer pageBegin = (pageNumber - 1) * pageSize;
        //当前页码
        page.setPageNum(pageNumber);
        //前(后)一页页码
        page.setPrePage(pageNumber - 1);
        page.setNextPage(pageNumber + 1);
        //总数据条数
        page.setSize(pageMapper.selectSize(entity));
        //开始(末尾)数据是第几行
        page.setStartRow(pageBegin + 1);
        page.setEndRow(pageBegin + pageSize + 1);
        //每页数据条数
        page.setPageSize(pageSize);
        //总页数
        Integer div = page.getSize() / pageSize;
        Integer pages = page.getSize() % pageSize == 0 ? div : div + 1;
        page.setPages(pages);
        //是否是第(最后)一页,是否有前(后)一页
        page.setIsFirstPage(pageNumber == 1);
        page.setHasPreviousPage(pageNumber != 1);
        page.setIsLastPage(pageNumber.equals(pages));
        page.setHasNextPage(!pageNumber.equals(pages));
        //查询到的数据
        page.setTableData(pageMapper.selectTableData(entity, pageBegin, pageSize));
        return page;
    }

    @Override
    public List<Map<String,Object>> selectTableData(String entity, Integer pageBegin, Integer pageSize) {
        pageBegin = pageBegin - 1;
        return pageMapper.selectTableData(entity,pageBegin,pageSize);
    }
}

6.功能实现

请求路径:http://localhost:8888/page/shop?pageNumber=2&pageSize=10

请求结果:


{"pageNum":2,
"pageSize":10,
"size":1000,
"startRow":11,
"endRow":21,
"pages":100,
"prePage":1,
"nextPage":3,
"isFirstPage":false,
"isLastPage":false,
"hasPreviousPage":true,
"hasNextPage":true,
"navigatePages":null,
"navigatePageNums":null,
"data":[{"id":11,"name":"豆浆油条"},
        {"id":12,"name":"子文包子"},
        {"id":13,"name":"黄河馒头"},
        {"id":14,"name":"长江小笼包"},
        {"id":15,"name":"上海画图图图"},
        {"id":16,"name":"小型制造"},
        {"id":17,"name":"小花"},
        {"id":18,"name":"小明"},
        {"id":19,"name":"小刚"},
        {"id":20,"name":"小吃"}],
"navigateFirstPage":null,
"navigateLastPage":null,
"firstPage":null,
"lastPage":null}  

7.可扩展性测试

我们重新写一个类,并且在数据库重新建一个表:

import ...

@Entity
@Data
@Table(name = "product")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "title")
    private String title;

    @Column(name = "description")
    private String description;

    @Column(name = "shopId")
    private Integer shopId;

    @Column(name = "price")
    private String price;
}

在xml中添加sql语句,如下:

<?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">
<!-- 注意:文件名必须跟Dao类名字一致,因为是根据文件名做关联。 -->
<mapper>

    <select id="selectByName" parameterType="String" resultMap="baseResultMap">
        select * from t_user t where t.username = #{username} limit 1
    </select>

</mapper>

这个xml文件跟其它的mybatis配置文件一样,namespace可不写。这里baseResultMap没有看到定义,但是确实存在,因为这个是easymybatis提供的一个内置resultMap。

<resultMap标签>:

resultMap="BaseResultMap"
如果配置了resultMap,返回值统一使用 resultMap=“BaseResultMap”,mybatis会根据查询到的条目数量自动进行判断,如果是一条就返回对象,如果是多条就返回List对象列表。

在TUseroDao.java中添加:

TUser selectByName(@Param("username")String username);

如果有问题,解决方法:相应的model对应的mapping中将resultType改成resultMap即可。

扩展:还有一种方式是easymybatis,easymybatis提供的一些查询方式已经满足大部分的查询需求,但是有些复杂的sql语句还是需要写在xml文件中。easymybatis同样支持将sql语句写在xml中,具体配置如下:

上边的例子是自己封装了的page类和page方法,在增加实体类的同时不再需要写page方法,只要数据库里有相关的表名,就可以直接在路径上改变实体名来查找相应类的分页信息,减少了分页方法与其他方法的耦合,这样每一个类的分页使用的都是同一个Mapper。但是这样的弊端也很明显,自定义程度不高,也就是说如果这些要分页的信息如果都没有where条件,或者where条件相同的话,使用这种自封装的方法是没有问题的,但是如果每一个类的分页信息要求的where条件有很大区别,比如说Person类有按照年龄显示分页的where条件,price类有按照价格显示分页的where条件,那么这种封装的方法想要实现这种不同类的不同where条件的分页时就显得可有可无,因为每加一个这样的where条件,就要在Mapper中写一个这样的SQL语句,这样其实更加大了项目开发成本。更加复杂的分页场景就要考虑使用pagehelper分页插件。

四、基于pagehelper插件的复杂分页查询

1. 导入依赖

pom.xml添加依赖:

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

2. 添加配置

在aplication.yml或者application.properties添加配置:

#分页pageHelper
pagehelper:
   helper-dialect: mysql
   reasonable: true
   support-methods-arguments: true

 ·helper-dialect:配置使用哪种数据库语言,不配置的话pageHelper也会自动检测

·reasonable:配置分页参数合理化功能,默认是false。

#启用合理化时,如果pageNum<1会查询第一页,如果pageNum>总页数会查询最后一页;

#禁用合理化时,如果pageNum<1或pageNum>总页数会返回空数据。

·params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值; 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。

·support-methods-arguments:支持通过Mapper接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。

3.OrderMapper与orderMapper.xml

import ...;

@Mapper
public interface OrderMapper {
    //查找所有
    List<Order> selectAll();
}
<select id="selectAll" resultType=".../Order">
     select * from order_table
</select>

 4. OrderService与OrderServiceImpl

import ...

public interface OrderService {

    List<Order> selectAll();
    //查找所有按照分页展示
    List<Order> findAllUserByPageF(int pageNum,int pageSize);
    //带分页信息查找所有按照分页展示
    PageInfo<Order> findAllUserByPageS(int pageNum, int pageSize);
}
import ...

@Service
public class OrderServiceImpl implements OrderService {
    @Resource
    private OrderMapper orderMapper;

    @Override
    public List<Order> selectAll(){return orderMapper.selectAll();}

    @Override
    public List<Order> findAllUserByPageF(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return orderMapper.selectAll();
    }

    @Override
    public PageInfo<Order> findAllUserByPageS(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<Order> lists = orderMapper.selectAll();
        return new PageInfo<Order>(lists);
    }

}

5.OrderController

import ...

@RestController
@RequestMapping("order")
public class OrderController {

    @Resource
    private OrderService orderService;

    @GetMapping("/all")
    public List<Order> selectAll(){
        return this.orderService.selectAll();
    }

    @GetMapping("/page")
    public List<Order> selectAllByPage(int pageNum,int pageSize){
        return orderService.findAllUserByPageF(pageNum,pageSize);
    }

    @GetMapping("/pageandinfo")
    public PageInfo<Order> testPageHelper1(int pageNum,int pageSize){
        return orderService.findAllUserByPageS(pageNum,pageSize);
    }
}

6.功能实现

请求路径:http://localhost:8888/order/page?pageNum=3&pageSize=6

请求结果:


{[{"id":13,"name":"豆浆油条"},
 {"id":14,"name":"子文包子"},
 {"id":15,"name":"黄河馒头"},
 {"id":16,"name":"长江小笼包"},
 {"id":17,"name":"上海画图图图"},
 {"id":18,"name":"小型制造"}]  

请求路径:http://localhost:8888/order/page?pageNum=3&pageSize=6http://localhost:8888/order/pageandinfo?pageNum=2&pageSize=3

请求结果:

 

{"pageNum":2,
"pageSize":3,
"size":3,
"startRow":4,
"endRow":6,
"total":6,
"pages":2,
"list":[{"id":13,"name":"豆浆油条"},  
        {"id":14,"name":"子文包子"},  
        {"id":15,"name":"黄河馒头"},],
"prePage":1,
"nextPage":0,
"isFirstPage":false,
"isLastPage":true,
"hasPreviousPage":true,
"hasNextPage":false,
"navigatePages":8,
"navigatepageNums":[1,2],
"navigateFirstPage":1,
"navigateLastPage":2,
"firstPage":1,
"lastPage":2}  

7.Mybatis 分页插件 Pagehelper 的 PageInfo 字段属性解释

pageNum=1当前页码
pageSize=1每页个数
size=1当前页个数
startRow=1由第几条开始
endRow=1到第几条结束
total=3总条数
pages=3总页数
list= XXXX查出来的数据集合
prePage=0上一页
nextPage=2下一页
isFirstPage=true是否为首页
isLastPage=false是否为尾页
hasPreviousPage=false是否有上一页
hasNextPage=true是否有下一页
navigatePages=8每页显示的页码个数
navigateFirstPage=1首页
navigateLastPage=3尾页
navigatepageNums=[1, 2, 3]}页码数

五、MybtisPlus插件自动分页配置

1、引入依赖

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.3.1.tmp</version>
</dependency>

2、MybatisPlusConfig配置文件

@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

3、项目中各层具体写法:

Mapper.xml中的sql正常写即可:

<select id="getAll" resultMap="BaseResultMap" >
     select * from staff_t
</select>

xxxMapper中传入page,注意这里的Page的包是mybatisplus的依赖包里面的:

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
List<StaffPO> GetAllByPage(Page page);

xxxService和xxxServiceImpl中传入page:

Page<StaffPO> getAll(Page page);
@Override
public Page<staffPO> getAll(Page page) {
     return xxxMapper.getAll(page);
}

 xxxController中传入page和VO:

public Page<staffPO> getAll(int pageNum,int pageSize) {
        Page<staffVO> page = new Page<>(pageNum,pageSize);
        return xxxService.getAll(page);
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis实现分页查询 的相关文章

  • you-get使用教程

    you get爬虫 xff0c 依赖于Python3 10 xff0c 可以爬取网页无法下载的视频文件 xff0c 具体步骤如下 xff1a 1 xff0c 下载Python3 10无脑下一步安装 2 xff0c 新建一个空白文件夹 xff
  • Windows如何自定义右键新建菜单栏

    目录 右键新建菜单的实现原理在右键新建菜单中新增项方法一可能出现的问题 方法二编辑右键新建菜单的图标 修改右键新建菜单栏的顺序 右键新建菜单的实现原理 参考文章 修改 win10 右键 新建 菜单 xff08 原理 两种方法及注意事项 xf
  • Centos 8升级至Centos 8 Stream

    文章目录 一 背景 xff1a 二 分析 xff1a 三 升级步骤 xff1a 四 成功安装 openstack 软件仓库参考链接 xff1a 一 背景 xff1a 因使用华为云ecs部署 openstack yoga 版本过程中 xff0
  • Ceph OSD为DOWN时修复

    本文所使用Ceph版本为luminous 不同版本删除OSD基本操作相同 xff09 xff0c 当出现Ceph OSD为down的情况时 xff0c 可以通过以下方法解决 xff08 假设ceph admin节点OSD 1 Down xf
  • 【Anaconda创建虚拟环境】报错及解决办法

    Q1 CondaHTTPError HTTP 000 CONNECTION FAILED for url 错误原因 xff1a 下载网速过慢 xff0c 时间过长 xff0c 自动断开 解决方法 xff1a 在下载命令前加入 conda c
  • 二叉树的绘制

    目录 一 知乎方法 二 动手实践 DOT 语言 无向图 有向图 绘制二叉树 设置属性 如何绘制优美的二叉树 一 知乎方法 知乎上的大佬提供了一系列画图的方法 xff0c 感兴趣的朋友可以自行去看看 用 Graphviz 绘制一棵漂亮的二叉树
  • 修改CPU的调频策略

    cat proc cpuinfo 查看CPU信息 CPU的调频策略修改 xff0c scaling governor xff1a governor 调频 策略 xff0c Linux 内核一共有 5 中调频策略 Performance xf
  • 一文看懂map、odom、base_link、laser之间的tf关系

    这三者之间的关系到底是怎样的 xff1f 尤其是map坐标系到odom坐标系之间的变换 xff0c 到底是有什么意义呢 xff1f 我当时被这个问题也是困扰了很久 现在经过实践终于有机会记录一下拙见 xff0c 如有错误 xff0c 还请指
  • VTK库cmake编译时找不到Qt5UiPlugin_DIR和QT5Sql_DIR

    ubuntu使用cmake gui编译VTK时 xff0c Qt5UiPlugin DIR和QT5Sql DIR是红的 xff0c 怎么办 xff1f 答 xff1a 安装libqt5x11extras5 dev和qt5 default两个
  • 超前进位加法器原理与递推式超详细推导+verilog实现与测试

    当记忆的线缠绕过往支离破碎 xff0c 是慌乱占据了心扉 寂寞沙洲冷 超前进位加法器原理 1 一位二进制的加法 首先考虑两个1位二进制相加 a 43 b xff0c 不考虑上一级的进位 xff0c 0和1简单相加 xff0c 即使是三岁小孩
  • 一生一芯 算术逻辑部件 ALU verilog浅析与实现

    仙歌音 xff0c 玉笛灵 xff0c 酒盏玉露清 剑舞轻 xff0c 潇洒过白袍影 谪仙 一生一芯项目 xff0c 预学习部分 xff0c 数电实验学习记录 xff0c 笔者电子寄术挂科 xff0c 基础知识甚是不熟 xff0c 故文中可
  • Verilated model didn‘t converge报错原因及解决

    还留着你的回忆 xff0c 分不清南北东西 我真的不想从此迷失在这幻境 迷失幻境 想必你急于知道原因 xff0c 不想听笔者解决问题的过程 xff0c 所以我先放结论 xff0c 再说我发现的过程 1 错误原因 一句话概括 xff0c 根本
  • CMake初级简明教程

    我藏在人群中 然后失去晴空 像我的名字 从你的记忆清空 你头顶的风 本文仅仅介绍了一些常用函数的参数的简单写法以及个人理解 xff0c 如果你想了解更多 xff0c 可以去查找专门介绍该函数的博客 本文只能保证你读完之后对各个函数有基本的认
  • ubuntu18安装ros1

    是非成败转头空 青山依旧在 xff0c 几度夕阳红 临江仙 滚滚长江东逝水 杨慎 0 前言 我都不明白安装一个ros有这么难么 xff0c 某学弟经常说卡住了安不了啥啥的 真是服了 xff0c 我再安一遍看看还有谁特么再说安不上 1 添加源
  • centos urllib3安装出错

    当卸载urllib3之后 xff0c 尝试重新安装 xff0c 发现出现问题 而后 xff0c 经过一番学习 xff0c 找到了解决办法 pip install upgrade urllib3 问题解决 xff01
  • Numpy简单学习(Spyder)

    1 Numpy创建 A 61 np array 1 2 3 4 5 6 两行三列的列表 类型为n维列表 Z 61 np zeros 3 2 3行2列的全0矩阵 Z1 61 np zeros 3 5 3行5列全0矩阵 全1矩阵 np ones
  • sip篇——服务器

    上篇提到sip定义了如何管理整个会话过程 xff0c 其实就是负责建立连接 监控和断开一个或多个参与者参与的会话 xff0c 利用IP地址和协议建立网络会话 xff0c 使得世界各地的人都可以通过互联网及时建立连接 1 sip中的逻辑组件
  • RTSP协议,与sip区别

    RTSP Real Time Streaming Protocol 是应用层中的实时流协议 xff0c 处于RTP RTCP SRTP等之上 xff0c 使用RTP或TCP来进行数据的传输 xff0c 其本身并不传输媒体流数据 xff0c
  • sip服务器搭建篇——虚拟机

    1 摘要 sip服务器 xff08 上篇所述的代理 注册 重定向等服务器功能组合而成的服务器软件 xff09 基于Linux操作系统而搭建 xff0c 这就需要在windows操作系统中下载虚拟机 xff0c 然后在虚拟机中才能使用Linu
  • Ubuntu常用命令[1]-ls、pwd、cd、mkdir、rmdir、apt

    xff0a ls ls是list的缩写 xff0c 列出当前目录下所有的文件或子目录 ls l 则是以更详细的模式进行查看 要点1 xff1a 在输入命令和路径时 xff0c 按tab键可自动补全 xff0c 例如ls ho xff0c 按

随机推荐

  • 什么是网关,网关的作用是什么

    1 什么是网关 网关又称网间连接器 协议转换器 xff0c 也就是网段 局域网 广域网 关卡 xff0c 不同网段中的主机不能直接通信 xff0c 需要通过关卡才能进行互访 xff0c 比如IP地址为192 168 31 9 子网掩码 xf
  • 无法访问opensips control panel

    OpenSIPS控制面板是一个用于供应的PHP Web门户OpenSIPS服务器 xff0c 可以为opensips提供系统和用户配置 xff0c 我们可以在该面板上添加 修改 管理sip账户信息和权限 有时候无法访问 xff0c 需要先将
  • sip电话注册失败问题解决心得总结

    这是我学习搭建opensips服务器以来持续性最长的一个问题 xff0c 具体就是终端电话软件一直注册不了已经创建好的sip会话账号 我刚开始用的终端电话软件是Zoiper xff0c 要么一直在注册中 xff0c 要么直接注册失败 xff
  • 面向对象以及类和对象的概念

    面向对象 面向对象和面向过程的区别 面向过程 xff1a 主要的关注点是实现具体的过程 xff0c 因果关系 集成显卡的开发思路 优点 xff1a 对于业务逻辑比较简单的程序 xff0c 可以达到快速开发 xff0c 前期投入成本较低 缺点
  • 尚硅谷hadoop3.x集群配置笔记及常见错误解决方式

    1 搭建集群准备工作 总体流程 准备3台客户机 xff08 关闭防火墙 静态IP 主机名称 xff09 安装JDK 配置环境变量 安装Hadoop 配置环境变量 配置集群 单点启动 配置ssh 群起并测试集群 一 模板虚拟机的搭建 配置要求
  • Centos 7系统下NTP时间同步服务配置

    NTP分为服务器端与客户端 xff08 自己选择某一台机器为服务器端 xff0c 其他机器则为客户端 xff09 xff0c 其中 xff0c 客户端通过向服务器端发送时间同步请求实现整个集群的时间同步 具体操作步骤如下所示 xff1a 1
  • EduCoder-程序设计技术R(第四部分循环结构程序设计1)- 第5关:求sn=a+aa+aaa+aaaa+......的值

    大家好鸭 x1f60e xff0c 前几期的EduCoder题解 xff0c 阅读量超过了之前的好多文章 xff01 谢谢大家的阅读 如果题目AC的话 xff0c 求一个免费的赞噢 x1f47b 如果有编程相关的问题 xff0c 可以一起交
  • 和风天气获取天气情况

    和风天气api xff08 实时天气 xff09 https dev qweather com docs api weather weather now 控制台 https console qweather com apps 1 进入控制台
  • Java习题练习:组队

    目录 题目描述 思路 其他真题 题目描述 作为篮球队教练 你需要从以下名单中选出1 号位至5 号位各一名球员 组成球队的首发阵容 每位球员担任1 号位至5 号位时的评分如下表所示 请你计算首发阵容1 号位至5 号位的评分之和最大可能是多少
  • 基于朴素贝叶斯分类器的西瓜数据集(实战)

    最近刚开始学习机器学习中的朴素贝叶斯分类器 xff0c 用西瓜数据集做了一下 xff0c 最后结果预测正确率75 xff0c 其中运用到的python语法并不复杂 xff0c 适合小白观看 目录 朴素贝叶斯分类器思想的自然语言描述 xff1
  • Golang将密码盐加密

    代码地址 xff1a https gitcode net m0 51510236 go password 首先我们来初始化一个项目 go mod init go password golang密码加密我们可以使用 golang org x
  • Spring使用SpringJUnit4ClassRunner时出现java.lang.NoSuchMethodError错误

    报错情况如下 xff1a java lang NoSuchMethodError org springframework core annotation AnnotatedElementUtils getAnnotationAttribut
  • 自己动手搭建网站:electerm远程连接云服务器,部署环境并发布第一个静态页面

    上篇写了云服务器和域名的选购 xff0c 这篇接上篇 xff0c 记录一下如何远程连接云服务器 xff0c 并发布第一个静态网页 xff0c 环境部署在另一篇博文里 xff1a Linux xff08 CentOS7 xff09 下配置jd
  • 解决IDEA报错Failed to start bean ‘documentationPluginsBootstrapper‘

    前言 白嫖容易 xff0c 创作不易 xff0c 若以下方案解决了问题烦请点赞支持一下 xff08 关注一下更好 xff09 在使用IDEA做项目时使用了Swagger进行接口文档的处理 swagger 使用的版本为2 9 2 xff0c
  • C语言%d输出的不同形式

    d就是普通的输出 2d是将数字按宽度为2 xff0c 采用右对齐方式输出 xff0c 若数据位数不到2位 xff0c 则左边补空格 2d是将数字按宽度为2 xff0c 采用左对齐方式输出 xff0c 若数据位数不到2位 xff0c 则右边补
  • latex常用语法

    字母表 字母上面的上标输入方法 xff0c 如右图所示 xff0c 如 bar a 表示字母a头上有一横线 小写希腊字母的输入方法 xff0c 如右图所示 xff0c 大写希腊字母的输入方法 xff0c 如右图所示 xff0c 大写希腊字母
  • Centos 7 内核升级

    一 升级至最新版本内核 1 升级系统包 xff0c 命令如下 yum update y 2 升级内核 xff0c 命令如下 rpm import http www elrepo orq RPM GPG KEY elrepo orq rpm
  • Win11安装Android子系统

    目录 一 获取安卓子系统安装包 二 安装Hyper v 三 运行Android安装包 四 安装组策略编辑器 五 配置Android环境 六 安装安卓apk格式app 一 获取安卓子系统安装包 百度云盘获取包 链接 xff1a https p
  • python-切割字符串成为列表(split函数)

    split函数切割字符串成为列表 在python的input时 xff0c 我们接收都是string类型 information span class token operator 61 span span class token buil
  • MyBatis实现分页查询

    目录 一 基于注解的简单分页查询 1 定义对象 2 Mapper接口 3 Controller类 4 功能实现 二 基于注解的较复杂分页查询 1 定义shop实体类和page分页类 2 Mapper接口 3 Controller类 4 功能