本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到个人仓库里查看html
喜欢的话麻烦点下Star哈java
文章首发于个人我的博客:python
www.how2playlife.commysql
本文是微信公众号【Java技术江湖】的《走进JavaWeb技术世界》其中一篇,本文部份内容来源于网络,为了把本文主题讲得清晰透彻,也整合了不少我认为不错的技术博客内容,引用其中了一些比较好的博客文章,若有侵权,请联系做者。git
该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中常常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,造成本身的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每一个知识点对应的面试题以及参考答案。程序员
若是对本系列文章有什么建议,或者是有什么疑问的话,也能够关注公众号【Java技术江湖】联系做者,欢迎你参与本系列博文的创做和修订。github
文末赠送8000G的Java架构师学习资料,须要的朋友能够到文末了解领取方式,资料包括Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送做者原创的Java学习指南、Java程序员面试指南等干货资源)面试
<!-- more -->spring
在mybatis的基础知识中咱们已经能够对mybatis的工做方式窥斑见豹(参考:《MyBatis————基础知识》)。
可是,为何还要要学习mybatis的工做原理?由于,随着mybatis框架的不断发展,现在已经愈来愈趋于自动化,从代码生成,到基本使用,咱们甚至不须要动手写一句SQL就能够完成一个简单应用的所有CRUD操做。
从原生mybatis到mybatis-spring,到mybatis-plus再到mybatis-plus-spring-boot-starter。spring在发展,mybatis一样在随之发展。
万变的外表终将迷惑人们的双眼,只要抓住核心咱们永远不会迷茫!
用最直观的图,来征服你的心!
mybatis应用程序经过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也能够用Java文件配置的方式,须要添加@Configuration)中构建出SqlSessionFactory(SqlSessionFactory是线程安全的);
而后,SqlSessionFactory的实例直接开启一个SqlSession,再经过SqlSession实例得到Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,以后关闭SqlSession。
说明:SqlSession是单线程对象,由于它是非线程安全的,是持久化操做的独享对象,相似jdbc中的Connection,底层就封装了jdbc链接。
详细流程以下:
一、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。
二、SqlSessionFactoryBuilder经过Configuration对象生成SqlSessionFactory,用来开启SqlSession。
三、SqlSession对象完成和数据库的交互: a、用户程序调用mybatis接口层api(即Mapper接口中的方法) b、SqlSession经过调用api的Statement ID找到对应的MappedStatement对象 c、经过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象 d、JDBC执行sql。
e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情:
MyBatis的主要设计目的就是让咱们对执行SQL语句时对输入输出的数据管理更加方便,因此方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。
MyBatis框架和其余绝大部分框架同样,须要一个配置文件,其配置文件大体以下:
<configuration> <settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="false"/> <!--<setting name="logImpl" value="STDOUT_LOGGING"/> <!– 打印日志信息 –>--> </settings> <typeAliases> <typeAlias type="com.luo.dao.UserDao" alias="User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!--事务管理类型--> <dataSource type="POOLED"> <property name="username" value="luoxn28"/> <property name="password" value="123456"/> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.1.150/ssh_study"/> </dataSource> </environment> </environments> <mappers> <mapper resource="userMapper.xml"/> </mappers> </configuration>
以上配置中,最重要的是数据库参数的配置,好比用户名密码等,若是配置了数据表对应的mapper文件,则须要将其加入到<mappers>节点下。
以上主要成员在一次数据库操做中基本都会涉及,在SQL操做中重点须要关注的是SQL参数何时被设置和结果集怎么转换为JavaBean对象的,这两个过程正好对应StatementHandler和ResultSetHandler类中的处理逻辑。
<sub>(图片来自《深刻理解mybatis原理》 MyBatis的架构设计以及实例分析)</sub>
https://www.jianshu.com/p/e398435fc1c4 https://segmentfault.com/a/1190000015117926?utm_source=tag-newest#articleHeader4 http://www.javashuo.com/article/p-nqvtutzj-hq.html http://www.javashuo.com/article/p-eawdggfh-bg.html http://www.javashuo.com/article/p-yhnqmtzv-hx.html
黄小斜是跨考软件工程的 985 硕士,自学 Java 两年,拿到了 BAT 等近十家大厂 offer,从技术小白成长为阿里工程师。
做者专一于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得和程序人生,目前黄小斜的CSDN博客有百万+访问量,知乎粉丝2W+,全网已有10W+读者。
黄小斜是一个斜杠青年,坚持学习和写做,相信终身学习的力量,但愿和更多的程序员交朋友,一块儿进步和成长!
原创电子书: 关注微信公众号【黄小斜】后回复【原创电子书】便可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助不少的程序员拿到了心仪的offer!
程序员3T技术学习资源: 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 “资料” 便可免费无套路获取,包括Java、python、C++、大数据、机器学习、前端、移动端等方向的技术资料。
若是你们想要实时关注我更新的文章以及分享的干货的话,能够关注个人微信公众号【Java技术江湖】
这是一位阿里 Java 工程师的技术小站。做者黄小斜,专一 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!
(关注公众号后回复”Java“便可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送做者原创的Java学习指南、Java程序员面试指南等干货资源)
Java工程师必备学习资源: 一些Java工程师经常使用学习资源,关注公众号后,后台回复关键字 “Java” 便可免费无套路获取。