1.获取前一天的0点到24点的时间,并转换为时间戳
Calendar calendar = Calendar.getInstance();
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)-1,0,0,0);
long timeStart = calendar.getTime().getTime();
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH),23,59,59);
long timeEnd = calendar.getTime().getTime();
2.将json格式中的List转换为对象
//将获取的data转字符串后再转json,最后将list取出,利用fastjson转换成集合对象
String data = String.valueOf(result.get("data"));
JSONObject jsonObject = JSONObject.parseObject(data);
String callRecordList = JSONArray.toJSONString(jsonObject.get("list"));
List<CallRecordDTO> callRecordDTOS = JSONArray.parseArray(callRecordList, CallRecordDTO.class);
3.base64数据加密
String base64=Base64.getEncoder().encodeToString(body.toString().getBytes());
4.restTemplate请求
测试用例,通过postForEntity
来进行post请求获得整个请求信息,包括响应头、响应体、响应状态
Student student=new Student();
student.setName("dwj");
student.setAge(10);
HttpHeaders headers=new HttpHeaders();
headers.setContentType(MediaType.valueOf(String.valueOf(ContentType.JSON)));
HttpEntity<Student> request=new HttpEntity<>(student,headers);
RestTemplate restTemplate=new RestTemplate();
ResponseEntity<Student> responseEntity= restTemplate.postForEntity("http://localhost:8083/workLog/dwj",request,Student.class);
// System.out.println(responseEntity.toString());
System.out.println(responseEntity.getBody());
System.out.println(responseEntity.getStatusCode());
System.out.println(responseEntity.getStatusCodeValue());
System.out.println(responseEntity.getHeaders());
5.集合、数组转JSON
记录一下,防止以后忘记,今天在操作集合转json的时候出现了无法转换的问题,最后通过转成字符串结束.
String rq=JSONObject.toJSONString(body);
6.Fastjson
将json字符串转换为具体对象
Person newPerson = JSON.parseObject(jsonObject, Person.class);
7.复制对象
浅拷贝,可以指定参数不拷贝
BeanUtils.copyProperties(dc,dto,"presRatio");
8.反射和springboot从配置中获取信息
在java练习中,学到了反射以及从配置文件中获取参数
//获取配置文件中配置的参数
Properties pro=new Properties();
ClassLoader classLoader = test.class.getClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
pro.load(resourceAsStream);
String className=pro.getProperty("className");
String name=pro.getProperty("name");
//获取类
Class classs=Class.forName(className);
//新建对象
Constructor constructor = classs.getConstructor();
Object o = constructor.newInstance();
//获取方法
Method eat = classs.getDeclaredMethod(name);
//强制访问
eat.setAccessible(true);
//执行
eat.invoke(o);
获取properties文件中的参数
@Autowired
private Environment env;
env.getProperty()
9.解决反射Service层,注入失败的问题。
使用 @PostConstruct
修饰的方法会在服务器加载servlet的时候运行,并且只会被服务器调用一次。被此修饰的方法会在构造函数之后,init之前运行
@Service
public class Service {
@Autowired
private Mapper mapper;
//新增静态变量
public static Service proxy;
@PostConstruct
public void init() {
proxy = this;
}
//更新数据库
proxy.mapper.update();
}
10.动态MyBatis Dynamic SQL
11.将json数组转换为对象和使用stream分页
//将json转换成对象
List<PatRegRecordDTO> jsonArray=JSONArray.parseArray(JSONArray.toJSONString(hisResult.getData()),PatRegRecordDTO.class);
//使用stream分页
List<PatRegRecordDTO> result=jsonArray.stream().skip(pageSize*(pageIndex-1)).limit(pageSize).collect(Collectors.toList());
12.时间戳
判断两个时间戳相差时间(单位:分钟)
Long s = (System.currentTimeMillis() - hqtime) / (1000 * 60);
13.map转json和json转map工具类
解决map和json互转问题
public class JsonUtil {
@SuppressWarnings("unchecked")
public static Map<String, Object> json2Map(String json) {
return JSON.parseObject(json, Map.class);
}
public static String obj2JsonString(Object obj) {
return JSON.toJSONString(obj);
}
public static void main(String[] args) {
Map<String,Object> map=new HashMap<>();
map.put("name","张三");
System.out.println(obj2JsonString(map));
}
}
14.sql注意
- lejt join 左边过滤必须放where中,右表过滤必须放on中
- 连接不要超过3表以上
- 字符串长度确定,采用char类型
- 如果varchar不满足容量,使用text,如果使用text类型需要单独建表
- 精度要求高的使用decimal
- 尽量使用timestamp(4字节)而非datetime(8字节)
- 操作符<>优化 利用union all解决or索引无法命中
- or优化 利用union解决or索引无法命中
- in主表大子表小 exist主表小子表大
- limit 优化 缩小扫描范围
- like 前匹配条件尽量不用
- 不做列运算 少用select all
15.message from server: "Host ‘XXXX’ is blocked because of many connection errors
数据库多次 错误连接 造成 屏蔽了当前ip连接数据库的请求
解决方案
选中数据库----刷新----权限(亲测可用)
16.查看和修改Linux的时间
- 查看时间和日期
命令 : “date” - 设置时间和日期
例如:将系统日期设定成2009年11月3日的命令
命令 : “date -s 11/03/2009”
将系统时间设定成下午5点55分55秒的命令
命令 : “date -s 17:55:55” - 将当前时间和日期写入BIOS,避免重启后失效
命令 : “hwclock -w”
注:
date
不加参数可以直接看到当前日期时间
cal
不加参数可以直接看到本月月历
17.请求传值为空org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing:
测试切换容器后成功
18.swagger3.0 maven配置
pom
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
配置
/**
* Swagger2API文档的配置
*/
@Configuration
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.macro.mall.tiny.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("SwaggerUI演示")
.description("mall-tiny")
.contact(new Contact("macro", null, null))
.version("1.0")
.build();
}
}
访问地址
访问地址:http://localhost:8088/swagger-ui/
参考文献:
[https://mp.weixin.qq.com/s/zxgSzME4gdvXo9FKSGaMfg]:
19.vue 格式化后自动给代码加“;”,解决方案
在项目根目录创建文件.prettierrc,然后添加代码如下
{
“semi”: false,
“singleQuote”: true
}
20.linux安装npm
1.下载nodejs
wget https://nodejs.org/dist/latest-v9.x/node-v9.11.2-linux-x86.tar.xz
2.解压
tar -xvf node-v9.11.2-linux-x86.tar.xz
3.配置软连接
格式:ln -sf 源文件 目标文件 注:-sf 覆盖
ln -sf /home/node-v9.11.2-linux-x86/bin/node /usr/local/bin
ln -sf /home/node-v9.11.2-linux-x86/bin/npm /usr/local/bin
参考文章:
https://www.jianshu.com/p/21e42cd362e7
https://blog.csdn.net/donglynn/article/details/72911061
https://www.cnblogs.com/liuqi/p/6483317.html
其他知识:
rm -rf 删除文件
tar -xvf 解压
21.grep命令使用,查看部署在linux系统上的日志
查看 区间在2020-11-19 08:00:00 到 2020-11-19 08:59:59的日志
grep -E '2020-11-19 08:[0-5][0-9]:[0-5][0-9]' nohup.out
22.aop切面编程出现错误warning no match for this type name: com.springboottest.demo [Xlint:invalidA
出错原因:
execution 表达式未学习透彻,导致运行出错
原代码:有错误的excution表达式
execution(* com.springboottest.demo.controller.*(..))
更改后:controller包及其子包下的所有方法的执行
execution(* com.springboottest.demo.controller.*.*(..))
参考文章:
execution 表达式详解:https://blog.csdn.net/qq_23167527/article/details/78623434
Spring切面编程错误:https://www.baidu.com/link?url=wsKKCFhQ5iEGfAX3wdBLAxuEQTsB9tY7azm7mnMl54c2Osti3DZ44428q0jjyc0hBfSI1Qs7DdTYrnRBQSGIN66ApMZG3voLFCm-FcNZy9y&wd=&eqid=b2e89fa600185b0b000000045fb6251e
23.过滤器、拦截器、aop
过滤器
过滤器依赖于servlet容器,属于servlet容器的规范,基于servlet容器的回调,几乎过滤所有请求,生命周期由servlet管理
代码
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<UserFilter> registrationBean(){
FilterRegistrationBean<UserFilter> registration=new FilterRegistrationBean<UserFilter>();
registration.setFilter(new UserFilter()); //注册自定义过滤器
registration.addUrlPatterns("/*"); //过滤所有url请求
registration.setName("UserFilter"); //过滤器名称
registration.setOrder(6); //优先级,越低越优先
return registration;
}
}
public class UserFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
System.out.println(httpServletRequest.getRequestURI());
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
System.out.println("destory");
}
}
拦截器
拦截用户请求,并做相应处理。可以应用在权限处理、记录请求信息日志、判断用户登录等
代码
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> urlList=new ArrayList<>();
urlList.add("/api/swagger-ui/");
urlList.add("/print");
registry.addInterceptor(new InterceptorConfig()).addPathPatterns("/user/**");
}
}
public class InterceptorConfig implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
aop
切面,用于打印接口请求日志和返回请求数据日志
代码
@Order(1)
@Aspect
@Component
public class MyAspect {
/**
* 引入新的类来增强服务
* value:指向要增强的目标对象
* defaultImpl:引入增强功能的类
*/
@DeclareParents(
value = "com.springboottest.demo.service.serviceImpl.UserServiceImpl",
defaultImpl = UserValidatorImpl.class
)
public UserValidator userValidator;
@Pointcut("execution(* com.springboottest.demo.controller.*.*(..))")
public void pointCut(){
}
// @Around("pointCut()")
// public void around(ProceedingJoinPoint jp) throws Throwable {
// System.out.println("around before............");
// jp.proceed();
// System.out.println("around after...................");
// }
@Before("pointCut() && args(user)")
public void before(JoinPoint joinPoint, User user) {
System.out.println(user);
System.out.println("before1..................");
}
@After("pointCut()")
public void after() {
System.out.println("after1..................");
}
@AfterReturning("pointCut()")
public void afterReturning() {
System.out.println("afterReturning1..................");
}
@AfterThrowing("pointCut()")
public void afterThrowing() {
System.out.println("afterThrowing1......................");
}
}
文中的代码,都是练习用的,和网上很多文章差不多,营养不多。只供复习时翻阅。