Mybatis工作原理?
2017-09-05 19:53
204 查看
简单来说,他跟你直接用一个sqlUtil的实现是一样,只不过很多复杂的util优化的事情,提前有其他程序员做了。
Mybatis是一个映射封装,他与你用util的区别就是,他将在代码块中的sql存在统一的xml文件也就是sqlmaper中。
同时他将你执行sql的传参也就是执行变量进行了通配,然后映射到你的model中。
Mybatis大概的执行过程:
通过factory方法获取sqlsession----通过MapperProxy代理到dao--执行底层数据库操作,
简单说就是跟楼上说的“据经过controller 再经过service 然后执行service中的相关方法并关联到mapper 再执行mapper.xml中的sql语句===
我们以JDBC为例看看他们的区别:
JDBC:
(1) 加载JDBC驱动,建立并获取数据库连接 ,创建statement对象(2) 设置SQL语句的传入参数(3) 执行SQL语句并获得查询结果(4) 对查询结果进行转换处理并将处理结果返回(5) 释放资源Mybatis:1:使用连接池,datasource,在驱动并连接的这个过程中优化并解耦JDBC第一步其实从效率角度来看是不合适的,因为无论什么数据库都不可能支撑随机和庞大的连接数,而且不可避免的存在连接浪费的情况,Mybatis就封装了这些优化的方法。2:统一sql存取到XML如果代码写在java块中,在团队合作中很可能出现两个交叉业务的代码使用类似的sql语句,而开发人员的工作本身没有交集,那就代表sql语句肯定是无法复用的。而且对sql的修改,就代表着对java文件的修改,需要重新编译和打包部署(比如常见的状态值更改,sql修改随着业务变化必然存在修改)。mybatis将sql统一存取到xml中,就算存在业务交叉,但因为统一配置的缘故,sql在xml中一目了然,两个跨team的程序员可以看到对方的sql,来判断自己是否需要重用。并且使用xml配置可以减少代码编译。还有就是在java中拼写长sql太恶心了。3:参数和结果集映射sql的方式需要传入参数,如果存在多条件“或类型”的查询(列表查询的查询条件允许空),那就代表你必须传参进行sql拼接,就算使用xml的方式也不行。要么每个业务独立配置xml中的sql,要么还是写入java代码中,或者以工具的方式进行自动拼接。Mybatis使用映射的方式,方便model管理参数,同时以解析器的方式将参数动态拼接到sql(sqlmaper里那些标签),由于是model映射,连查询结果都可以统一映射,方便取出和运算。而且mybatis对查询结果集进行了缓存处理,使得重复查询进一步进行了优化。4:对多重复sql进行复用封装比如模板方法,将常用sql模块化,直接调用。比如通用的save和getID之类的,只有表名和字段名有变化。
Mybatis是一个映射封装,他与你用util的区别就是,他将在代码块中的sql存在统一的xml文件也就是sqlmaper中。
同时他将你执行sql的传参也就是执行变量进行了通配,然后映射到你的model中。
Mybatis大概的执行过程:
通过factory方法获取sqlsession----通过MapperProxy代理到dao--执行底层数据库操作,
简单说就是跟楼上说的“据经过controller 再经过service 然后执行service中的相关方法并关联到mapper 再执行mapper.xml中的sql语句===
我们以JDBC为例看看他们的区别:
JDBC:
(1) 加载JDBC驱动,建立并获取数据库连接 ,创建statement对象(2) 设置SQL语句的传入参数(3) 执行SQL语句并获得查询结果(4) 对查询结果进行转换处理并将处理结果返回(5) 释放资源Mybatis:1:使用连接池,datasource,在驱动并连接的这个过程中优化并解耦JDBC第一步其实从效率角度来看是不合适的,因为无论什么数据库都不可能支撑随机和庞大的连接数,而且不可避免的存在连接浪费的情况,Mybatis就封装了这些优化的方法。2:统一sql存取到XML如果代码写在java块中,在团队合作中很可能出现两个交叉业务的代码使用类似的sql语句,而开发人员的工作本身没有交集,那就代表sql语句肯定是无法复用的。而且对sql的修改,就代表着对java文件的修改,需要重新编译和打包部署(比如常见的状态值更改,sql修改随着业务变化必然存在修改)。mybatis将sql统一存取到xml中,就算存在业务交叉,但因为统一配置的缘故,sql在xml中一目了然,两个跨team的程序员可以看到对方的sql,来判断自己是否需要重用。并且使用xml配置可以减少代码编译。还有就是在java中拼写长sql太恶心了。3:参数和结果集映射sql的方式需要传入参数,如果存在多条件“或类型”的查询(列表查询的查询条件允许空),那就代表你必须传参进行sql拼接,就算使用xml的方式也不行。要么每个业务独立配置xml中的sql,要么还是写入java代码中,或者以工具的方式进行自动拼接。Mybatis使用映射的方式,方便model管理参数,同时以解析器的方式将参数动态拼接到sql(sqlmaper里那些标签),由于是model映射,连查询结果都可以统一映射,方便取出和运算。而且mybatis对查询结果集进行了缓存处理,使得重复查询进一步进行了优化。4:对多重复sql进行复用封装比如模板方法,将常用sql模块化,直接调用。比如通用的save和getID之类的,只有表名和字段名有变化。
相关文章推荐
- Mybatis实现原理/工作流程
- mybatis工作机制和原理
- SSM框架day02-MyBatis——014 DB连接池工作原理分析、015详解主配置文件-为类指定别名、016详解主配置文件-运行环境配置
- Hibernate工作原理及为什么要用?
- ARM MMU工作原理剖析
- 调试器工作原理(1):基础篇
- mybatis之入门到开发(一)之基础原理概念+入门小程序
- JAVAWEB开发之SpringMVC详解(一)——SpringMVC的框架原理、架构简介、与mybatis整合和注解方式的使用、
- 连接池工作原理
- html解析器工作原理
- 通过源码分析MyBatis的缓存/Mybatis解析动态sql原理分析
- 浅析 Linux 中的时间编程和实现原理四——Linux 内核的工作二
- 第八章、Tiny4412 U-BOOT移植八 SDRAM工作时序与原理
- 工作笔记(四): Spring ORM之JdbcTemplate,Spring-mybatis,Spring-hibernate (注解)
- Web服务器工作原理概述
- GC工作原理学习(1)
- scrapy-redis(五):scrapy中信号工作的原理
- mybatis连接池原理
- Mybatis插件原理
- struts2核心工作流程与原理