《MyBatis从入门到精通》读书笔记

书只有300页,2天就快看完了。第二遍看,还是会发现一些之前没有注意到的点,总结一下。

1.之前只知道spring aop中用到了动态代理,实际上mybatis中也有用到。

mapper接口没有实现类却能正常调用,就是使用的动态代理。

当调用一个接口的方法时,会先通过接口的全限定名称和当前调用的方法名的组合得到一个方法 id,这个 id 的值就是映射 XML 中namespace 和具体方法 id 的组合。
所以可以在代理方法中使用 sqlSession 以命名空间的方式调用方法。通过这种方式可以将接口和 XML 文件中的方法关联起来。这种代理方式和常规代理的不同之处在于,

这里没有对某个具体类进行代理,而是通过代理转化成了对其他代码的调用。

2.处理N+1问题

这个好像之前参加校招的时候有被问到过。

比如有个系统,他有一个权限控制机制。每个用户有N个角色,角色有对应的权限。如果我们写的是嵌套查询,也就是查询出用户之后,会执行N次查询,查询这个用户所有的角色信息。在这个例子中 ,是否一定会用到角色呢?如果查询出来并没有使用,那不就白白浪费了一次查询吗?

这就就会出现 N+1 问题 ,主 SQL 会 查询一次,查询出 N 条结果,这 N 条结果 要各自执行一次查询,那就需要进行 N 次查询。

可以使用mybatis中的延迟加载解决这个问题。

配置fetchType,aggressiveLazyLoading。只有当调用 getRole ()方法获取 role 的时候, MyBatis 才会执行嵌套查询去获取数据。



猜你喜欢

转载自blog.csdn.net/daimingyang123/article/details/80154031