mybatis

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值