• 基于MySql的通用分页


    1、通用分页概述(基于MySql数据库的通用分页)

    通用分页就是把我们经常使用的分页方法进行封装,然后用泛型传递对象,利用反射获取对象的所有属性并且赋值。

    2、为何要使用通用分页?

    一般在实际项目的开发过程中我们会有很多数据的展示,并且数据量大,展示的数据种类繁多,这意味着我们要写很多重复的代码,我们可将重复相同的代码提取出来进行封装,后期进行调用即可。

    3、通用分页核心思路:将上一次查询请求再发一次,只不过页码变了

    4、环境配置(如何实现分页)

    1、明确我们的需求是什么?
    2、在实际项目开发中分页需要哪些参数?

    页码(每页所展示的数据)、总记录数、是否分页、点击下一页或者上一页所需地址

    1. PageBean
    2. 分页三要素
    3. page 页码 视图层传递过来
    4. rows 页大小 视图层传递过来
    5. total 总记录数 后台查出来
    6. pagination 是否分页 视图层传递过来
    7. getStartIndex() 基于MySql数据库分页,获取分页开始标记

    4.1.以书籍为例,创建一个书籍表,同时再创建一个书籍项目

    1. create table t_book(
    2. book_id int not null primary key auto_increment comment '书本编号',
    3. book_name varchar(30) not null comment '书本名称',
    4. book_name_pinyin varchar(30) null comment '书本拼音',
    5. book_price float default 0 comment '书本价格',
    6. book_type varchar(10) not null comment '书本类型'
    7. )comment '书本信息表';
    8. #分页(limit)
    9. #limit 参数1,参数2 (page-1)*rows
    10. #参数1:从第几条数据开始
    11. #参数2:每次返回多少条数据 rows
    12. #第一页:从0开始,返回2
    13. #第二页:从2开始,返回2

     4.2.项目中的相关配置以及导入必要的依赖

    依赖:

    mysql-connector-java-5.1.44-bin.jar        MySQL的驱动类

    pinyin4j-2.5.0.jar        拼音的jar,作用是可以快速的将中文转变成英文,只提取拼音首字母

    standard-1.1.2.jar        jstl标签

    jstl-1.2.jar

    工具类:

    CommonUtils.java        反射封装ResultSet结果集

    DBHelper.java        连接数据库

    config.properties        资源文件 
    EncodingFiter.java        中文乱码过滤器
    StringUtils.java        判断字符串是否存在(为空)
    PageTag.java        自定义标签的助手类
    PageBean.java        分页工具类

    PinYinUtil.java         拼音工具类

    4.3.先写一个分页工具类,用于实现分页效果。

    1. package com.zking.pagination.util;
    2. import java.io.Serializable;
    3. import java.util.Map;
    4. import javax.servlet.http.HttpServletRequest;
    5. /**
    6. * 分页工具类
    7. * @author gss
    8. *
    9. */
    10. public class PageBean implements Serializable{
    11. //当前页码,默认1
    12. private int page=1;
    13. //页面显示条数,默认10
    14. private int rows=10;
    15. //总记录数,默认0
    16. private int total=0;
    17. //是否分页标记,默认分页
    18. private boolean pageination=true;
    19. //http://localhost:8080/pagination/BookServlet.action
    20. ///pagination/BookServlet.action
    21. //获取上一次请求路径
    22. private String url;
    23. //获取上一次请求的请求参数集合
    24. // Map params=req.getParameterMap();
    25. //
    26. private Map<String,String[]> params;
    27. public PageBean() {
    28. super();
    29. }
    30. /**
    31. * 获取起始记录的下标(基于Mysql分页,计算limit分页开始位置)
    32. * @return
    33. */
    34. public int getStartIndex() {
    35. return (this.page-1)*this.rows;
    36. }
    37. public void setRequest(HttpServletRequest req) {
    38. //获取前端提交的请求参数(分页三要素:页码、页大小、总记录数 )
    39. String page = req.getParameter("page");
    40. String rows = req.getParameter("rows");
    41. String pagination = req.getParameter("pagination");
    42. //赋值
    43. this.setPage(page);
    44. this.setRows(rows);
    45. this.setPageination(pagination);
    46. //获取上一次请求的请求路径
    47. //http://localhost:8080/pagination/BookServlet.action
    48. // req.getRequestURI()==等同于/pagination/BookServlet.action
    49. // req.getContextPath()==项目名/pagination
    50. // req.getServletPath()==请求路径/BookServlet.action
    51. //当前路径
    52. this.url = req.getRequestURI();
    53. //获取上一次请求的请求参数集合
    54. //Map-->params.put("bookname",new String[]{"",""})
    55. this.params = req.getParameterMap();
    56. }
    57. /**
    58. * 获取最大页码
    59. * @return
    60. */
    61. public int getMaxPager() {
    62. int p = this.total/this.rows;
    63. //判断是否有余数,如果有余数,则最大页码+1
    64. if(this.total%this.rows!=0)
    65. p++;
    66. return p;
    67. }
    68. /**
    69. * 获取上一页
    70. * @return
    71. */
    72. public int getProviousPager() {
    73. int p = this.page-1;
    74. if(p<1)
    75. p=1;
    76. return p;
    77. }
    78. /**
    79. * 获取下一页
    80. * @return
    81. */
    82. public int getNextPager() {
    83. int p = this.page+1;
    84. if(this.page>=this.getMaxPager())
    85. p=this.getMaxPager();
    86. return p;
    87. }
    88. public void setPage(String page) {
    89. if(null!=page)
    90. this.page = Integer.parseInt(page);
    91. }
    92. public void setRows(String rows) {
    93. if(null!=rows)
    94. this.rows = Integer.parseInt(rows);
    95. }
    96. public void setPageination(String pageination) {
    97. if(null!=pageination)
    98. this.pageination = Boolean.parseBoolean(pageination);
    99. }
    100. public int getPage() {
    101. return page;
    102. }
    103. public void setPage(int page) {
    104. this.page = page;
    105. }
    106. public int getRows() {
    107. return rows;
    108. }
    109. public void setRows(int rows) {
    110. this.rows = rows;
    111. }
    112. public int getTotal() {
    113. return total;
    114. }
    115. public void setTotal(int total) {
    116. this.total = total;
    117. }
    118. public boolean isPageination() {
    119. return pageination;
    120. }
    121. public void setPageination(boolean pageination) {
    122. this.pageination = pageination;
    123. }
    124. public String getUrl() {
    125. return url;
    126. }
    127. public void setUrl(String url) {
    128. this.url = url;
    129. }
    130. public Map<String, String[]> getParams() {
    131. return params;
    132. }
    133. public void setParams(Map<String, String[]> params) {
    134. this.params = params;
    135. }
    136. @Override
    137. public String toString() {
    138. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pageination=" + pageination
    139. + ", url=" + url + ", params=" + params + "]";
    140. }
    141. }

    BaseDao.java(是一个通用的父类方法,来帮助我们实现通用的分类)

    1. package com.zking.pagination.dao;
    2. import java.sql.Connection;
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.util.List;
    7. import com.zking.pagination.util.DBHelper;
    8. import com.zking.pagination.util.PageBean;
    9. public class BaseDao {
    10. public static interface CallBack{
    11. //只用于遍历ResultSet结果集
    12. public List foreachRs(ResultSet rs) throws SQLException;
    13. }
    14. /**
    15. * 通用分页方法(既支持分页,也支持不分页)
    16. * @param sql 普通的sql
    17. * @param pageBean pageBean 分页对象
    18. * @return 查询结果集
    19. */
    20. public List excuteQuery(String sql,PageBean pageBean,CallBack callBack){
    21. //声明对象
    22. Connection conn = null;
    23. PreparedStatement stmt = null;
    24. ResultSet rs = null;
    25. try {
    26. //获取连接对象
    27. conn = DBHelper.getConnection();
    28. //根据pageBean分页对象判断是否分页
    29. if(null!=pageBean&&pageBean.isPageination()) {
    30. //1.分页
    31. //1)根据满足条件查询总记录数
    32. String countSQL = this.getCountSQL(sql);
    33. //创建执行对象
    34. stmt = conn.prepareStatement(countSQL);
    35. //执行sql语句并返回总记录数
    36. rs = stmt.executeQuery();
    37. //获取总记录数
    38. if(rs.next()) {
    39. pageBean.setTotal(rs.getInt(1));
    40. }
    41. //2)根据满足条件查询分页结果集
    42. sql = this.getPagerSQL(sql, pageBean);//覆盖
    43. }
    44. //创建执行对象
    45. stmt = conn.prepareStatement(sql);
    46. //查询结果集
    47. rs = stmt.executeQuery();
    48. return callBack.foreachRs(rs);
    49. } catch (Exception e) {
    50. e.printStackTrace();
    51. }finally {
    52. DBHelper.close(conn, stmt, rs);
    53. }
    54. return null;
    55. }
    56. /**
    57. * 将普通的sql语句转换成查询总记录条数的sql语句
    58. * select * from t_book
    59. * select * from t_book where ...
    60. * select book_id,book_name from t_book
    61. * select book_id,book_name from t_book where ...
    62. * ------------>
    63. * select count(0) from t_book where ...
    64. * @param sql 普通的sql
    65. * @return 查询总记录数的sql
    66. */
    67. private String getCountSQL(String sql) {
    68. return "select count(0) from ("+sql+") temp";
    69. }
    70. /**
    71. * 将普通的sql语句转换成查询分页结果集的sql语句
    72. * select * from t_book
    73. * select * from t_book where ...
    74. * select book_id,book_name from t_book
    75. * select book_id,book_name from t_book where ...
    76. * ------------>
    77. * select * from t_book limit
    78. * select * from t_book where 1=1 limit
    79. * @param sql 普通的sql
    80. * @param pageBean 分页对象(包含当前页码和每页条数,用于计算分页的关键数据)
    81. * @return 查询分页结果集的sql
    82. */
    83. private String getPagerSQL(String sql,PageBean pageBean) {
    84. return sql+" limit "+pageBean.getStartIndex()+","+pageBean.getRows();
    85. }
    86. }

    BookDao.java(dao类继承了BaseDao 父类,代码简洁,通用的方法都在父类中)

    1. package com.zking.pagination.dao;
    2. import java.sql.Connection;
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. import javax.management.RuntimeErrorException;
    9. import com.zking.pagination.entity.Book;
    10. import com.zking.pagination.util.DBHelper;
    11. import com.zking.pagination.util.PageBean;
    12. import com.zking.pagination.util.StringUtils;
    13. public class BookDao extends BaseDao{
    14. //1、书本新增
    15. public void addBook(Book book) {
    16. //声明对象
    17. Connection conn = null;
    18. PreparedStatement stmt = null;
    19. try {
    20. //获取连接对象
    21. conn= DBHelper.getConnection();
    22. //定义sql语句
    23. String sql = "insert into t_book(book_name,book_name_pinyin,book_price,book_type) values(?,?,?,?)";
    24. //创建执行对象
    25. stmt = conn.prepareStatement(sql);
    26. //参数赋值
    27. stmt.setString(1, book.getBook_name());
    28. stmt.setString(2, book.getBook_name_pinyin());
    29. stmt.setFloat(3, book.getBook_price());
    30. stmt.setString(4, book.getBook_type());
    31. //执行sql语句并返回影响行数
    32. int i = stmt.executeUpdate();
    33. if(i<1) {
    34. throw new RuntimeException("影响行数为0,添加失败");
    35. }
    36. } catch (Exception e) {
    37. e.printStackTrace();
    38. }finally {
    39. DBHelper.close(conn, stmt, null);
    40. }
    41. }
    42. /**
    43. * 2、书本分页查询 query/find/select/get
    44. * @param book 要查询的对象
    45. * @return 返回结果集
    46. */
    47. public List queryBookPager(Book book,PageBean pageBean){
    48. //定义sql语句
    49. String sql = "select book_id,book_name,book_name_pinyin,book_price,book_type from t_book where 1=1";
    50. //拼接查询条件,按照书本名称模糊查询
    51. if(StringUtils.isNotBlank(book.getBook_name()))
    52. sql+=" and book_name like '%"+book.getBook_name()+"%'";
    53. //按照书本编号降序排序
    54. sql+=" order by book_id desc";
    55. System.out.println(sql);
    56. return super.excuteQuery(sql, pageBean, new CallBack() {
    57. @Override
    58. public List foreachRs(ResultSet rs) throws SQLException {
    59. List blist = new ArrayList<>();
    60. //定义Book对象
    61. Book b = null;
    62. //循环遍历结果集
    63. while(rs.next()) {
    64. //创建Book对象
    65. b = new Book();
    66. b.setBook_id(rs.getInt("book_id"));
    67. b.setBook_name(rs.getString("book_name"));
    68. b.setBook_name_pinyin(rs.getString("book_name_pinyin"));
    69. b.setBook_price(rs.getFloat("book_price"));
    70. b.setBook_type(rs.getString("book_type"));
    71. //将对象添加到集合中
    72. blist.add(b);
    73. }
    74. return blist;
    75. }
    76. });
    77. //以下为查询原生态代码
    78. /* List blist = new ArrayList<>();
    79. Connection conn = null;
    80. PreparedStatement stmt = null;
    81. ResultSet rs = null;
    82. try {
    83. //获取连接对象
    84. conn= DBHelper.getConnection();
    85. //定义sql语句
    86. String sql = "select book_id,book_name,book_name_pinyin,book_price,book_type from t_book where 1=1";
    87. //拼接查询条件,按照书本名称模糊查询
    88. if(StringUtils.isNotBlank(book.getBook_name()))
    89. sql+=" and book_name like '%"+book.getBook_name()+"%'";
    90. //按照书本编号降序排序
    91. sql+=" order by book_id desc";
    92. System.out.println(sql);
    93. //创建执行对象
    94. stmt = conn.prepareStatement(sql);
    95. //执行sql语句并返回查询结果集
    96. rs = stmt.executeQuery();
    97. //定义Book对象
    98. Book b = null;
    99. //循环遍历结果集
    100. while(rs.next()) {
    101. //创建Book对象
    102. b = new Book();
    103. b.setBook_id(rs.getInt("book_id"));
    104. b.setBook_name(rs.getString("book_name"));
    105. b.setBook_name_pinyin(rs.getString("book_name_pinyin"));
    106. b.setBook_price(rs.getFloat("book_price"));
    107. b.setBook_type(rs.getString("book_type"));
    108. //将对象添加到集合中
    109. blist.add(b);
    110. }
    111. } catch (Exception e) {
    112. e.printStackTrace();
    113. }finally {
    114. DBHelper.close(conn, stmt, rs);
    115. }
    116. return blist;*/
    117. }
    118. }

     BookDaoTest.java        使用Junit测试

    1. package com.zking.pagination.dao;
    2. import static org.junit.Assert.*;
    3. import java.util.List;
    4. import org.junit.After;
    5. import org.junit.Before;
    6. import org.junit.Test;
    7. import com.zking.pagination.entity.Book;
    8. import com.zking.pagination.util.PageBean;
    9. import com.zking.pagination.util.PinYinUtil;
    10. public class BookDaoTest {
    11. Book book = null;
    12. BookDao bd = new BookDao();
    13. @Before
    14. public void setUp() throws Exception {
    15. //初始化一次
    16. book = new Book();
    17. //System.out.println("setUp");
    18. }
    19. @After
    20. public void tearDown() throws Exception {
    21. //System.out.println("tearDown");
    22. }
    23. @Test
    24. public void testAddBook() {
    25. for (int i = 0; i < 64; i++) {
    26. book = new Book();
    27. book.setBook_name("红楼梦第"+(i+1)+"章");
    28. book.setBook_name_pinyin(PinYinUtil.toPinyin("红楼梦第"+(i+1)+"章").toLowerCase());
    29. book.setBook_price(128f);
    30. book.setBook_type("文学");
    31. //调用dao类添加方法
    32. bd.addBook(book);
    33. }
    34. //System.out.println("testAddBook");
    35. }
    36. @Test
    37. public void testQueryBookPager() {
    38. //模糊查询
    39. book.setBook_name("2");
    40. PageBean pageBean = new PageBean();
    41. pageBean.setPage(2);//第二页
    42. pageBean.setRows(8);//每页条数
    43. //pageBean.setPageination(false);//不分页
    44. //调用dao类查询方法
    45. List books = bd.queryBookPager(book,pageBean);
    46. System.out.println("总记录数:"+pageBean.getTotal());
    47. books.forEach(System.out::println);
    48. }
    49. }

    BookServlet.java

    1. package com.zking.pagination.action;
    2. import java.io.IOException;
    3. import java.util.List;
    4. import javax.servlet.ServletException;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import com.zking.pagination.dao.BookDao;
    9. import com.zking.pagination.entity.Book;
    10. import com.zking.pagination.util.PageBean;
    11. public class BookServlet extends HttpServlet {
    12. @Override
    13. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    14. this.doPost(req, resp);
    15. }
    16. @Override
    17. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    18. //获取请求查询参数
    19. String bookname = req.getParameter("bookname");
    20. //实例化BookDao
    21. BookDao bd = new BookDao();
    22. //实例化Book
    23. Book book = new Book();
    24. book.setBook_name(bookname);
    25. //创建PageBean
    26. PageBean pageBean = new PageBean();
    27. //必须在查询之前完成请求参数赋值
    28. pageBean.setRequest(req);
    29. //实现书本查询
    30. List books = bd.queryBookPager(book,pageBean);
    31. //将查询的结果books保存到request作用域中
    32. req.setAttribute("books", books);
    33. //将pageBean对象存入到request作用域中
    34. req.setAttribute("pageBean", pageBean);
    35. //转发到指定页面并显示查询结果
    36. req.getRequestDispatcher("/bookList.jsp").forward(req, resp);;
    37. }
    38. }

          配置web.xml

    1. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    2. <display-name>paginationdisplay-name>
    3. <filter>
    4. <filter-name>encodingFilterfilter-name>
    5. <filter-class>com.zking.pagination.util.EncodingFilterfilter-class>
    6. filter>
    7. <filter-mapping>
    8. <filter-name>encodingFilterfilter-name>
    9. <url-pattern>/*url-pattern>
    10. filter-mapping>
    11. <servlet>
    12. <servlet-name>BookServletservlet-name>
    13. <servlet-class>com.zking.pagination.action.BookServletservlet-class>
    14. servlet>
    15. <servlet-mapping>
    16. <servlet-name>BookServletservlet-name>
    17. <url-pattern>/BookServlet.actionurl-pattern>
    18. servlet-mapping>
    19. web-app>

    z标签:是我们的分页标签它还有一个主要的类-----PaginationTag助手类,是整个分页的灵魂所在。 

    1. package com.zking.pagination.tag;
    2. import java.util.Map;
    3. import java.util.Map.Entry;
    4. import java.util.Set;
    5. import javax.servlet.jsp.JspException;
    6. import javax.servlet.jsp.JspWriter;
    7. import javax.servlet.jsp.tagext.BodyTagSupport;
    8. import com.zking.pagination.util.PageBean;
    9. public class PaginationTag extends BodyTagSupport {
    10. private PageBean pageBean;
    11. @Override
    12. public int doEndTag() throws JspException {
    13. return EVAL_PAGE;
    14. }
    15. @Override
    16. public int doStartTag() throws JspException {
    17. JspWriter out = pageContext.getOut();
    18. try {
    19. out.write(toHtml());
    20. } catch (Exception e) {
    21. e.printStackTrace();
    22. }
    23. return SKIP_BODY;
    24. }
    25. private String toHtml() {
    26. //判断是否分页
    27. if(null==pageBean||!pageBean.isPageination())
    28. return "";
    29. else {
    30. StringBuilder sb=new StringBuilder();
    31. //TODO
    32. sb.append("
      ");
    33. //拼接Form表单
    34. sb.append("
      +pageBean.getUrl()+"\" method=\"post\">");
    35. //设置page隐藏域
    36. sb.append("");
    37. //拼接请求参数集合
    38. Map map = pageBean.getParams();
    39. //获取请求参数集合键值对
    40. Set> entrySet = map.entrySet();
    41. //遍历请求参数键值对
    42. for (Entry entry : entrySet) {
    43. //获取请求参数名,也就是来自于表单中的name属性名称
    44. String name=entry.getKey();
    45. //如果参数为page,则continue跳过
    46. if(name.equals("page"))
    47. continue;
    48. //获取请求参数对应的值,String[]
    49. String[] values=entry.getValue();
    50. //遍历value值
    51. for (String value : values) {
    52. //拼接请求参数
    53. sb.append("");
    54. }
    55. }
    56. sb.append("");
    57. //拼接共几页/第几页
    58. sb.append("[第"+pageBean.getPage()+"页/共"+pageBean.getMaxPager()+"页]");
    59. //拼接首页、上一页、下一页、末页
    60. if(pageBean.getPage()==1)
    61. sb.append("首页 上一页 ");
    62. else {
    63. sb.append("首页 ");
    64. }
    65. if(pageBean.getPage()==pageBean.getMaxPager())
    66. sb.append("下一页 末页 ");
    67. else {
    68. }
    69. //拼接跳转页码
    70. sb.append("");
    71. sb.append("");
    72. //拼接javascript跳转方法
    73. sb.append("");
    74. sb.append("
      ");
  • return sb.toString();
  • }
  • }
  • public PageBean getPageBean() {
  • return pageBean;
  • }
  • public void setPageBean(PageBean pageBean) {
  • this.pageBean = pageBean;
  • }
  • }
  • 启动Tomcat 

    bookList.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    4. <%@taglib uri="/zking" prefix="z" %>
    5. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    6. <html>
    7. <head>
    8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    9. <title>Insert title heretitle>
    10. head>
    11. <body>
    12. <form action="BookServlet.action" method="post" align="center">
    13. <label>书本名称:label><input type="text" name="bookname"/>
    14. <input type="submit" value="查询"/>
    15. form>
    16. <table width="100%" border="1" cellpadding="0" cellspacing="0">
    17. <tr>
    18. <th>书本编号th>
    19. <th>书本名称th>
    20. <th>书本拼音th>
    21. <th>书本价格th>
    22. <th>书本类型th>
    23. tr>
    24. <c:forEach items="${books }" var="b">
    25. <tr>
    26. <th>${b.book_id }th>
    27. <th>${b.book_name }th>
    28. <th>${b.book_name_pinyin }th>
    29. <th>${b.book_price }th>
    30. <th>${b.book_type }th>
    31. tr>
    32. c:forEach>
    33. table>
    34. <z:pagination pageBean="${pageBean }"/>
    35. <%-- <div style="float: right;">
    36. <form id="ff" action="${pageBean.getUrl()}" method="post">
    37. <input type="hidden" name="page"/>
    38. Map maps = ${pageBean.getParams() }
    39. <input type="hidden" name="bookname" value="1"/>
    40. form>
    41. [第${pageBean.getPage()}页/共${pageBean.getMaxPager()}页]
    42. <a href="javascript:gotoPage(1);">首页a>
    43. <a href="javascript:gotoPage(${pageBean.getProviousPager()});">上一页a>
    44. <a href="javascript:gotoPage(${pageBean.getNextPager()});">下一页a>
    45. <a href="javascript:gotoPage(${pageBean.getMaxPager()});">末页a>
    46. <input type="text" id="go" style="width:18px"/>
    47. <input type="button" value="GO" onclick="skipPage(${pageBean.getMaxPager()})" />
    48. div> --%>
    49. body>
    50. html>

    效果图:

  • 相关阅读:
    win10 通过wmic命令行设置系统环境变量
    记GitLab服务器迁移后SSH访问无法生效的问题解决过程
    Python爬虫实战,requests+parsel模块,爬取二手房房源信息数据
    Tomcat报404问题的原因分析
    Hugging News #0821: Hugging Face 完成 2.35 亿美元 D 轮融资
    Jenkins集成newman
    那些惊艳一时的 CSS 属性
    Kruskal 重构树
    嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
    【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列)
  • 原文地址:https://blog.csdn.net/m0_61911999/article/details/125973777