当前mybaits-plus版本为3.5.3
springboot启动报错Bean named ‘ddlApplicationRunner’ is expected to be of type ‘org.springframework.boot.Runner’ but was actually of type ‘org.springframework.beans.factory.support.NullBean’
解决:在启动类加上方法
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
    /**
     * 解决:Bean named 'ddlApplicationRunner' is expected 的报错
     * @param ddlList
     * @return
     */
    @Bean
    public DdlApplicationRunner ddlApplicationRunner(@Autowired(required = false) List ddlList) {
        return new DdlApplicationRunner(ddlList);
    }
import com.bderp.common.TrimFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.DispatcherType;
@Configuration
public class FilterConfig {
/**
 * 去除参数头尾空格过滤器
 *
 * @return
 */
@Bean
public FilterRegistrationBean trimFilter() {
    System.out.println("============过滤=================");
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setDispatcherTypes(DispatcherType.REQUEST);
    registration.setFilter(new TrimFilter());
    registration.addUrlPatterns("/*");
    registration.setName("TrimFilter");
    registration.setOrder(1);
    return registration;
}
}
2. 创建过滤器类
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class TrimFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    filterChain.doFilter(new TrimHttpServletRequestWrapper((HttpServletRequest) servletRequest), servletResponse);
}
@Override
public void destroy() {
}
}
3. 创建请求参数过滤类
import com.bderp.utils.JsonTrimUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.StringUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TrimHttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper {
private Map<String , String[]> params = new HashMap<>();
public TrimHttpServletRequestWrapper(HttpServletRequest request) {
    // 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似
    super(request);
    //将参数表,赋予给当前的Map以便于持有request中的参数
    this.params.putAll(request.getParameterMap());
    this.modifyParameterValues();
}
/**
 * 重写getInputStream方法  post类型的请求参数必须通过流才能获取到值
 */
@Override
public ServletInputStream getInputStream() throws IOException {
    System.out.println("data");
    System.out.println("aaaaaaaaaaaaS");
    //非json类型,直接返回
    if(!super.getHeader(HttpHeaders.CONTENT_TYPE).contains(MediaType.APPLICATION_JSON_VALUE)){
        return super.getInputStream();
    }
    //为空,直接返回
    String json = IOUtils.toString(super.getInputStream(), "utf-8");
    if (!StringUtils.hasLength(json)) {
        return super.getInputStream();
    }
    ByteArrayInputStream bis = null;
    try {
        bis = new ByteArrayInputStream(JsonTrimUtils.jsonTrim(json).toJSONString().getBytes());
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return new MyServletInputStream(bis);
}
/**
 * 将parameter的值去除空格后重写回去
 */
public void modifyParameterValues(){
    Set<String> set =params.keySet();
    Iterator<String> it=set.iterator();
    while(it.hasNext()){
        String key= it.next();
        String[] values = params.get(key);
        for (int i = 0; i < values.length; i++) {
            values[i] = values[i].trim();
        }
        params.put(key, values);
    }
}
/**
 * 重写getParameter 参数从当前类中的map获取
 */
@Override
public String getParameter(String name) {
    String[]values = params.get(name);
    if(values == null || values.length == 0) {
        return null;
    }
    return values[0];
}
/**
 * 重写getParameterValues
 */
@Override
public String[] getParameterValues(String name) {//同上
    return params.get(name);
}
class MyServletInputStream extends  ServletInputStream{
    private ByteArrayInputStream bis;
    public MyServletInputStream(ByteArrayInputStream bis){
        this.bis=bis;
    }
    @Override
    public boolean isFinished() {
        return true;
    }
    @Override
    public boolean isReady() {
        return true;
    }
    @Override
    public void setReadListener(ReadListener listener) {
    }
    @Override
    public int read() {
        return bis.read();
    }
}
}
4. 创建过滤工具类
package com.bderp.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONValidator;
import java.util.Iterator;
import java.util.Map;
/**
@Version 1.0
/
public final class JsonTrimUtils {
 /*
构造器
*/
private JsonTrimUtils() {
}
/**
 System.out.println("============data");
 System.out.println(jsonTrim(JSONObject.parseObject(jsonStr)));
 return  jsonTrim(JSONObject.parseObject(jsonStr));
//    /*
//      去除json值前后空格
//      @param json jsonStr
//      @return
//     */
//    public static JSON jsonTrim(JSON json) throws Exception {
//        if (json instanceof JSONObject) {
//            return  jsonTrim(json);
//        } else if (json instanceof JSONArray) {
//            jsonTrimArray((JSONArray) json);
//            return json;
//        }
//        throw new Exception(“非JSON参数”);
//    }
/**
 * 去除value的空格
 *
 * @param jsonObject jsonObject
 * @return
 */
public static JSONObject jsonTrim(JSONObject jsonObject) {
    Iterator<Map.Entry<String, Object>> iterator = jsonObject.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String, Object> next = iterator.next();
        Object value = next.getValue();
        if (value != null) {
            if (value instanceof String) {
                //清空值前后空格
                jsonObject.put(next.getKey(), ((String) value).trim());
            } else if (value instanceof JSONObject) {
                jsonTrim((JSONObject) value);
            } else if (value instanceof JSONArray) {
                jsonTrimArray((JSONArray) value);
            }
        }
    }
    return jsonObject;
}
/**
 * 清空JSONArray 值前后空格
 * @param array
 */
