Spring mvc的执行流程
Spring mvc的执行流程详细步骤123456781. 请求到达 DispatcherServlet2. DispatcherServlet 根据 URL 查找 HandlerMapping3. HandlerMapping 找到合适的 Controller4. 调用 Controller 中的方法处理请求5. Controller 返回 ModelAndView6. DispatcherServlet 调用 ViewResolver 解析视图7. 渲染视图并返回给客户端8. 请求结束
DispatcherServlet 源码解析12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182protected void doDispatch(HttpServletRequest request, HttpServletResponse ...
ArrayList数组
ArrayList数据结构底层数据接口是根据动态数组存储数据,根据System.arraycopy()方法去动态扩容。
ArrayList和LinkedList对比
因为底层数据结构是数组,所以获取元素的很快,但新增元素或删除元素时,如果涉及到数组拷贝则效率会很慢,所以在使用时最好指定数组的长度,防止频繁的进行数组的拷贝,如果频繁的进行删除和新增则可以使用LindekList进行存储数据,因为LinkedList底层是双向链表,只需要改变上一个元素或下一元素的指向则可进行删除和新增,效率会比ArrayList更高
因为底层数据结构的不同,占用的空间会小于LinkedList 但ArrayList每次扩容大小都是当前数组长度的1.5倍,所以会浪费内存空间
所以如果你对内存占用敏感并且频繁访问元素,ArrayList 可能是更好的选择。如果你频繁插入和删除元素,尤其是在中间位置,LinkedList 会更适合
核心字段
字段
含义
代码
DEFAULT_CAPACITY
默认大小
private static final int DEFAULT_CAPACITY = ...
Lambda和Stream
1.lambdalambda允许把函数作为方法的入参。精简了代码量
lambda格式123无参:()-{doSomething}单个参数:(param)->{doSomething} 或 param->{doSomething}俩个参数:(param1,param2)->{doSomething}
lambda示例123456789101112131415161718192021222324// 1.7之前线程创建new Thread(new Runnable() { @Override public void run() { System.out.println("线程创建"); }}).start();// 1.8使用lambda线程创建// 无参new Thread(() -> System.out.println("线程创建-lambda")).start();/ ...
Excel下拉框限制
使用easypoi导出12345678910111213ExportParams exportParams = new ExportParams("title", "sheetName", ExcelType.XSSF);exportParams.setCreateHeadRows(true);String[] strings = new String[]{"李四", "王五", "小明"};int firstCol = 2;int lastCol = 2;ArrayList<User> list = new ArrayList<>();Workbook workbook = ExcelExportUtil.exportExcel(exportParams, User.class, list);selectList(workbook, 2, 65535, 3, 3, strings, 1);EasyExcelUtils.downLoadExce ...
MVCC多版本并发控制
MVCC多版本并发控制隐藏字段DB_TRX_ID最近修的事务id,记录创建这条记录或最新一次记录的事务id
DB_ROLL_PTR(存储的是内存地址)回滚指针,指向这条记录的上个版本,用于配合undolog,回滚到上一个版本
DB_ROW_ID隐藏的主键,如果没有主键则innodb会自动创建一个tow_id
ReadView(快照读)才会使用mvcc最普通不加锁的select查询
数据结构m_ids:当前活跃的事务编号集合min_trx_id:最小的活跃事务编号max_trx_id:最大的活跃事务编号creator_trx_id:readview创建者的事务编号
RC(读已提交):每次查询会生成新的ReadView01.png)02.png)RR(可重复读)仅在第一个查询时候创建ReadView,后续快照读复用两次快照读之前存在当前读,在会重新生成ReadView,会导致幻读
当前读加锁的select查询
Git命令清单
下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库
新建代码库在当前目录新建一个Git代码库1git init
新建一个目录,将其初始化为Git代码库1git init [project-name]
下载一个项目和它的整个代码历史1git clone [url]
配置Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
显示当前的Git配置1git config --list
编辑Git配置文件1git config -e [--global]
设置提交代码时的用户信息1git config [--global] user.name "[name]"
1git config [--global] user.email "[email address]"
增加/删除文件添加指定文件到暂存区1git add [file1] [file2] . ...
Mysql in和exists的区别
相同点in和exists都是用于范围查找
123SELECT * from t_user AS 外表 WHERE EXISTS (select b.user_id FROM t_user_org 内表 WHERE a.user_id =b.user_id);SELECT * from t_user AS 外表 WHERE a.user_id in (select b.user_id FROM t_user_org 内表 );
不同点
in是把外表和内表做hash链接,先查询内表(b表)返回数据列,在将返回的数据列给外表(a表)做比较,无论子表是否有数据都对子查询进行全部匹配
exists是对外表做loop循环,循环后在对内表进行查询,将外表查询的接口放到exists中做条件验证,根据验证结果true和false来过滤数据,如果有一个存在则返回外表所有数据
外表查询结果集大的用in,内表查询结果集大的用exstis
idea常用插件
Key Promoter X在右下角弹出和鼠标相同操作的idea快捷键
Translation翻译工具可使用谷歌翻译(默认),百度翻译,有道翻译快捷键:Ctrl+Alt+Y,翻译选中的文字Ctrl+Alt+X,将选中的文字替换为翻译后的文件
.ignore忽略文件,防止误提交
GsonFormatPlus可以根据JSON生成实体类快捷键:Alt+S
MyBatisCodeHelperPro (Marketplace Edition)mybatis.xml和dao层可以互相跳转可以根据dao层的方法名自动生成mybatis.xml的配置
MyBatis Log Plugin (已收费,可免费试用30天)可以将输出在控制台的mybatis的sql日志格式化可以直接执行的sql;也可以使用这个插件达到相同的功能需要自动导入改插件,地址:https://github.com/Link-Kou/intellij-mybaitslog
Alibaba Java Coding Guidelines阿里巴巴代码规范插件
CodeGlance代码略缩图
Free Mybatis plugin可以自由的在 ...
live Template 模板
restMapping
12@org.springframework.web.bind.annotation.RestController@org.springframework.web.bind.annotation.RequestMapping("/$END$")
slf4jslf4j生成slf4j方法
1private static final org.slf4j.Logger LOGGER = org.slf4j.LoggerFactory.getLogger($ClassName$.class);
anno生成原注解需要的基本注解
123@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD})@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)@java.lang.anno ...
mybatis源码解析
架构图
流程图
配置读取SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder读取配置文件生成SqlSessionFactory
1234567891011121314151617public SqlSessionFactory build(Reader reader, String environment, Properties properties) { try { // xml属性解析 XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties); // 从xml配置文件中获取生成sqlSessionFactory需要的配置信息 return build(parser.parse()); } catch (Exception e) { throw ExceptionFactory.wrapException("Error b ...