MyBatis

一线大厂面试必问的4大框架源码,该如何学习?

寵の児 提交于 2020-12-01 14:55:47
对于开发来说,我们在工作中普遍都会用到各个开源框架,比如最基础的 Spring,使开发网络编程变得特别简单的 Netty 框架,还有成为目前微服务框架首选的 Spring Cloud 等。在多个框架之上,我们仅需使用几行代码,即可实现业务需要的复杂功能,大大减少了工作量。 也正因如此,不少人只会用框架,看不懂源码,不了解其底层机制与实现原理,成了一名只会搬运源码库的开发。说白了,就是真正牛逼的技术不属于你。 整理了最新2020整理收集的一线互联网公司面试真题(都整理成文档),有很多干货,包含netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,我感觉在面试这块讲的非常清楚: 获取面试资料只需: 点击这里领取!!! 暗号:CSDN 可了解框架中的很多知识和代码,对解决开发中的类似问题是极其有帮助的。因为它们是经过时间验证和优化过的,如:MyBatis 的架构设计、Dubbo 的服务发现机制、Spring 的设计模式等。所以,对源码和开源库的学习,成了 Java 开发者提升技能的必经之路。 想给大家看一张图「开源框架学习知识图」,包含了 Java 工程师一定要花时间学会的四大开源框架–MyBatis、Spring、Spring MVC、Spring Boot,清晰了解学习每个框架所需要的知识点。(ps:有兴趣的可以直接领取高清版图谱)

LeetCode55|二叉树的层次遍历II