private static void jsonTrimArray(JSONArray array) {
    if (array.size() > 0) {
        for (int i = 0; i < array.size(); i++) {
            Object object = array.get(i);
            if (object != null) {
                if (object instanceof String) {
                    array.set(i, ((String) object).trim());
                } else if (object instanceof JSONObject) {
                    jsonTrim((JSONObject) object);
                } else if (object instanceof JSONArray) {
                    jsonTrimArray((JSONArray) object);
                }
            }
        }
    }
}
}
```
import com.bderp.common.TrimFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.DispatcherType;
@Configuration
public class FilterConfig {
/**
 * 去除参数头尾空格过滤器
 *
 * @return
 */
@Bean
public FilterRegistrationBean trimFilter() {
    System.out.println("============过滤=================");
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setDispatcherTypes(DispatcherType.REQUEST);
    registration.setFilter(new TrimFilter());
    registration.addUrlPatterns("/*");
    registration.setName("TrimFilter");
    registration.setOrder(1);
    return registration;
}
}
2. 创建过滤器类
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class TrimFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    filterChain.doFilter(new TrimHttpServletRequestWrapper((HttpServletRequest) servletRequest), servletResponse);
}
@Override
public void destroy() {
}
}
3. 创建请求参数过滤类
import com.bderp.utils.JsonTrimUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.StringUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TrimHttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper {
private Map<String , String[]> params = new HashMap<>();
public TrimHttpServletRequestWrapper(HttpServletRequest request) {
    // 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似
    super(request);
    //将参数表,赋予给当前的Map以便于持有request中的参数
    this.params.putAll(request.getParameterMap());
    this.modifyParameterValues();
}
/**
 * 重写getInputStream方法  post类型的请求参数必须通过流才能获取到值
 */
@Override
public ServletInputStream getInputStream() throws IOException {
    System.out.println("data");
    System.out.println("aaaaaaaaaaaaS");
    //非json类型,直接返回
    if(!super.getHeader(HttpHeaders.CONTENT_TYPE).contains(MediaType.APPLICATION_JSON_VALUE)){
        return super.getInputStream();
    }
    //为空,直接返回
    String json = IOUtils.toString(super.getInputStream(), "utf-8");
    if (!StringUtils.hasLength(json)) {
        return super.getInputStream();
    }
    ByteArrayInputStream bis = null;
    try {
        bis = new ByteArrayInputStream(JsonTrimUtils.jsonTrim(json).toJSONString().getBytes());
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return new MyServletInputStream(bis);
}
/**
 * 将parameter的值去除空格后重写回去
 */
public void modifyParameterValues(){
    Set<String> set =params.keySet();
    Iterator<String> it=set.iterator();
    while(it.hasNext()){
        String key= it.next();
        String[] values = params.get(key);
        for (int i = 0; i < values.length; i++) {
            values[i] = values[i].trim();
        }
        params.put(key, values);
    }
}
/**
 * 重写getParameter 参数从当前类中的map获取
 */
@Override
public String getParameter(String name) {
    String[]values = params.get(name);
    if(values == null || values.length == 0) {
        return null;
    }
    return values[0];
}
/**
 * 重写getParameterValues
 */
@Override
public String[] getParameterValues(String name) {//同上
    return params.get(name);
}
class MyServletInputStream extends  ServletInputStream{
    private ByteArrayInputStream bis;
    public MyServletInputStream(ByteArrayInputStream bis){
        this.bis=bis;
    }
    @Override
    public boolean isFinished() {
        return true;
    }
    @Override
    public boolean isReady() {
        return true;
    }
    @Override
    public void setReadListener(ReadListener listener) {
    }
    @Override
    public int read() {
        return bis.read();
    }
}
}
4. 创建过滤工具类
package com.bderp.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONValidator;
import java.util.Iterator;
import java.util.Map;
/**
@Version 1.0
/
public final class JsonTrimUtils {
 /*
构造器
*/
private JsonTrimUtils() {
}
/**
 System.out.println("============data");
 System.out.println(jsonTrim(JSONObject.parseObject(jsonStr)));
 return  jsonTrim(JSONObject.parseObject(jsonStr));
//    /*
//      去除json值前后空格
//      @param json jsonStr
//      @return
//     */
//    public static JSON jsonTrim(JSON json) throws Exception {
//        if (json instanceof JSONObject) {
//            return  jsonTrim(json);
//        } else if (json instanceof JSONArray) {
//            jsonTrimArray((JSONArray) json);
//            return json;
//        }
//        throw new Exception(“非JSON参数”);
//    }
/**
 * 去除value的空格
 *
 * @param jsonObject jsonObject
 * @return
 */
public static JSONObject jsonTrim(JSONObject jsonObject) {
    Iterator<Map.Entry<String, Object>> iterator = jsonObject.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String, Object> next = iterator.next();
        Object value = next.getValue();
        if (value != null) {
            if (value instanceof String) {
                //清空值前后空格
                jsonObject.put(next.getKey(), ((String) value).trim());
            } else if (value instanceof JSONObject) {
                jsonTrim((JSONObject) value);
            } else if (value instanceof JSONArray) {
                jsonTrimArray((JSONArray) value);
            }
        }
    }
    return jsonObject;
}
/**
 * 清空JSONArray 值前后空格
 * @param array
 */
private static void jsonTrimArray(JSONArray array) {
    if (array.size() > 0) {
        for (int i = 0; i < array.size(); i++) {
            Object object = array.get(i);
            if (object != null) {
                if (object instanceof String) {
                    array.set(i, ((String) object).trim());
                } else if (object instanceof JSONObject) {
                    jsonTrim((JSONObject) object);
                } else if (object instanceof JSONArray) {
                    jsonTrimArray((JSONArray) object);
                }
            }
        }
    }
}
}
```
今天拉取项目代码时,更新maven发现无法更新,然后查看错误发现pom.xml提示错误和警告信息

