赞
踩
1. mybatis优缺点
优点:
1)解耦:sql单独编写,不会对程序设计产生影响,解除sql与程序代码耦合
2)简洁:与jdbc相比去除大量冗余代码,不需要手动关闭连接
3)兼容:很好的与各种数据库兼容(使用jdbc,只要jdbc支持的数据库mybatis都支持)
4)集成:很好与spring集成
5)ORM:提供映射标签,支持对象与数据库的ORM字段关系映射,实现基于对象编程
缺点:
1)sql多:sql语句编写工作量大,尤其当字段多、关联表多时,对开发人员编写sql语句功底有一定要求
2)sql依赖数据库,导致数据库移植性差
2. #{}和${}的区别
1)性质:#{}是占位符,在编译时会被替换为?;${}是字符拼接,是拼接符
2)作用:使用#可以有效防止sql注入,提高系统安全
3. mybatis原理
3.1) 解析配置文件
解析mybatis配置文件,返回configuration
其中常见配置有:
1)propertis:定义数据库连接信息、配置文件路径 其中configuration(java对象配置)>外部配置>xml配置
2)typeAliases:设置别名
3)plugins:自定义插件
4)mappers:配置映射关系
3.2 解析mapper文件
mapper文件中一条条sql语句封装为mapperStatement,将其存入configuration的mapperstatements缓存中,key由namespace+statementId构成
3.3 执行sql
sql通过sqlsession执行,sqlsession是mybatis与数据库交互的顶层类,通常与threadlocal绑定,一次会话使用一个sqlsession
sqlsession包含两个重要属性:configuration和executor,其中configuration由前期解析配置文件获得,executor是sql的执行器
sqlsession首先通过statementId(namespace+id)从configuration的缓存中mapperstament,然后委派给executor执行
executor执行是通过多个handler处理
typehander:1)将java类型转换为jdbc类型 2)将查询结果的jdbc类型转换为java类型
resultsethanlder:处理返回的结果集合转化为list
最后执行sql,使用jdbc的preparedstatement
3.3 mapper接口方式
1)扫描mapper文件和接口,生成mapperproxyfactory(代理工厂),将其维护到mapperregistry,以mapper接口为key
2)执行mapper接口方法实际是执行mapperproxy的invoke方法,invoke方法根据sql类型(select、update...)调用sqlsession执行
4. mybatis缓存
二级缓存>一级缓存>数据库
4.1 一级缓存:sqlsesion级别,默认开启,查询时先查询缓存,如果没有再查询数据库;如果做增删改时则会清空缓存
1)缓存的key为stamentId+分页信息(rowBounds)+执行sql(boundSql),缓存value为查询的结果
2)每个sqlsession都会存放一个perpetualCache,perpetualCache内部有map用于缓存
4.2 二级缓存
mapper级别(namespace),二级缓存需要手动打开(配置文件和mapper文件),自带的二级缓存底层还是使用perpetualCache
查询时先查询二级缓存,然后将一级缓存,最后数据库
从数据库返回数据时,先将数据缓存到一级缓存,然后数据缓存到transactionCacheManager(tcm),一个tcm对应一个mapper,tcm中存在缓存对象transactionalCaches,维护一系列transactionalCache,从数据库查询的数据先缓存到transactionalCache,等到sqlsession提交或者关闭的时候,会将transactionalCache刷新到tcm中
这就是为何得commit或者close二级缓存才生效,原理是直接放到tcm中会出现线程不安全(自带实现使用map),脏读问题(读到未提交数据)
在进行增删改时会清空缓存
应用:二级缓存适用于查多改少的情况,因为一旦数据变更,就会清空缓存
ps:一级缓存线程安全,因为和spring整合,一个线程对应一个sqlsession
分布式缓存:可以使用redis作为mybatis的二级缓存
5. 插件
5.1 插件原理
mybatis在四大组件上提供了插件扩展机制
四大组件分别为:
executor(执行器)
statementhandler(构造sql,完成预编译)
parameterHandler(对象与jdbc类型映射)
resultSetHandler(将jdbc结果处理成list)
这四大组件在创建时不是直接返回二十返回包装类,即在创建的时候通过遍历插件列表,将原生对象增强,返回对应的代理对象,底层使用jdk动态代理机制
5.2 使用方法
继承Interceptor,实现intercept(拦截方法),加注解配置拦截那个组件,最后将插件类配置到配置文件
6. spring整合mybatis原理
1)扫描mapper接口,将mapper的代理对象存到configuration
2)通过sqlsession拿到mapper代理对象,以factorybean的形式注册到spring容器,供后续调用,(当使用时beanName为mapper接口,但实际对象为factorybean的getObject,即mapper代理对象)
ps:需要使用依赖包mybatis-spring
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。