孤人 提交于 2020-12-01 02:00:53
1,问题简述 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 2,示例 例如: 给定二叉树 [ 3 , 9 , 20 , null , null , 15 , 7 ], 3 / \ 9 20 / \ 15 7 返回其自底向上的层次遍历为: [ [15,7 ], [ 9,20 ], [ 3 ] ] 3,题解思路 队列的使用 4,题解程序 import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class LevelOrderBottomTest { public static void main (String[] args) { TreeNode t1 = new TreeNode( 3 ); TreeNode t2 = new TreeNode( 9 ); TreeNode t3 = new TreeNode( 20 ); TreeNode t4 = new TreeNode( 15 ); TreeNode t5 = new TreeNode( 7 ); t1.left = t2; t1.right = t3; t3.left = t4; t3.right

SpringBoot Redis 订阅发布

馋奶兔 提交于 2020-12-01 01:58:07
一 配置application.yml spring: redis: jedis: pool: max -active: 10 min -idle: 5 max -idle: 10 max -wait: 2000 port: 6379 host: 192.168.1.88 timeout: 1000 二 实现监听 package com.example.demo.common; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.stereotype.Component; /** * @author Tyler * @date 2019/7/11 */ @Component public class RedisMessageListener implements MessageListener { @Override public void onMessage(Message message, byte [] bytes) { String body = new String(message.getBody()); String

Mybatis中mapper的xml解析详解

牧云@^-^@ 提交于 2020-11-30 23:41:04
上一篇文章分析了 mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder。 基础介绍 回顾下之前是在分析 configuration的初始化过程,已经进行到了最后一步mapperElement(root.evalNode("mappers")),这个方法里有两种解析mapper的方法,一种是解析类,一种是解析xml文件,上一篇文章在讲解析类中的注解,今天说到的就是解析xml的流程,关键代码如下: 解析 mapper有4种情况可以分成根据类解析和根据xml文件解析两类,这次是后面这类,主体方法还是比较简单。 首先根据 inputStream, configuration, resource或url, configuration.getSqlFragments()四个参数初始化一个XMLMapperBuilder; 然后执行 XMLMapperBuilder对象的parse方法; 初始化 XMLMapperBuilder 初始化过程源码已在上图的右侧部分,初始化 XMLMapperBuilder方法的流程与加载mybatis的配置文件关键类XMLConfigBuilder及其相似,都是通过xml文件创建XPathParser对象作为XMLMapperBuilder对象的parse属性

Mybatis核心代码梳理

拈花ヽ惹草 提交于 2020-11-30 23:23:31
mybatis核心流程三大阶段: Mybatis的初始化: MyBatis建造者类图: XMLConfigBuilder: 主要负责解析mybatis-config.xml; XMLMapperBuilder: 主要负责解析映射配置文件; XMLStatementBuilder: 主要负责解析映射配置文件中的SQL节点; 映射器关键类 Configuration : Mybatis启动初始化的核心就是将所有xml配置文件信息加载到Configuration对象中, Configuration是单例的,生命周期是应用级的; MapperRegistry:mapper接口动态代理工厂类的注册中心。在MyBatis中,通过mapperProxy实现InvocationHandler接口,MapperProxyFactory用于生成动态代理的实例对象; ResultMap:用于解析mapper.xml文件中的resultMap节点,使用ResultMapping来封装id,result等子元素; MappedStatement:用于存储mapper.xml文件中的select、insert、update和delete节点,同时还包含了这些节点的很多重要属性; SqlSource:mapper.xml文件中的sql语句会被解析成SqlSource对象

一次SQL注入导致的"越权"

旧巷老猫 提交于 2020-11-30 14:57:05
原文来自 SecIN社区 —作者:tkswifty 相关背景   在实际的业务开发中,SQL交互往往是业务系统中不可或缺的一项。在Java中提供了类似Mybatis、Hibernate、SpringData JPA等来满足相关的数据库交互需要。但是由于种种原因,开发人员在处理应用程序和数据库交互时,使用字符串拼接的方式构造SQL语句,导致了SQL注入问题。那么有时候面对大量的接口存在SQL注入,迭代困难的时候,过滤器/拦截器便是很多开发人员的首选,通过过滤相关的SQL关键字,避免SQL注入得到进一步利用。   针对上述场景,很多时候需要加检查过滤器设计是否严谨,检查是否有漏网之鱼,导致SQL注入漏洞被攻击者进行利用。前段时间审计某项目时发现一处SQL注入导致的"越权",以下是相关的过程。 挖掘过程   系统基于SpringMVC进行开发,业务主要是与简历编辑相关。相关的问题接口主要在修改个人简历处。一般来说,这种修改个人信息的业务,除了修改内容以外,主要传递两个关键信息: 当前用户的身份凭证userId 当前用户的业务编号(这里是简历),resumeId   在进行接口业务请求时,将业务相关的关键参数userid聪当前用户的身份凭证(一般是session)获取,绑定个人用户身份,然后从前端获取需要修改的resumeId,最后在保存信息进行SQL交互时

【Mybatis 源码】openSession获取sqlSession

∥☆過路亽.° 提交于 2020-11-30 12:05:19
openSession获取sqlSession 流程图 openSessionFromDataSource Executor的创建 Executor 获取DefaultSqlSession对象 这一节 我们看defaultSqlSessionFactory对象的openSession()方法的具体过程 调用的方法是openSessionFromDataSource()方法 首先从configuration中拿到默认的Executor类型 this . configuration . getDefaultExecutorType ( ) 流程图 openSessionFromDataSource openSessionFromDataSource方法先是获取了一些信息,然后创建了一个Executor Executor的创建 openSessionFromDataSource方法通过这一句创建Executor Executor executor = this . configuration . newExecutor ( tx , execType ) ; newExecutor方法: 根据Executor在全局配置的类型(SIMPLE/REUSE/BATCH) 创建相应的Executor 如果有二级缓存则包装executor,但实际执行增删改查的还是包装之前的executor

Mybatis 的常见面试题

岁酱吖の 提交于 2020-11-29 04:59:33
1、#{}和${}的区别是什么? #{}是预编译处理,${}是字符串替换。 Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; Mybatis在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止SQL注入,提高系统安全性。 2、当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致 < select id=”selectorder” parametertype=”int” resultetype=” me.gacl.domain. order”> select order_id id, order_no orderno ,order_price price form orders where order_id= #{id}; </ select> 第2种: 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系 < select id= "getOrder" parameterType= "int" resultMap= "orderresultmap"> select * from orders where order_id=#{id} </ select> < resultMap type=

mybatis(错误一) 项目启动时报“Result Maps collection already contains value forxxx”的解决方案

拟墨画扇 提交于 2020-11-29 04:36:21
mybatis(错误一) 项目启动时报“Result Maps collection already contains value forxxx”的解决方案 参考文章: (1)mybatis(错误一) 项目启动时报“Result Maps collection already contains value forxxx”的解决方案 (2)https://www.cnblogs.com/cristin/p/7771795.html 备忘一下。 来源: oschina 链接: https://my.oschina.net/u/4437884/blog/4660134