解决:根据提示,将项目所在目录添加进入系统的排除项中
需求:前端通过一个输入框,既可以查询学号又可以查询姓名
后端:通过或条件查询
//可以根据学号和姓名模糊搜索
        if(student.getStudentNumber() != null && !student.getStudentNumber().equals("")) {
            lqw.lambda().or(l -> {
                l.like(Student::getStudentNumber, student.getStudentNumber());
            }).or(l -> {
                l.like(Student::getName, student.getStudentNumber());
            });
            student.setStudentNumber(null);
        }
application.yml配置,添加两个数据配置
spring:
  datasource:
    primary:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test001
      username: root
      password: 123456
    # 第二个数据库配置
    second:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test002
      username: root
      password: 123456
添加一个数据库配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "secondDataSource")
    @ConfigurationProperties(prefix="spring.datasource.second")
    public DataSource secondDataSource() {
        return DataSourceBuilder.create().build();
    }
}
测试是否链接成功,尝试写入一条数据
    @GetMapping("test")
    public void test() throws Exception{
        // 创建数据库连接
        Connection connection = secondDataSource.getConnection();
        // 创建SQL语句
        String sql = "INSERT INTO tx_test (name) VALUES (?)";
        // 创建预编译语句
        PreparedStatement label = connection.prepareStatement(sql);
        // 执行语句
        label.setString(1, "4545");
        label.executeUpdate();
        // 关闭连接和语句
        label.close();
        connection.close();
    }

