SpringBoot知识范围-学习步骤【JSB系列之000】
用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干!
只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知!
韩顺平说:学习JAVA的人有两大难
第一困惑,JAVA能百度到的知识太多太多,完全不知道学啥
第二困惑,就是不知道以什么样的顺序去学,有的时候乱看一堆视频有遗漏,有的时候,两边的视频还有重复。
Spring的外围技术就更多了。其实,验证码就是其中之一。
所以,学习东西要系统一些,如果基本功不够,那后面的技术就会学的很浮。
本系列环境
环境 | win11 |
---|---|
工具 | idea 2017/idea 2018 |
jdk | 1.8 |
数据库 | mysql5.5 |
maven | 3.2.1 |
项目导入方式 | maven 导入 |
数据库前端工具 | mysql-front (navicat 也可以) |
数据库前端工具:mysql-front (navicat 也可以)
主要是这些跟PHPStudy 2018 整合了,所以有的时候懒的打开navicat
关于环境的重要性,直接看上面的《SpringBoot 的项目编译即报错处理–JSB系列之001》
不管是啥系统,信息都不太可能一页就显示完成,这个时间就需要列表,还有分页。事实上连微信小程序也是要分页的,只是它的翻页是手拉屏幕向上的时候,屏幕有一个转圈的小动作,然后,下一页的内容就出来。不过,现在讲的是服务端的代码
现在的系统分页主要就是这么三种情况
1 数据都推动前端,用JS分页。
2 把数据集查出来,JAVA代码分页
3 在数据库里只查那一页的数据。
一、使用前端表格插件进行分页
有很多的table 页面组件都支持这种。
如果建表或是修改表时指定了Cache子句,则当用户第一次访问表中的数据是,这个表将被加入到数据库高速缓存中并保留较长一段时间,
如果建表或是修改表时指定了Cache子句,则当用户第一次访问表中的数据是,这个表将被加入到数据库高速缓存中并保留较长一段时间,这样用户以后再次访问该表是,可直接访问数据库高速缓存中的数据,从而提高访问的速度。
因此建议对一些较小的,,用户访问频繁的表,可以考虑加上cache子句,以提高访问效率。常见如用户表,权限表,角色表,部门表等。
修改表的语句示例为:
alter table TB_SYS_USER cache;
alter table TB_SYS_USER_dept cache;
alter table TB_SYS_USER_role cache;
所以千万学了一个半桶水的固定思维说,现在都是SQL分页了,前台分页这种早就淘汰等等。
二、后端用代码实现分页
用JAVA代码来切分list
就是根据当前第几页,每页显示几条数据进行分页数据的处理。
优点:无,应该说是为了学员的练习吧。不各道为啥这样,跟前端分页比,有代码量,跟SQL分页比,它速度也没快。
一次请求只会向前端返回一页的数据,浏览器需要接收的数据变少了,页面展示会变快
缺点:前面页面的,SQL分页的缺点它都有了。
三、数据库用sql语句实现
以MySQL为例, select * from sys_order limit 0,10 //从第0条开始查,一共查询10条记录
优点:真正实现了从数据库就是分页处理
也是业务表最主流的分页技术。
甚至还有了oracle 分页语句,sqlserver 分页语句的不少讨论
oracle
SELECT * FROM (
SELECT t.*, ROWNUM RN
FROM (SELECT * FROM table_name ORDER BY column_name ASC) t
WHERE ROWNUM <= :page * :size
)
WHERE RN > (:page - 1) * :size;
SQLSEVER
select * from
(
select ROW_NUMBER()over(order by StuNo asc) id,* from Student
)Student
where id between @startIndex and @endIndex
插件1 Mybatis-plus
插件2 pagehelper
要说明的是,并不是 springBoot 项目里存在的这两种插件,事实上,在mybatis 的时候,就一直存在。
比如在SSM的项目中。
在mybatis的pom中添加分页插件依赖
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>5.2.0version> //版本号
dependency>
在mybatis-config.xml中创建分页插件
<plugins>
<!--分页插件-->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
在查询的JAVA语句中:
@Test
public void selectPageTest() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);//获取映射方法
Page<Object> objects = PageHelper.startPage(1, 6); //创建分页插件对象
List<Emp> list = mapper.selectByExample(null); //查询对象
list.forEach(System.out::println);
System.out.println(objects);
}
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>5.1.2version>
dependency>
在项目的配置文件 里
配置类。这里可以参见《SpringBoot 的配置类–JSB系列之003》
这里一定要把这个知识点弄懂,还有就是配置类的运行顺序。
package com.code;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
import com.github.pagehelper.PageHelper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.io.IOException;
import java.util.Properties;
//mybatis 分页插件 参数配置
@Configuration
@EnableTransactionManagement
@MapperScan("com.code.mapper")
public class PageHelperConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
page.setDialectType("mysql");
return page;
}
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor page = new PerformanceInterceptor();
page.setFormat(true);
return page;
}
//配置mybatis的分页插件pageHelper
@Bean
public PageHelper pageHelper(){
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("offsetAsPageNum","true");
properties.setProperty("rowBoundsWithCount","true");
properties.setProperty("reasonable","true");
properties.setProperty("dialect","mysql"); //配置mysql数据库的方言
pageHelper.setProperties(properties);
return pageHelper;
}
}
比较贴心的是PaginationInterceptor 这个类是插件带的
/**
* @param keyword 搜索关键词
* @param p 页面 默认第1页
* @param pageSize 每页显示条数 默认每页10条
* @param model
* @return
*/
@RequestMapping("/list") //分页查询数据
public String list(String keyword, Integer p, Integer pageSize, Model model) {
p = null == p ? 1 : p; //默认显示第一页
pageSize = null == pageSize ? 10 : pageSize; //默认每页显示10条
Page<Userinfo> sortPage = new Page<Userinfo>(p, pageSize);//参数一是当前页,参数二是每页个数
List<Userinfo> userinfoList = userinfoMapper.selectPage(sortPage, null);
long total = sortPage.getTotal(); //总页数
int current = sortPage.getCurrent();
long pages = sortPage.getPages();
model.addAttribute("userinfoList", userinfoList); //绑定接受参数
model.addAttribute("cp", current); //当前页
model.addAttribute("tp", pages); //总页数
model.addAttribute("total", total); //总条数
model.addAttribute("pageListURL", "userinfo/list"); //总条数
return "userinfo/userinfoList";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%--分页代码--%>
<%--项目绝对路径--%>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<div style="text-align: center">
<div class="layui-btn-group">
<a href="${ctx}/${pageListURL}?p=1" class="layui-btn layui-btn-primary layui-btn-sm">首页a>
<c:if test="${cp>1}">
<a href="${ctx}/${pageListURL}?p=${cp-1}"
class="layui-btn layui-btn-primary layui-btn-sm">上一页a>
c:if>
<%--前后各显示3个页码--%>
<c:forEach begin="${cp-3>1?cp-3:1}" end="${cp+3" var="k">
<c:if test="${cp==k}"> <%-- 是当前页--%>
<a href="${ctx}/${pageListURL}?p=${k}" class="layui-btn layui-btn-sm">${k}a>
c:if>
<c:if test="${cp!=k}"> <%-- 不是当前页--%>
<a href="${ctx}/${pageListURL}?p=${k}"
class="layui-btn layui-btn-primary layui-btn-sm">${k}a>
c:if>
c:forEach>
<c:if test="${cp" >
<a href="${ctx}/${pageListURL}?p=${cp+1}"
class="layui-btn layui-btn-primary layui-btn-sm">下一页a>
c:if>
<a href="${ctx}/${pageListURL}?p=${tp}" class="layui-btn layui-btn-primary layui-btn-sm">尾页a>
<button class="layui-btn layui-btn-primary layui-btn-sm">共${total}条记录button>
div>
div>
从注释就可以看出,pagehelper的功能还是挺强大,基本上主流的,英文+数字,中文,算术表达式都有。还有一个英文+数字GIF动画的,不过,在博客里也一样要用GIF才能看到效果。其实,博主最喜欢的就是他的英文+数字。跟别人的英文+数字真的是好看太多,而且也不易被软件识别。
如果项目里使用了shiro 的话,一定要把 验证码的URL放出来,不然的话,你的验证码的路径被你自己的shiro 敌我不分的胡乱杀掉了。
这里就不详细说了,这个知识点涉及的问题,比验证码还多。
/**
* 配置shiro的过滤器
*/
@Bean(SHIRO_FILTER)
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
// 设置安全管理器
factoryBean.setSecurityManager(securityManager);
// 设置未登陆的时要跳转的页面
factoryBean.setLoginUrl(loginUrl);
Map<String, String> filterChainDefinitionMap = new HashMap<>();
// 设置放行的路径
if (anonUrls != null && anonUrls.length > 0) {
for (String anon : anonUrls) {
filterChainDefinitionMap.put(anon, "anon");
}
}
filterChainDefinitionMap.put("/static/**", "anon"); // 先把页面全放行了,不然调 试起来太麻烦了 ,by项目花园范德彪
filterChainDefinitionMap.put("/code/**", "anon"); //这里要注意的是把验证码的URL放出来,不然不会显示到登陆上。by项目花园范德彪
// 设置登出的路径
if (null != logOutUrl) {
filterChainDefinitionMap.put(logOutUrl, "logout");
}
// 设置拦截的路径
if (authcUlrs != null && authcUlrs.length > 0) {
for (String authc : authcUlrs) {
filterChainDefinitionMap.put(authc, "authc");
}
}
Map<String, Filter> filters=new HashMap<>();
// filters.put("authc", new ShiroLoginFilter());
//配置过滤器
factoryBean.setFilters(filters);
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return factoryBean;
}
成功之后就可以展示出效果图的样子了。
项目目录,不能有中文或空格,就乖乖的用C语言能识别的变量名是最好的
#配置数据源的属性
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/pet_minimeng?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC
username: root
password: 123456
#最大活跃数
max-active: 20
max-wait: 50000
initial-size: 1
filters: stat,log4j,wall
validationQuery: SELECT 'x' #验证连接
enable: true
#监控配置
stat-view-servlet:
enabled: true
login-username: root
login-password: xinyerfid
allow:
deny:
url-pattern: /druid/*
#thymeleaf的配置
thymeleaf:
cache: false
enabled: true
# web-stat-filter:
# enabled: true
# exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
# aop:
# proxy-target-class: true
#配置mybatisplus
mybatis-plus:
mapper-locations:
- classpath:mapper/*/*Mapper.xml
global-config:
db-config:
id-type: auto
banner: true
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#shiro的配置
shiro:
hash-algorithm-name: md5
hash-iterations: 2
anon-urls:
- /wx/**
- /index.html*
- /sys/toLogin*
- /login/login*
- /resources/**
- /user/loadAllUser
- /user/loadUsersByHospitalId
login-url: /index.html
log-out-url: /login/logout*
authc-ulrs:
- /**
server:
port: 8088
example:
wx:
app-id:
app-secret:
要注意的是启动的端口号,
数据源里的datasource 的名字。用户名,密码。还有就是mysql 的驱动是com.mysql.jdbc.Driver
总的来说,
com.mysql.jdbc.Driver
是 mysql-connector-java 5.5之前的,
com.mysql.cj.jdbc.Driver
是 mysql-connector-java 6及6之后的的,
初学者容易陷入一个误区,就是什么东西最新版是最好的,事实上很有可能他写的东西,明明JDK6.0就完全足够。一边喊着自己的机器内存不足,一边让内存运行着他自己用不到的东西。就比如说idea应该算是这些开发者工具里最卡的。有人可能明明只是打开几个网页,那为什么不使用webstorm? 甚至不是写很多代码的时候,为什么不选择更轻量级的VSCode?
不要VIP,就看你有多少积分了,还有就是CSDN好象自己会涨价。早下早享受哟
SpringBoot登陆+6套主页-【JSB项目实战】1
https://download.csdn.net/download/dearmite/88090566
无,看懂即是神
范德彪经典语录: 学pagehelper,你不能按套路出牌