MyBatis小总结

什么是mybatis?

mybatis是一个半ORM框架,它内部封装了JDBC,开发时只需关注sql语句本身,不要花时间去加载驱动,创建连接,创建statement等繁杂的过程。可以通过xml或注解来配置和映射原生信息,将pojo映射成数据库的记录,避免几乎所有的jdbc代码和手动设置参数及获取结果集。

有啥优点

1.能与spring很好的集成

2.封装了jdbc,能与各种数据库兼容。

3.基于sql语句编程,只需要关注sql编写,sql语句写在xml文件中,与代码隔离开来,便于维护。提供了xml标签(trim,foreach,where,if,choose等),支持编写动态sql语句,并可以重用。

缺点呢

1.sql编写的工作量较大,对开发人员编写sql语句的功底有一定要求

2.sql语句依赖于数据库,数据库移植性差

#{}和${}区别

#是预编译处理,会将sql中的参数替换为?,然后通过PreparedStatement的set方法来赋值。

$是直接替换,会有sql注入的风险。

DAO接口的工作原理

Dao接口就是Mapper接口,接口的全限名,就是映射文件中的namespace的值;接口的方法名就是xml文件中statement的id。接口方法里面的参数就是传给sql的参数。        

mapper接口是没有实现类的,当调用接口方法时,接口名+方法名作为key值,可唯一定位一个mapperstatement。在mybatis中每一个<select><insert><update><delete>标签,都会被解析为一个mapperstatement对象。

mapper接口中的方法不能被重载,因为使用接口名+方法名寻找策略。mapper的接口原理是jdk动态代理 ,mybatis运行时会使用jdk动态代理为mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行mapperstatement所对应的sql,然后将执行结果返回。

Mybatis 分页插件

我用的是MyBatis-Plus中分页插件IPage

Mybatis映射形式

1.通过<resultMap>标签,定义数据库列名和对象属性名之间的映射关系

2.通过sql的别名功能

mapper中如何传递多个参数

1.DAO层的参数,xml中通过#{0},#{1}代表第一和第二个参数

2.使用@Param注解命名,在xml中通过#{参数名}获取

3.封装成map或vo对象

一对一,一对多关联

association 一对一关联查询

collection 一对多关联查询

Mybatis延迟加载

mybatis仅支持association,collection关联对象的延迟加载。是否启动延迟加载通过lazyLoadingEnabled=true/false.

原理:通过cglib创建目标对象的代理对象,当调用目标方法时进入拦截器方法,如getUser(),拦截器的invoke方法发现user是null的时候,会拿先前保存的查询user的sql去把数据查询出来。

Mybatis的缓存机制

一级缓存:范围sqlsession.

每个sqlsession中持有Executor,当用户发起查询时,Mybatis根据当前执行的语句生成MappedStatement,在local Cache进行查询。

二级缓存:范围namespace

二级缓存会使用CachingExecutor装饰Exceutor,进行一级缓存的查询前,先在CachingExecutor进行二级缓存的查询。

1.MyBatis 的二级缓存相对于一级缓存来说,实现了 SqlSession 之间缓存数据的共享,同时粒度
更加细,能够到 namespace 级别,通过 Cache 接口实现类不同的组合,对 Cache 的可控性
也更强。
2. MyBatis 在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用二级缓存的条件
比较苛刻。
3. 在分布式环境下,由于默认的 MyBatis Cache 实现都是基于本地的,分布式环境下必然会出现
读取到脏数据,需要使用集中式缓存将 MyBatis 的 Cache 接口实现,有一定的开发成本,直
接使用 Redis、Memcached 等分布式缓存可能成本更低,安全性也更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值