数据库写入成功
当你银行卡有一定的钱后,你可以有选择的做自己喜欢的事情
你的焦虑通常来源于你的存款不足
在学习,有学校的保护,可能不容易知道世界也有险恶的一面
@RequestParam
带@RequestParam时如果前端没有传递参数,会报出一个异常警告提示,所以携带@RequestParam时参数是必传的
@GetMapping("/requestParm")
public R requestParm(@RequestParam Integer id){
    System.out.println("get带@RequestParam:"+id);
    return R.success(id);
}
异常提示:MissingServletRequestParameterException: Required request parameter 'id' for method parameter type Integer is not presen
不带@RequestParam时不管传不传参数,后端都不会报错,此时答应id的结果为null
@GetMapping("/requestParm")
public R requestParm(Integer id){
    System.out.println("get不带@RequestParam:"+id);
    return R.success(id);
}
实体类带上@RequestParam接收参数
同理,带上@RequestParam时,后端也是报了一个异常警告,接口状态码为400
@GetMapping("/requestParm")
public R requestParm(@RequestParam User user){
    System.out.println("get带@RequestParam:"+user.getId());
    return R.success(user);
}
实体类不带@RequestParam接收参数
接口没有报错,获取到的id参数为null
@GetMapping("/requestParm")
public R requestParm(User user){
    System.out.println("get不带@RequestParam:"+user.getId());
    return R.success(user);
}
总结:
1.用实体类接收参数时不能带上@RequestParam,否者接口会报错
2.如果是单个参数时,带上@RequestParam时前端不传参数就会报错,所以建议是不要带上@RequestParam,这样后端可以判断参数,如果参数必填的话应该是提示前端必传参数,而不是接口报错
所以不管是当个参数还是实体类接收参数,,可以都不要带上@RequestParam 。。。
@RestControllerAdvice注解是一个用于全局异常处理的注解,可以用来统一处理所有Controller层的异常。
@Order(index) //定义捕获错误的优先级
import com.bderp.controller.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import javax.servlet.http.HttpServletRequest;
@Slf4j
//@Order(2) //定义捕获错误的优先级
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler{
    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R handlerException(HttpServletRequest request, Exception e){
         //获取报错的控制器
         String controllerName = ex.getStackTrace()[0].getClassName();
         //获取报错行
         int lineNumber = ex.getStackTrace()[0].getLineNumber();
         //获取报错体
         StringWriter sw = new StringWriter();
         PrintWriter pw = new PrintWriter(sw);
         ex.printStackTrace(pw);
         String errorMessage = sw.toString();
         //写入日志文件
         //Logger.error(errorMessage);
        return R.error("错误了" + e.getMessage());
    }
}
引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
application.yml配置
spring:
    mail:
    #邮件发送配置
    host: smtp.qq.com
    port: 587
    username: xxx@qq.com
    password: xxx #邮件秘钥
    nickname: xxx
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
添加一个发送邮件公共方法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
/**
 * 发送邮件公共方法
 */
@Controller
public class MailService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private JavaMailSender sender;
    @Value("${spring.mail.nickname}")
    private String nickname;
    @Value("${spring.mail.username}")
    private String from;
    /**
     * 发送纯文本的简单邮件
     * @param to
     * @param subject
     * @param content
     */
    public void sendSimpleMail(String to, String subject, String content){
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        //邮件发送人
        message.setFrom(nickname+'<'+from+'>');
        try {
            sender.send(message);
            logger.info("邮件已经发送。");
        } catch (Exception e) {
            logger.error("异常!", e);
        }
    }
}
发送邮件通知
//发送邮件通知
mailService.sendSimpleMail("接收的邮件号", "邮件标题","邮件内容")
pom依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>
添加一个redis配置文件
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
    @Value("${spring.redis.host}")
    private String redisHost;
    @Value("${spring.redis.port}")
    private int redisPort;
    @Value("${spring.redis.password}")
    private String redisPassword;
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(redisHost, redisPort);
        config.setPassword(RedisPassword.of(redisPassword));
        return new JedisConnectionFactory(config);
    }
    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(jedisConnectionFactory());
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
application.yml 配置
redis:
    host: localhost
    port: 6379
    password:
读取、设置、删除
写入缓存,并设置10后过期
redisTemplate.opsForValue().set(key, value, 10, TimeUnit.SECONDS);
读取缓存
redisTemplate.opsForValue().get(key);
删除缓存
redisTemplate.delete(key);
@Component
public class MyFilter implements Filter {
    //该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次,这个方法必须执行成功,否则过滤器会不起作用。
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter 前置");
    }
    // 容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter 处理中");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("Filter 处理后");
    }
    // 当容器销毁 过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器 Filter 的整个生命周期也只会被调用一次。
    @Override
    public void destroy() {
        System.out.println("Filter 后置");
    }
}
获取当前年份
//获取当前年份
Calendar cla = Calendar.getInstance();
int year = cla.get(Calendar.YEAR);
获取当前年月日
//获取当前年月日
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = dateFormat.format(date);
@RequestParam:用于从请求参数中获取值,常用于GET请求,可以指定参数的名称和默认值。
@PathVariable:用于从URL路径中获取值,常用于RESTful风格的URL,可以指定参数的名称和默认值。
@RequestBody:用于从请求体中获取值,常用于POST请求,可以将请求体中的数据绑定到方法的参数上。
示例:
接收链接上的参数
@PostMapping("/{currentPage}/{pageSize}")
@NoLoginRequired
public R text(@PathVariable Integer currentPage, @PathVariable Integer pageSize){
}
接收get请求参数
@GetMapping("text")
public R text(@RequestParam Integer id){
}
用HashMap接收json参数
@GetMapping("text")
public R text(@RequestBody HashMap<String, String> student){
    String studentId = student.get("studentId");
    String name = student.get("name");
}
用实体类接收json参数
@PostMapping("text")
public R text(@RequestBody Student student){
    String studentId = student.getStudentId;
    String name = student.getName;
}
我们在做数据按日期汇总的时候,经常需要用到时间查询
获取今日日期
java.util.Date currentDate = new java.util.Date();
     // 创建SimpleDateFormat实例,指定日期格式
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     // 格式化日期为字符串
     String todayDate = dateFormat.format(currentDate);
     return todayDate;
获取昨日日期
java.util.Date currentDate = new java.util.Date();
      //格式化字符串
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     Calendar calendar = Calendar.getInstance();
     calendar.add(Calendar.DAY_OF_MONTH, -1);     //减一天
     return dateFormat.format(calendar.getTime());
获取本周第一天日期
      //格式化字符串
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     Calendar calendar = Calendar.getInstance();
     calendar.set(Calendar.DAY_OF_WEEK, 2);                //本周的第一天,写1获取到的是周日,2获取到的是周一
     return dateFormat.format(calendar.getTime());
获取本月第一天日期
java.util.Date currentDate = new java.util.Date();
     // 创建SimpleDateFormat实例,指定日期格式
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     // 格式化日期为字符串
     String todayDate = dateFormat.format(currentDate);
     return todayDate;
/**
* 数据导出工具类
*/
public class DateUtils {
 //获取今日
 public String getTodayDate(){
     java.util.Date currentDate = new java.util.Date();
     // 创建SimpleDateFormat实例,指定日期格式
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     // 格式化日期为字符串
     String todayDate = dateFormat.format(currentDate);
     return todayDate;
 }
 //获取昨日
 public String getYesterdayDate(){
     //格式化字符串
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     Calendar calendar = Calendar.getInstance();
     calendar.add(Calendar.DAY_OF_MONTH, -1);     //减一天
     return dateFormat.format(calendar.getTime());
 }
 //获取本周第一天
 public String getThisWeekMonDay(){
     //格式化字符串
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     Calendar calendar = Calendar.getInstance();
     calendar.set(Calendar.DAY_OF_WEEK, 2);                //本周的第一天,写1获取到的是周日,2获取到的是周一
     return dateFormat.format(calendar.getTime());
 }
 //获取本月第一天
 public String getThisMonthFirstDay(){
     //格式化字符串
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     Calendar calendar = Calendar.getInstance();
     calendar.set(Calendar.DAY_OF_MONTH, 1);                //本周的第一天,写1获取到的是周日,2获取到的是周一
     return dateFormat.format(calendar.getTime());
 }
}
使用httClients发送post请求
`    
/**
 * 使用httClients发送post请求
 * @param url 请求的url地址
 * @param list 需要发送的请求参数(需要一个ArrList)
 */
public String httpPost(String url, List list) throws Exception {
    CloseableHttpClient httpClient = null;
    CloseableHttpResponse response = null;
    try{
        httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        // 设置请求参数,可通过在接口传入
//            List<NameValuePair> list = new ArrayList<>();
//            list.add(new BasicNameValuePair("param1", "value1"));
//            list.add(new BasicNameValuePair("param2", "value2"));
        UrlEncodedFormEntity params = new UrlEncodedFormEntity(list, "UTF-8");
        //设置请求参数
        httpPost.setEntity(params);
        //发送http请求
        response = httpClient.execute(httpPost);
        //判断响应状态码
        if(response.getStatusLine().getStatusCode() == 200){
            //响应数据
            HttpEntity entity = response.getEntity();
            //将响应数据以字符串方式展示
            String html = EntityUtils.toString(entity, "UTF-8");
            return html;
        }
        //失败
        return "error";
    } catch (Exception exception){
        exception.printStackTrace();
        throw new Exception(exception.getMessage());
    }finally {
        try{
            //关闭资源
            httpClient.close();
            response.close();
        } catch (IOException e){
            //e.printStackTrace()方法介绍
            //当Java程序抛出异常时,它会在调用堆栈中创建一个异常对象并将其抛出。使用e.printStackTrace()方法可以打印出这个异常对象所在的调用堆栈,包括哪个类的哪个方法抛出了异常,以及异常被传播的路径。
            e.printStackTrace();
            throw new Exception(e.getMessage());
        }
    }
}`
发送get请求
public String httpGet(){
    //get请求直接写在地址拼接 (栗子:http://www.baidu.com?name=zhangsan&age=18)
    String url = "http://www.ttxtc.com";
    CloseableHttpClient httpClient = null;
    CloseableHttpResponse response = null;
    try{
        httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        //发送http请求
        response = httpClient.execute(httpGet);
        //判断响应状态码
        if(response.getStatusLine().getStatusCode() == 200){
            //响应数据
            HttpEntity entity = response.getEntity();
            //将响应数据以字符串方式展示
            String html = EntityUtils.toString(entity, "UTF-8");
            return html;
        }
    } catch (Exception exception){
        exception.printStackTrace();
    }finally {
        try{
            //关闭资源
            httpClient.close();
            response.close();
        } catch (IOException e){
            //e.printStackTrace()方法介绍
            //当Java程序抛出异常时,它会在调用堆栈中创建一个异常对象并将其抛出。使用e.printStackTrace()方法可以打印出这个异常对象所在的调用堆栈,包括哪个类的哪个方法抛出了异常,以及异常被传播的路径。
            e.printStackTrace();
        }
    }
}`
现在需要获取List<Integer>中的某个值
List<String> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
#报错语句
list.get(10)
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IndexOutOfBoundsException: Index 13 out of bounds for length 1] with root cause
尝试使用list.get(10)去获取值list.get(10)实际获取的是索引为10的值,已经操作了list的长度,所以报错
判断List对象是否包含某元素的方法有
现在有一个map对象,需要遍历所有元素进行操作
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + ": " + value);
}
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
map.forEach((key, value) -> System.out.println(key + ": " + value));
1、foreach是只读的,在取的时候数据不能变(包括修改,删除,添加等)。要避免这个问题,就应该使用for循环。
2、foreach属于迭代器,迭代循环。只能按序依次遍历完成,不支持中断行为。break和contine会报错,return虽然不会报错,但是不会返回。
3、for循环是可以中断循环(利用break语句或return语句,continue)
4、for可以认为指定关于循环的起点,foreach循环起点只能从0开始